首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我使用mobx 5.15.7看到了奇怪的行为

MobX 是一个流行的状态管理库,用于简化 React 应用程序中的状态管理。MobX 5.15.7 是一个较旧的版本,可能会遇到一些已知的问题或行为异常。以下是一些可能导致奇怪行为的基础概念和相关解决方案:

基础概念

  1. Observable State(可观察状态)
    • MobX 使用可观察对象来跟踪状态的变化。
    • 当状态发生变化时,依赖该状态的组件会自动重新渲染。
  • Reactions(反应)
    • 自动执行的副作用,当可观察对象发生变化时触发。
  • Actions(动作)
    • 用于修改可观察状态的函数。
    • 在 MobX 中,动作应该是同步的,以确保状态的一致性。

可能的原因和解决方案

1. 异步操作问题

  • 原因:在 MobX 5 中,异步操作可能会导致状态更新不一致,因为 MobX 5 不支持在异步操作中直接修改状态。
  • 解决方案
  • 解决方案

2. 组件未正确响应状态变化

  • 原因:组件可能没有正确地使用 observer 装饰器或 makeObservable 方法。
  • 解决方案
  • 解决方案

3. 状态更新顺序问题

  • 原因:多个动作同时修改状态可能导致不可预测的行为。
  • 解决方案
  • 解决方案

4. 内存泄漏问题

  • 原因:长时间运行的应用程序可能会导致内存泄漏,特别是在使用大量反应时。
  • 解决方案
  • 解决方案

应用场景

  • 单页应用程序(SPA):MobX 非常适合管理复杂的状态逻辑,特别是在大型单页应用程序中。
  • 实时数据更新:通过反应机制,可以轻松实现实时数据更新和副作用处理。

推荐升级

由于 MobX 5.15.7 是一个较旧的版本,建议升级到最新版本的 MobX(如 MobX 6),以获得更好的性能和更多的功能改进。

代码语言:txt
复制
npm install mobx@latest mobx-react@latest

示例代码

代码语言:txt
复制
import { observable, action, makeObservable } from 'mobx';
import { observer } from 'mobx-react';

class Store {
  count = 0;

  constructor() {
    makeObservable(this, {
      count: observable,
      increment: action,
      decrement: action,
    });
  }

  increment() {
    this.count++;
  }

  decrement() {
    this.count--;
  }
}

const store = new Store();

@observer
class Counter extends React.Component {
  render() {
    return (
      <div>
        <button onClick={() => store.increment()}>Increment</button>
        <button onClick={() => store.decrement()}>Decrement</button>
        <div>Count: {store.count}</div>
      </div>
    );
  }
}

通过以上方法,您可以更好地理解和解决在使用 MobX 5.15.7 时遇到的奇怪行为。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

前端:从状态管理到有限状态机的思考

或许我不会主动去使用Vuex, Redux,但我们编写每一个组件的时候就已经在管理状态,Vuex, Redux只是更方便我们进行全局的状态管理。 为什么一定会使用状态管理?...就我个人的看法,状态机思想非常适合状态转移相对线形的场景,在某些状态多循环的场景转移会相对复杂些 c....可响应式的状态管理器:Mobx mobx是一种响应式的状态管理,他所提倡的是拆分store做数据管理。这就很适合做局部的状态管理,根据局部状态管理来更新全局状态。...思考如何解决这个问题的时,偶然看到了有限状态机相关文章,思考到应用的功能模块在某一个时刻是相互独立的,我们在局部将数据进行更新,之后用一个全局函数对数据进行统一替换。...但使用第三方工具造成包体积大小的增加,是否会增加性能消耗有待讨论 参考资料 可视化工具: xstate.js.org/viz/ mobx中文文档: cn.mobx.js.org/ Xstate文档: xstate.js.org

2.5K41

2023年了,我还是选择 MobX

强调数据不可变性、行为无副作用 机制 封装、继承、多态等 高阶函数、闭包、柯里化、递归等 抽象能力实现 对象之间的交互、引用 函数组合 OK,我觉得文章都让 ChatGPT 来写好了,继续问:分别举一些面向对象和函数式擅长的场景...按照「正统」的面向对象思想,对象是充血的,有血(数据)有肉(行为)的对象。DDD 中也是鼓励使用充血模型。 在前端领域, 面向对象范式在很多场景也有很大的优势: 游戏开发。...如果想要在 MobX 上实现时间旅行,建议使用 MobX-state-tree ---- 另一种时间旅行是满足业务上的需求,比如实现撤销/重做,甚至多人协作。...关于 SSR 的支持,由于篇幅有限,这里就不展开了 MobX in Vue 尽管 MobX 也提供了 Vue 绑定,但是总觉得奇奇怪怪的,实际上也很少人这么用。...再复杂的,可以使用与视图框架心智模型相近的方案,比如 Vue + Pinia,React + Hox? 本文的标题是我选择 MobX 的原因,并不代表我推荐你无脑地使用它。

52630
  • 简洁的 React 状态管理库 - Stamen

    本文作者:IMWeb forsigner 原文出处:IMWeb社区 未经同意,禁止转载 说到 React 状态管理,必提的肯定是 Redux 与 MobX,2018 年快过去了,它们依然是最火热的状态管理工具...,也有一些基于 Redux 的,如 dva、rematch 等,也有新的,如 mobx-state-tree,这里不对各个解决方案作评价。...还有各种多如牛毛的 Api。 我只是想早点码完页面下班,早点下班健身、陪妹子......有一天,我看到了 mobx 作者的 immer, 我感觉使用 immer, 可以实现一个我理想中的状态管理工具,所以就造了一个轮子,叫 stamen, 他有什么特点呢,Show you the code...如果有什么核心特点的话,那应该是 "简洁",这里指的是使用者写代码时简洁,可以专注于业务,而不是自身源代码简洁,把问题留给使用者。

    1K30

    Hooks 邂逅 MobX ,代码变得更丝滑了!

    还有些朋友想要使用 React Hooks 来重构升级部分业务,或者封装优化一些通用的业务组件,来提升项目的可扩展性,但是却困于不知如何 在 Hooks 中继续使用Mobx 这一状态管理库了,使用过程中感觉畏手畏脚奇奇怪怪的...其实吧,Mobx 作为当下炙手可热的状态管理库,很早就推出了 v6 版本,紧跟技术潮流,极大的方便了我们在 Hooks 环境下,更好的对 React 进行状态管理。我想这也是它炙手可热的原因之一吧!...Hooks很强大,为何还需要Mobx? 不可否认,Hooks很强大,而且我认为,尤大大的 Vue3 很大程度上也参考了 React Hooks 的实现,虽然两者实现存在差异,但是思想是可以借鉴的。...(仅代表个人观点,望各位大佬不想吐槽我) 但是呢,在实际开发过程中,纯粹使用Hooks 的话,还是会遇到一些问题: 依赖传染性 —— 这导致了开发复杂性的提高、可维护性的降低 缓存雪崩 —— 这导致运行性能的降低...也可以配合 Hooks 丝滑使用,好像最新版本的 Mobx 更加推荐这种方式。

    1.4K10

    MobX 背后的基础原理

    在开发 MobX 之前,我花了好些个工夫研究开发者如何看待现有的库。...像 Meteor、Knockout、Angular、Ember 和 Vue 这样的框架都显露了与 MobX 类似的反应式行为,且都已经存在很久了。那为什么我要建立 MobX 呢?...更酷的是,如果在事务结束之前使用了一个计算值,MobX 将会保证你得到一个更新后的值! 实际上几乎没人明确的使用事务,在 MobX 3 中,事务甚至被弃用了。因为 action 自动应用了事务。...对于计算值,MobX 可以感知它们是否在某处被使用。这意味着计算值可以被自动延迟并被垃圾回收。这节省了大量的引用,并对性能有显著的积极影响。 计算值被强制执行为无副作用的。...可以轻易的在 MobX 问题追踪器中找出一些无意间将对象转为可观察对象引起的非预期行为的问题。

    1.6K10

    从小学数学聊前端框架设计

    0/{x}/{y}; 再加上各种使用户可以操纵自变量的事件,如给p增加onClick: setX(x + 1)}>我的战绩是 0/{x}/{y};...使用Hooks的函数组件与Class组件最大的区别是: 从拥有「生命周期的实例」向「自变量、因变量与视图的映射关系」转变 如果接受了这个设定,想想现在主流的学习Hooks的方式(甚至React官网也是如此...我用两个比喻来解释。...净整些奇怪的 社区早有人意识到这个问题,于是Mobx诞生了。他带来纯粹的「细粒度」更新能力。 然而,这个能力是建立在React更新机制之上,就像: 一个画家,拿画笔在画板上一戳,戳到什么呢?...所以有人吐槽:用React+Mobx为啥不直接用Vue? 然而,Vue本身也依赖虚拟DOM,粒度并不是最细的。 更准确的说法应该是:用React+Mobx为啥不直接用SolidJS?

    52120

    ReduxMobxAkitaVuex对比 - 选择更适合低代码场景的状态管理方案

    Facebook 提供了一个 Flux 实现,不过目前很少有开发者直接使用它,而是使用一些在 Flux 架构模式基础上的改进方案,最广泛的就是 Redux。...在此背景之下,再去理解Mobx中的三个核心概念: State - 状态,顾名思义就是应用程序使用的状态数据,在 Mobx 中,state 是一种 Observable 对象; Actions -...Mobx中的 action 与 Redux 和 Vuex 中的 action 都不同,Redux 的action 是行为的描述对象,并不会改变 state;Vuex 中的 action 是可选的,一般是用来执行异步操作...搭配使用一些社区解决方案,Mobx的以上缺点可以得到一定程度上的弥补。 有很多开发者认为 Redux更适合复杂的大型应用,Mobx 适合数据流相对简单的应用。这其实并不绝对。...Query 搭配 Entity Store 使用,有更丰富的 API。

    2K11

    为啥Flutter Hooks没有受到太多关注和青睐?

    我很奇怪为什么会是这个样子,毕竟它真的很好用!...什么是 Hooks,它又是从何而来的?总不会是无名氏发明的吧? 其实 Hooks 最初是源于 React,但这里我并不会谈什么 React,因为我没用过它,以后也应该不会用的。...这里我的总结是:“ Hooks 是 UI 逻辑的管理者 ”。 接下来我会介绍自己在应用中使用最多的 Hooks,及其有状态小部件的等效形式,方便你对比两者并理解前者带来的实际收益。...由于 Hook 函数非常易于使用,因此我不需要将其作为一个类来实现,不过这里还是展示一下具体的做法。...我喜欢 Hooks,并在我的所有项目中都使用它。我通常将它与 Provider 和 MobX 结合使用。 你可以在 pub 上找到 Hooks,附带的文档都很完善。

    1.2K20

    React 进阶 - React Mobx

    ,可以称之为 ObserverValue 有了观察者,那么就需要向观察者中收集 listener ,mobx 中有一个 Reaction 模块,可以对一些行为做依赖收集,在 React 中,是通过劫持...render 函数执行行为,进行的依赖收集 如何监听改变,用自定义存取器属性中的 get 和 set ,来进行的依赖收集和更新派发,当状态改变,观察者会直接精确通知每个 listener # 状态提升...在正常情况下,在 React 应用中使用 Mobx ,本质上 mobx 里面的状态,并不是存在 React 组件里面的,是在外部由一个个 mobx 的模块 model 构成,每一个 model 可以理解成一个对象...ObserverValue 对于外层 Root ,在 constructor 使用 makeObservable ,mobx 会默认给最外层的 Root 添加 ObservableAdministration...# Mobx 基本使用 # mobx 常用 API 把上述每一个 class 称之为一个模块,如上述 Root 就是一个模块。mobx 的 api 基本用于构建每一个响应式模块。

    88011

    React组件设计实践总结05 - 状态管理

    例如: 简单的使用 Context API 来做状态管理: image.png 最近 hooks 用得比较爽(参考上一篇文章: 组件的思维),我就想配合 Context API 做一个状态管理器,..., 我只能尝试解释一下我对分形的理解: 前面文章也提到过‘分离逻辑和视图’和‘分离容器组件和展示组件’,这两个规则都来自于 Redux 的最佳实践。...我为什么从 Redux 迁移到了 Mobx Mobx 与 Redux 的性能对比 总结 本节主要介绍的 Redux 设计的动机,以及围绕着这个动机一系列设计, 再介绍了 Redux 的一些缺点和最佳实践...对于复杂的领域对象,会抽取为单独的类,比如前面例子中的Todo类, 抽取为类的好处是它具有封装性,可以包含关联的行为、定义和其他对象的关联关系,相比纯对象表达能力更强....相对 Redux 多余的模板代码而言 数据封装性。使用类表达的数据结构可以封装相应的行为 问题 在多个 Store 之间共享数据比较麻烦.

    2.2K31

    MobX学习之旅

    MobX官方推荐与React搭配使用,来存储和更新应用状态,所以最好搭配mobx-react中间件使用: 原理: 1、React的render是将存储的状态转化为树状结构来渲染组件的方法; Mobx...是用来存储和更新状态的工具; 2、React使用的方法是采用虚拟Dom来进行view视图的缓存,来减少繁琐的Dom更新 而Mobx则通过一个虚拟的状态依赖图表来让react组件和应用状态同步化来减少不必要的状态来更新组件的...Map 4、object(有自身的原型对象):这种情况需要使用observable.box(value)来管理这样的值 通过box这个箱子来存这些值,并使用.get()用来获取当前值,采用.set(...,那就使用autorun,但是一般这种情况比较少 Action 比起官方说的“动作”,我更愿意称为是“行为”,mobx的action吸收了redux和vuex的数据处理的复杂逻辑 用来修改状态,不同于Computed...'; onError((error) => { consol.log(error); }) 五、MobX源码解读 六、MobX使用注意 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn

    1.4K20

    带你走进Flutter_Mobx

    Flutter 的状态管理框架很多,笔者个人使用起来比较舒适的是 flutter_mobx,使用了不短的时间,最近抽时间了解了一下 flutter_mobx 的实现。今天在这里分享一下。...如果你还不熟悉 flutter_mobx 的使用,可以参考它的文档:https://pub.dev/packages/flutter_mobx,也可以参考我之前写的一篇文章: Flutter与Mobx...我们看最经常使用的 counter 计数 demo 的 mobx 实现,我们的代码里会有一个 counter 变量表示计数: 数据写入和响应 @observable int counter; @observable...在 enforceWitePolicy中,会检查是否有在计算中去观察变量的行为,有的话会报错。...可以理解成是观察者 Atom 具体被观察的变量 image.png flutter_mobx flutter_mobx 提供了一个 Observer 组件,在这个组件里面使用 Store 里面的被观察对象

    73010

    用故事解读 MobX 源码(一)autorun

    接下来将会贴 MobX 源码相关的代码,稍显枯燥,我只能尽量用通俗易懂的话来分析讲解。 先罗列本文故事中人物与 MobX 源码概念映射关系: ? ?...注:本文暂时先不分析 mobx.observable 的源码,留待后续专门的一章来分析;迫不及待的读者,可以先阅读网上其他源码文章,比如:Mobx 源码解读(二) Observable 观察员有两个非常重要的行为特征...”使用 autorun 时,所提供的函数总是立即被触发一次“ 话了。...所以 MobX 就将任务的执行笼罩在自己所营造的氛围中,改变不了任务实体,我改变环境总行了吧?!!...,由于涉及到探长、观察员两个维度的数组,朴素算法的时间复杂度将是 O(n^2),而 MobX 中使用 3 次遍历 + diffValue 属性的辅助将复杂度降到了 O(n)。

    46320

    用故事解读 MobX 源码(一)autorun

    接下来将会贴 MobX 源码相关的代码,稍显枯燥,我只能尽量用通俗易懂的话来分析讲解。 先罗列本文故事中人物与 MobX 源码概念映射关系: ? ?...注:本文暂时先不分析 mobx.observable 的源码,留待后续专门的一章来分析;迫不及待的读者,可以先阅读网上其他源码文章,比如:Mobx 源码解读(二) Observable 观察员有两个非常重要的行为特征...”使用 autorun 时,所提供的函数总是立即被触发一次“ 话了。...所以 MobX 就将任务的执行笼罩在自己所营造的氛围中,改变不了任务实体,我改变环境总行了吧?!!...,由于涉及到探长、观察员两个维度的数组,朴素算法的时间复杂度将是 O(n^2),而 MobX 中使用 3 次遍历 + diffValue 属性的辅助将复杂度降到了 O(n)。

    1K10

    【MobX】MobX 简单入门教程

    而MobX提供机制来存储和更新应用状态供 React 使用。 Mobx 工作流程 这里先了解下大概整理流程,接下来会结合代码,介绍每一个部分。...[2019102303.png] 本文概要 本文使用的是 MobX 5 版本,主要将从以下几个方面介绍 MobX 的使用: 配置 Webpack 的 MobX 开发环境 MobX 常用 API 介绍(主要介绍与可观察数据相关的操作...MobX 也提供使用装饰器 @observable 来将其转换成可观察的,可以使用在实例的字段和属性上。...autorun 的作用是在可观察数据被修改之后,自动去执行依赖可观察数据的行为,这个行为一直就是传入 autorun 的函数。...3.1 (@)action action 是修改任何状态的行为,使用 action 的好处是能将多次修改可观察状态合并成一次,从而减少触发 autorun 或者 reaction 的次数。

    1.5K00

    【MobX】390- MobX 入门教程(上)

    而MobX提供机制来存储和更新应用状态供 React 使用。 ” Mobx 工作流程 这里先了解下大概整理流程,接下来会结合代码,介绍每一个部分。 ?...2019102303.png 本文概要 本文使用的是 MobX 5 版本,主要将从以下几个方面介绍 MobX 的使用: 配置 Webpack 的 MobX 开发环境 MobX 常用 API 介绍(主要介绍与可观察数据相关的操作...MobX 也提供使用装饰器 @observable 来将其转换成可观察的,可以使用在实例的字段和属性上。...classProperty() { return expression; } @computed get classProperty() { return expression; } 还有各种选项可以控制 computed 的行为...autorun 的作用是在可观察数据被修改之后,自动去执行依赖可观察数据的行为,这个行为一直就是传入 autorun 的函数。

    83220

    用故事解读 MobX源码(五) Observable

    这其实是 MobX 构建起的一套 ”镜像“ 系统,使用者仍旧按平时的方式读写对象,然而每个属性的读写操作实则都镜像到观察局 的某个小组具体的操作;非常类似于古代的 ”垂帘听政“ ,看似皇帝坐在文武百官前面...将与 observable 的源码 相关的源码稍微整理,就是如下的形式: var observable = createObservable; // 使用“奇怪”的方式来扩展 observable 函数的功能...observable方法其实是适配器 这里我大致划分了一下,分成 4 部分内容来理解: 第一部分:createObservable 方法刚才粗略讲过,是 MobX API 的 observable 的别名...接下来就是去理解 ObservableValue 相比 Atom 多出来的属性和方法,我这里并不会全讲,太枯燥了。...为什么要添加 $mobx 属性?其具体作用又是什么? 通过阅读源码,我无从获知作者添加 $mobx 属性的理由,但可以知道 $mobx 的作用是什么。

    84520

    【MobX】391- MobX 入门教程(下)

    三、MobX 常用 API 介绍 3. 修改可观察数据 在上一部分内容中,我们了解到,对可观察的数据做出反应的时候,需要我们手动修改可观察数据的值。...多数情况下,这种高频的触发是完全没有必要的。 比如用户对视图的一次点击操作需要很多修改 N 个状态变量,但是视图的更新只需要一次就够了。 为了优化这个问题, MobX 引入了 action 。...3.1 (@)action action 是修改任何状态的行为,使用 action 的好处是能将多次修改可观察状态合并成一次,从而减少触发 autorun 或者 reaction 的次数。...2019102301.png 在这个案例中,我们引用 mobx-react 库来实现,很明显可以看出 mobx-react 是作为 mobx 和 react 之前的桥梁。...@observer 在需要根据数据变换,而改变UI的组件去引用,另外建议有使用到相关数据的类都引用。

    89820

    用故事解读 MobX 源码(二)computed

    会计师计算逻辑图 你会发现历史总是惊人的相似,新增的会计师执行计算任务的逻辑其实 探长 执行任务的逻辑是一样的,下图中我特意用 相同的序号(不同的颜色形状)标示 出,序号所对应含义如下: 设置成 正在执勤人员...会计师这种拖延到 只有被需要的时候才进行计算 的行为,有没有让你回忆起学生时代寒假结束前一天疯狂补作业的场景? ?...“ 执行官 MobX 稍作停顿,继续道,”为了更好地阐述这套运行方案的性能优化机制,我明天呈上一份报告,好让您得以全面了解。“ ”Good Job!期待你的报告“。...没错,探长和会计师调用的就是同一个方法,所以他们在执行任务的时候,行为痕迹是一样的,没毛病。 ?...3、其他说明 本文为了方便说明,所以单独使用 mobx.computed 方法定义计算值,平时使用中更多则是直接应用在 对象中属性 上,使用 get 语法: var bankUser = mobx.observable

    48521

    React+Mobx写法更像Vue了

    Mobx是一个功能强大,上手非常容易的状态管理工具。就连redux的作者也曾经向大家推荐过它,在不少情况下你的确可以使用Mobx来替代掉redux。...action,runInAction和严格模式(useStrict) mobx推荐将修改被观测变量的行为放在action中。...勇于动手的你也许会发现,就算我把@action去掉,程序还是可以运行呀。...先设想一个最简单的场景,页面上有个数字0和一个按钮。点击按钮我要让这个数字增加1,就让我们要用Mobx来处理这个试试。...之后我们实例化一个对象,叫做newState,之后在我的React组件中,我只需要用@observer修饰一下组件类,便可以愉悦地使用这个newState对象中的值和函数了。

    1.7K20
    领券