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

相关推荐
We་ct18 小时前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
qq_4061761418 小时前
深入浅出 Pinia:Vue3 时代的状态管理新选择
javascript·vue.js·ecmascript
wefly201718 小时前
m3u8live.cn 在线M3U8播放器,免安装高效验流排错
前端·后端·python·音视频·前端开发工具
C澒19 小时前
微前端容器标准化 —— 公共能力篇:通用打印
前端·架构
德育处主任Pro19 小时前
前端元素转图片,dom-to-image-more入门教程
前端·javascript·vue.js
木斯佳19 小时前
前端八股文面经大全:小红书前端一二面OC(下)·(2026-03-17)·面经深度解析
前端·vue3·proxy·八股·响应式
陈天伟教授19 小时前
人工智能应用- 预测新冠病毒传染性:04. 中国:强力措施遏制疫情
前端·人工智能·安全·xss·csrf
叫我一声阿雷吧19 小时前
JS 入门通关手册(23):JS 异步编程:回调函数与异步本质
javascript·es6·前端面试·回调函数·回调地狱·js异步编程·异步本质
zayzy20 小时前
前端八股总结
开发语言·前端·javascript
今天减肥吗20 小时前
前端面试题
开发语言·前端·javascript