react 状态管理mobx中的行为模式

看一段代码

复制代码
import { configure } from "mobx"

configure({
  enforceActions: "never",  // 设置为 "never" 模式
})

这个是 store 中的配置

enforceActions 的三种模式

1. "never" (默认值)

复制代码
configure({
  enforceActions: "never",  // 不强制使用 action
})

// 在任何地方都可以直接修改状态
class Store {
  count = 0
  
  // 不需要用 action 包装
  increment() {
    this.count++  // 直接修改,不会有警告
  }
  
  // 甚至可以在组件中直接修改
  // store.count++  // 这样也可以
}

2. "always"

复制代码
configure({
  enforceActions: "always",  // 必须使用 action
})

class Store {
  count = 0
  
  // 必须用 action 包装
  increment = () => {
    this.count++  // 正确:在 action 中修改
  }
  
  // 如果直接修改会报错
  // store.count++  // 错误:不能在 action 外修改状态
}

3. "observed"

复制代码
configure({
  enforceActions: "observed",  // 只在被观察的状态上强制
})

// 只有被 observer 组件观察的状态才需要 action

实际影响

使用 "never"(你的配置)

javascript

复制代码
// 可以这样写
class CounterStore {
  count = 0
  
  // 普通方法
  increment() {
    this.count++  // 直接修改,没问题
  }
  
  // 异步操作
  async fetchData() {
    const data = await api.getData()
    this.data = data  // 直接赋值,没问题
  }
}

// 甚至在组件中也可以直接修改
const Counter = observer(() => {
  const { counterStore } = useStore()
  
  return (
    <button onClick={() => counterStore.count++}>  {/* 直接修改 */}
      {counterStore.count}
    </button>
  )
})

使用 "always"(严格模式)

javascript

复制代码
// 必须这样写
class CounterStore {
  count = 0
  
  // 必须用 action
  increment = () => {
    this.count++
  }
  
  // 异步操作也要用 action
  fetchData = async () => {
    const data = await api.getData()
    runInAction(() => {
      this.data = data  // 必须在 action 中修改
    })
  }
}

// 组件中不能直接修改
const Counter = observer(() => {
  const { counterStore } = useStore()
  
  return (
    <button onClick={counterStore.increment}>  {/* 必须调用 action */}
      {counterStore.count}
    </button>
  )
})

为什么你的项目用 "never"

优点

  • 开发方便:不用处处写 action

  • 代码简洁:直接修改状态

  • 学习成本低:适合初学者

缺点

  • 难以追踪状态变化:不知道哪里修改了状态

  • 调试困难:状态变化没有明确的入口

  • 不符合最佳实践

推荐做法

小型项目

javascript

复制代码
// 可以用 "never",开发快速
configure({
  enforceActions: "never",
})

中大型项目

javascript

复制代码
// 推荐用 "always",便于维护
configure({
  enforceActions: "always",
})

// 或者在开发环境用严格模式,生产环境用宽松模式
configure({
  enforceActions: process.env.NODE_ENV === "production" ? "never" : "always",
})

总结

你的配置 enforceActions: "never" 表示:

  • 不强制使用 action 来修改状态

  • 可以在任何地方直接修改状态

  • 开发更自由灵活 ,但不利于维护

这是一个权衡:开发效率 vs 代码质量。对于快速开发的小项目,用 "never" 是可以接受的!

相关推荐
l***O5201 小时前
前端路由历史监听,React与Vue实现
前端·vue.js·react.js
超级战斗鸡1 小时前
React 性能优化教程:useMemo 和 useCallback 的正确使用方式
前端·react.js·性能优化
bemyrunningdog1 小时前
创建 React 项目指南:Vite 与 Create React App 详
前端·react.js·前端框架
大雷神1 小时前
DevUI 实战教程:从零构建电商后台管理系统(完整版)
前端·javascript·华为·angular.js
come112341 小时前
现代前端技术栈关系详解 (PHP 开发者特供版)
开发语言·前端·php
合作小小程序员小小店1 小时前
web网页开发,在线%图书管理%系统,基于Idea,html,css,jQuery,java,ssm,mysql。
java·前端·后端·mysql·jdk·intellij-idea
E***q5391 小时前
JavaScript数据挖掘开发
开发语言·javascript·数据挖掘
滿1 小时前
vue3 elementplus el-table toggleRowSelection使用方法
javascript·vue.js·elementui
猪八戒1.02 小时前
onenet接口
开发语言·前端·javascript·嵌入式硬件