学习使用MST

214 阅读4分钟

MobX State Tree(MST)是一个用于构建可扩展和易于维护的应用程序的库。它提供了一种简单而强大的方式来定义数据模型和状态管理。在本文档中,我们将探讨如何使用MST来构建React应用程序的数据层。

安装

要使用MST,您需要先安装它。您可以使用npm或yarn来安装:

npm install mobx-state-tree

yarn add mobx-state-tree

定义一个模型

要使用MST,您需要先定义一个数据模型。数据模型是一个JavaScript对象,其中包含您希望跟踪的数据。以下是一个示例模型:

import { types } from 'mobx-state-tree';

const Todo = types .model({ id: types.identifier, title: types.string, completed: false }) .actions(self => ({ toggle() { self.completed = !self.completed; } }));

在这个示例中,我们定义了一个名为Todo的模型。它有三个属性:id,title和completed。id是一个特殊的属性,它用于唯一标识模型。我们还定义了一个toggle操作,用于切换completed属性的值。

创建一个根模型

一旦您定义了一个或多个模型,您需要将它们组合成一个根模型。根模型是您应用程序的数据入口点。以下是一个示例根模型:

import { types } from 'mobx-state-tree'; import { Todo } from './Todo';

const TodoStore = types .model({ todos: types.array(Todo) }) .actions(self => ({ add(todo) { self.todos.push(todo); } }));

export default TodoStore;

在这个示例中,我们定义了一个名为TodoStore的根模型。它有一个名为todos的属性,该属性是一个Todo模型的数组。我们还定义了一个add操作,用于将新的Todo添加到todos数组中。

创建一个状态树

一旦您定义了根模型,您需要将其实例化为一个状态树。状态树是一个由模型组成的树形结构,它包含您应用程序的所有数据。以下是一个示例状态树:

import { getSnapshot, applySnapshot } from 'mobx-state-tree'; import TodoStore from './TodoStore';

const initialState = { todos: [ { id: '1', title: 'Buy milk', completed: false }, { id: '2', title: 'Take out the trash', completed: true } ] };

const store = TodoStore.create(initialState);

console.log(getSnapshot(store));

applySnapshot(store, { todos: [ { id: '1', title: 'Buy milk', completed: true }, { id: '2', title: 'Take out the trash', completed: true } ] });

console.log(getSnapshot(store));

以下是mobx-state-tree的高阶用法:

计算属性

计算属性是一种从模型的属性中派生新值的方法。在MST中,您可以使用getters来创建计算属性。以下是一个示例模型,其中包含一个计算属性:

import { types } from 'mobx-state-tree' const User = types.model({ firstName: types.string, lastName: types.string, age: types.number }).views(self => ({ get fullName() { return <span class="hljs-subst">${self.firstName}</span> <span class="hljs-subst">${self.lastName}</span>; } }));

在这个示例中,我们定义了一个名为User的模型。它有三个属性:firstName,lastName和age。我们还定义了一个计算属性fullName,该属性将firstName和lastName组合成一个完整的姓名。

异步操作

在应用程序中,您经常需要执行异步操作,例如从服务器获取数据。在MST中,您可以使用actions来定义异步操作。以下是一个示例模型,其中包含一个异步操作:

import { types } from 'mobx-state-tree'; import axios from 'axios'; const User = types.model({ id: types.identifier, name: types.string, email: types.string }) .actions(self => ({ updateUser: async (data) => { try { const response = await axios.put(/users/<span class="hljs-subst">${self.id}</span>, data); self.name = response.data.name; self.email = response.data.email; } catch (error) { console.error(error); } } }));

在这个示例中,我们定义了一个名为User的模型。它有三个属性:id,name和email。我们还定义了一个名为updateUser的异步操作,它将使用axios库从服务器更新用户的名称和电子邮件。

派生

在MST中,您可以使用views来创建派生值。派生值是从模型属性中派生出的新值。以下是一个示例模型,其中包含一个派生值:

import { types } from 'mobx-state-tree'; const Todo = types .model({ id: types.identifier, title: types.string, completed: false }) .views(self => ({ get status() { return self.completed ? 'completed' : 'active'; } }));

在这个示例中,我们定义了一个名为Todo的模型。它有三个属性:id,title和completed。我们还定义了一个名为status的派生值,它将根据Todo的completed属性返回一个状态字符串。

链接模型

在MST中,您可以使用links来将两个模型链接在一起。链接模型是一种将一个模型的属性映射到另一个模型的方法。以下是一个示例模型,其中包含一个链接模型:

import { types } from 'mobx-state-tree'; const User = types.model({ id: types.identifier, name: types.string, email: types.string }); const Comment = types.model({ id: types.identifier, text: types.string, user: types.reference(User) }); const BlogPost = types .model({ id: types.identifier, title: types.string