MobX-State-Tree 入门教程:构建一个TODO应用

MobX-State-Tree 入门教程:构建一个TODO应用

mobx-state-tree Full-featured reactive state management without the boilerplate mobx-state-tree 项目地址: https://gitcode.com/gh_mirrors/mo/mobx-state-tree

前言

MobX-State-Tree(简称MST)是一个强大的状态管理库,它结合了可变数据的简单性和不可变数据的可追溯性,同时具备响应式数据的性能优势。本教程将通过构建一个TODO应用来介绍MST的核心概念和使用方法。

环境准备

在开始之前,确保你已经具备以下条件:

  1. 基本的React知识
  2. Node.js环境(如果选择本地开发)
  3. 对状态管理的基本理解(虽然不是必须的,但会有帮助)

本地开发环境搭建

推荐使用以下命令快速创建一个React项目:

npx create-react-app mst-todo
cd mst-todo
yarn add mobx mobx-react-lite mobx-state-tree
yarn start

MST核心概念

模型定义

MST的核心是"活树"概念,这棵树由受保护的、可变的对象组成,同时包含运行时类型信息。我们需要先定义模型来描述数据结构:

import { types } from "mobx-state-tree"

const Todo = types.model("Todo", {
  name: types.optional(types.string, ""),
  done: types.optional(types.boolean, false)
})

const User = types.model("User", {
  name: types.optional(types.string, "")
})

这里我们定义了两个模型:TodoUsertypes提供了多种类型校验器,确保数据完整性。

创建模型实例

定义模型后,可以通过.create()方法创建实例:

const todo = Todo.create({ name: "学习MST" })
const user = User.create({ name: "张三" })

如果传入的值不符合类型定义,MST会抛出错误,这有助于在开发早期发现问题。

组合模型

我们可以创建更复杂的根模型来组合其他模型:

const RootStore = types.model("RootStore", {
  users: types.map(User),
  todos: types.map(Todo)
})

const store = RootStore.create({
  users: {},
  todos: {}
})

types.map创建一个可观察的键值映射,非常适合存储实体集合。

操作和视图

定义操作

模型的行为通过actions定义:

const Todo = types.model("Todo", {
  name: types.optional(types.string, ""),
  done: types.optional(types.boolean, false)
}).actions(self => ({
  setName(newName) {
    self.name = newName
  },
  toggle() {
    self.done = !self.done
  }
}))

self参数代表模型实例本身,这种设计避免了this绑定问题。

计算属性

视图(View)用于定义计算属性:

const RootStore = types.model(...)
  .views(self => ({
    get pendingCount() {
      return Array.from(self.todos.values())
        .filter(todo => !todo.done).length
    }
  }))

计算属性会自动缓存,只有当依赖的数据变化时才会重新计算。

与React集成

基本集成

使用mobx-react-liteobserver将组件变为响应式:

import { observer } from "mobx-react-lite"

const TodoView = observer(({ todo }) => (
  <div>
    <input
      type="checkbox"
      checked={todo.done}
      onChange={todo.toggle}
    />
    <input
      type="text"
      value={todo.name}
      onChange={e => todo.setName(e.target.value)}
    />
  </div>
))

性能优化

细粒度的组件划分可以优化渲染性能:

const AppView = observer(({ store }) => (
  <div>
    {Array.from(store.todos.values()).map(todo => (
      <TodoView key={todo.id} todo={todo} />
    ))}
  </div>
))

这样只有变化的TODO项会重新渲染。

高级特性

快照和恢复

MST可以生成和恢复快照:

import { getSnapshot, applySnapshot } from "mobx-state-tree"

// 获取快照
const snapshot = getSnapshot(store)

// 恢复快照
applySnapshot(store, snapshot)

时间旅行

基于快照功能可以实现时间旅行:

const history = []
let current = -1

onSnapshot(store, snapshot => {
  if (current === history.length - 1) {
    current++
    history.push(snapshot)
  }
})

function undo() {
  if (current <= 0) return
  current--
  applySnapshot(store, history[current])
}

总结

通过本教程,我们学习了MST的核心概念:

  1. 使用types.model定义数据结构
  2. 通过actions修改状态
  3. 使用views定义计算属性
  4. 与React组件集成
  5. 快照和时间旅行功能

MST提供了强大的类型安全和状态管理能力,特别适合中大型应用开发。它的响应式系统确保了高效的UI更新,而不可变快照则简化了调试和测试。

下一步,你可以探索MST的更多高级特性,如引用、标识、异步操作等,以构建更复杂的应用。

mobx-state-tree Full-featured reactive state management without the boilerplate mobx-state-tree 项目地址: https://gitcode.com/gh_mirrors/mo/mobx-state-tree

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范垣楠Rhoda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值