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" 是可以接受的!

相关推荐
老前端的功夫4 小时前
Vue 3 性能深度解析:从架构革新到运行时的全面优化
javascript·vue.js·架构
天天扭码4 小时前
如何实现流式输出?一篇文章手把手教你!
前端·aigc·ai编程
前端 贾公子5 小时前
vue移动端适配方案 === postcss-px-to-viewport
前端·javascript·html
GISer_Jing6 小时前
AI营销增长:4大核心能力+前端落地指南
前端·javascript·人工智能
明远湖之鱼6 小时前
一种基于 Service Worker 的渐进式渲染方案的基本原理
前端
前端小端长7 小时前
Vue 中 keep-alive 组件的原理与实践详解
前端·vue.js·spring
FeelTouch Labs7 小时前
Nginx核心架构设计
运维·前端·nginx
雪球工程师团队7 小时前
别再“苦力”写后台,Spec Coding “跑” 起来
前端·ai编程
m0_471199637 小时前
【场景】前端怎么解决离线收银、数据同步异常等场景问题
前端·javascript