MobX 中 runInAction 的威力:构建原子性状态更新

"原子性状态更新"这个词可以很好地概括 runInAction 的核心功能,即将一组相关的状态更新作为一个整体,要么全部成功,要么全部失败。这种特性对于复杂的异步操作和状态管理非常重要。可以帮助我们构建更加可靠和可预测的 React 应用程序。

在这里插入图片描述

怎么理解原子性操作

"原子性操作"是一个非常重要的概念,它描述了一组操作要么全部成功,要么全部失败,中间不会出现部分成功的情况。这样可以确保系统的一致性和完整性。

在MobX中,使用runInAction包裹状态更新操作(把一组状态放在一起包起来),就是为了确保这些操作是原子性的。下面来看2个例子。

例1: 计数器应用

举一个更简单的例子来解释runInAction的作用

假设我们有一个简单的计数器应用,当我们点击按钮时,计数器的值会增加。但是,我们希望在增加计数之前,先模拟一个1秒钟的异步操作。

这里是使用runInAction的例子:

import { observable, action } from 'mobx';

class CounterStore {
  @observable count = 0;

  @action
  increaseCount = () => {
    // 模拟一个1秒钟的异步操作
    setTimeout(() => {
      // 在这里使用 runInAction 包裹状态更新
      runInAction(() => {
        this.count++;
      });
    }, 1000);
  };
}

const counterStore = new CounterStore();

// 在组件中使用
import { observer } from 'mobx-react-lite';

const CounterComponent = observer(() => {
  return (
    <div>
      <p>当前计数: {counterStore.count}</p>
      <button onClick={counterStore.increaseCount}>增加计数</button>
    </div>
  );
});

在这个例子中,当我们点击"增加计数"按钮时,会触发increaseCountaction。这个action中有一个模拟的1秒钟异步操作,在这个操作完成后,我们使用runInAction来更新count状态。

为什么要使用runInAction呢?主要有以下两个原因:

  1. 确保状态更新的原子性: 如果不使用runInAction,当异步操作完成时,count的更新可能会与组件的重新渲染发生竞争条件,导致界面不一致。而runInAction可以确保状态更新是一个原子性操作。

  2. 自动追踪依赖: 当在runInAction中更新状态时,MobX会自动追踪这些状态的依赖关系。这意味着,只有依赖于count状态的组件,才会在count更新时重新渲染。

例2: 列表加载时显示、隐藏动画

下面是一个示例,展示了如何在异步操作中使用runInAction:

import { runInAction, observable } from 'mobx';

class TodoStore {
  @observable todos = [];
  @observable loading = false;
  @observable error = null;

  async fetchTodos() {
    this.loading = true;
    try {
      const response = await fetch('/api/todos');
      const data = await response.json();
      runInAction(() => {
        this.todos = data;
        this.loading = false;
        this.error = null;
      });
    } catch (err) {
      runInAction(() => {
        this.error = err.message;
        this.loading = false;
      });
    }
  }
}

在这个例子中,当fetchTodos方法被调用时,它会先设置loading状态为true。然后,在异步操作完成后,将结果数据更新到todos状态,并将loadingerror状态分别设置为falsenull

值得注意的是,这些状态更新都是在runInAction中完成的,这确保了状态更新的原子性,同时也确保了相关的观察者会自动更新。

runInAction的主要作用

  1. 原子性操作: runInAction确保了在执行内部代码时,状态的更新是原子性的,即要么全部执行成功,要么全部失败。这有助于避免部分状态更新导致的一致性问题(如异步中的状态更新可能会与组件的重新渲染发生竞争条件,导致界面不一致)。而runInAction可以确保状态更新是一个原子性操作。

  2. 自动追踪依赖: 当在runInAction中访问可观察状态时,MobX会自动追踪这些依赖关系。这意味着当这些依赖发生变化时,相关的观察者(如React组件)会自动更新。

  3. 异步代码的状态管理: 在异步操作中,我们通常需要维护一些状态,如加载状态、错误状态等。使用runInAction可以将这些状态的更新包裹在一个原子性操作中,使得状态管理更加清晰和可靠。

总之,runInAction是MobX中一个非常有用的工具,它可以帮助我们在异步操作中更好地管理状态,提高代码的可靠性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/535414.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么忘记密码要重置密码而不是直接告诉你密码?

上一篇博客&#xff1a;LeetCode 2529. 正整数和负整数的最大计数 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.…

Tensorflow(GPU版本配置)一步到位!!!

Tensorflow&#xff08;GPU版本配置&#xff09;一步到位&#xff01;&#xff01;&#xff01; CUDA安装CUDA配置Tensorflow配置常见的包 CUDA安装 配置了N次的Tensorflow–Gpu版本&#xff0c;完成了踩坑&#xff0c;这里以配置Tensorflow_gpu 2.6.0为例子进行安装 以下为ten…

React + three.js 3D模型面部表情控制

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制 示例项目(github)&#xff1a;https://github.com/couchette/simple-react-three-facial-expression-demo 示例项目(gitcode)&#xff…

Linux网络名称空间和cgroup的关系

在Linux系统中&#xff0c;网络名称空间&#xff08;Network Namespaces&#xff09;和控制组&#xff08;cgroups&#xff09;是两种重要的资源管理和隔离技术。虽然它们在功能和应用场景上有所不同&#xff0c;但二者共同为Linux容器技术&#xff0c;如Docker和Kubernetes&am…

编程规范(保姆级教程)

文章目录 为什么需要编程规范&#xff1f;&#x1f4a1;代码检测工具 ESLint&#x1f4a1;代码格式化 Prettier&#x1f4a1;ESLint 与 Prettier 配合解决代码格式问题eslint支持ts约定式提交规范Commitizen助你规范化提交代码什么是 Git Hooks使用 husky commitlint 检查提交…

wsl初步使用记录

wsl介绍 WSL是windows平台下Linux环境的子系统&#xff08;Windows Subsyetem for Linux&#xff09;&#xff0c;可以让Windows下方便的安装Linux系统&#xff0c;而无需安装其他虚拟机软件。 wsl使用 Windows操作系统支持 Windows 10 版本 2004 及更高版本&#xff08;内…

OpenHarmony南向开发案例:【智能保险柜】

样例简介 智能保险柜实时监测保险柜中振动传感器&#xff0c;当有振动产生时及时向用户发出警报。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可以远程接收智能保险柜的报警信息。后续可扩展摄像头等设备&#xff0c;实现对危险及时报警&#xff0c;及时处理&a…

缝合的作品(并查集/逆序)

、思路&#xff1a;首先是并查集来做&#xff0c;首先给给每个单词一个id&#xff0c;然后把它放到ans[i]处。 对于操作1&#xff1a;把a单词换为单词b&#xff0c;就相当于a、b两个集合结合。然后再给a单词赋一个新的id&#xff0c;用来进行操作2&#xff0c;因为之后的操作2…

HarmonyOS实战开发-证书管理、如何实现对签名数据进行校验功能。

介绍 本示例使用了ohos.security.certManager相关接口实现了对签名数据进行校验的功能。 实现场景如下&#xff1a; 1&#xff09;使用正确的原始数据和签名数据进行签名校验场景&#xff1a;模拟服务端对签名数据进行校验&#xff0c;验证客户端身份和原始数据完整性。 2&…

车载摄像头图像及画质增强解决方案

车载摄像头作为汽车智能化、安全化的关键组件&#xff0c;其图像质量直接影响着驾驶者的视觉感知和行车安全。美摄科技凭借其在图像处理和AI算法领域的深厚积累&#xff0c;推出了一款专为车载摄像头打造的图像及画质增强解决方案&#xff0c;助力企业实现摄像头画面的实时优化…

基于“遥感+”蓝碳储量估算、红树林信息提取实践技术应用与科研论文写作

大气温室气体浓度不断增加&#xff0c;导致气候变暖加剧&#xff0c;随之会引发一系列气象、生态和环境灾害。如何降低温室气体浓度和应对气候变化已成为全球关注的焦点。海洋是地球上最大的“碳库”,“蓝碳”即海洋活动以及海洋生物&#xff08;特别是红树林、盐沼和海草&…

电商技术揭秘十九:电商平台的智能化与自动化技术

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

✔ ★Java项目——设计一个消息队列(二)

Java项目——设计一个消息队列 四. 项⽬创建五. 创建核⼼类创建 Exchange&#xff08;名字、类型、持久化&#xff09;创建 MSGQueue&#xff08;名字、持久化、独占标识&#xff09;创建 Binding&#xff08;交换机名字、队列名字、bindingKey用于与routingKey匹配&#xff09…

WPS的JS宏如何批量实现文字的超链接

表格中需要对文字进行超链接&#xff0c;每个链接指引到不同的地址。例如&#xff1a; 实现如下表格中&#xff0c;文件名称超级链接到对应的文件路径上&#xff0c;点击对应的文件名称&#xff0c;即可打开对应的文件。 序号文件名称文件路径1变更申请与处理表.xls文档\系统…

HTTPS证书是什么?申请方法是什么?

HTTPS证书是互联网上由权威证书颁发机构&#xff08;CA&#xff09;签发的数字文件&#xff0c;用于证明网站的身份&#xff0c;并通过其中包含的公钥为网站启用HTTPS加密连接&#xff0c;确保用户与网站间的通信数据安全且不可被第三方窃取或篡改。 怎么申请&#xff1f; 一&…

实验案例一:交换机的初始配置

1、实验环境 实验用具包括一台 Cisco 交换机&#xff0c;一台 PC&#xff0c;一根 Console 线缆。 2、需求描述 如图 5.17 所示&#xff0c;实验案例一的配置需求如下。 通过 PC 连接并配置一台 Cisco 交换机在交换机的各个配置模式之间切换将交换机主机的名称改为 BDON 3、…

文心一言 VS 讯飞星火 VS chatgpt (234)-- 算法导论17.2 2题

二、用核算法重做练习17.1-3。练习17.1-3的内容是&#xff1a;假定我们对一个数据结构执行一个由 n 个操作组成的操作序列&#xff0c;当 i 严格为 2 的幂时第 i 个操作的代价为 i &#xff0c;否则代价为1。使用聚合分析确定每个操作的摊还代价。 文心一言&#xff1a; 练习…

多线程的学习

多线程编辑&#xff1a; 可以简单理解进程是一个软件 而线程就是一个软件中多个可以同时运行的功能 实现多线程的第一种方式&#xff1a;使用Thead类我们再自己创造一个类继承于这个类我们在对Thead方法进行重写&#xff0c;注意我们再重写的时候一定要加上Override这行 我犯下…

19 文件接口

文件概念 文件指的是文件内容属性&#xff0c;对文件的操作无外乎就是对内容或者属性的操作 为什么平时不用文件接口 我们运行程序访问文件&#xff0c;本质是进程在访问文件&#xff0c;向硬件写入内容&#xff0c;只有操作系统有这个权限。普通用户想写入内容呢&#xff1…

【canvas】canvas基础使用(六):图形阴影

简言 学习使用canvas的阴影属性。 阴影 shadowBlur 阴影模糊 CanvasRenderingContext2D.shadowBlur 是 Canvas 2D API 描述模糊效果程度的属性&#xff1b;它既不对应像素值也不受当前转换矩阵的影响。默认值是 0。 语法&#xff1a; ctx.shadowBlur level; 选项值&#x…