react18【系列实用教程】moxb —— 集中状态管理 (2024最新版)

官方文档 https://www.mobxjs.com/

moxb 和 redux 都能用于 react 的状态管理,但 moxb 更简单,适合规模不大的应用 (规模大的应用若合理组织代码结构,也能用 moxb)

在这里插入图片描述

安装 moxb

npm i mobx
npm i mobx-react-lite
  • 此处安装 mobx-react-lite 仅可用于函数组件,不支持类组件
  • 若想同时支持类组件和函数组件,则需安装 mobx-react

moxb 的工作流程

在这里插入图片描述

moxb 的目录结构

  • 在 src 目录下创建文件夹 store
  • 在文件夹 store 中根据需要创建 js/ts 文件,比如常用的全局状态–当前登录用户,则创建 User.js 文件

在这里插入图片描述

moxb 的基本使用

1. 定义响应式的属性和方法

以 User.js 为例,详见注释

import { makeAutoObservable } from "mobx";// 定义类
class User {// 构造函数constructor() {/** 【自动创建响应式】*  第1个参数:要创建为响应式的对象,此处的this即指当前类*  第2个参数:默认第1个参数的所有属性和方法都会添加响应式,可在此指定不添加响应式的属性和方法,如{if_Login:false},即属性if_Login无响应式*  第3个参数:指定自动绑定this,方便在页面使用时,绑定事件无参数时可不使用箭头函数*/makeAutoObservable(this, {}, { autoBind: true });}// 属性 if_Login --- 用户是否登录if_Login = false;// 属性 info --- 用户的信息info = {};// 方法 -- 用户登录login(newInfo) {// 将属性 if_Login 的值设置为 truethis.if_Login = true;// 将传入的参数赋值给属性 infothis.info = newInfo;}// 方法 -- 用户登出logout() {// 将属性 if_Login 重置为 falsethis.if_Login = false;// 将属性 info 重置为 {}this.info = {};}
}// 导出类实例
export default new User();

2. 在页面中使用

  • 需用 observer 函数包裹目标组件,这样页面才能随状态值的变化渲染更新

index.jsx

// 导入实例 User
import User from "./store/User.js";
// 导入 observer 函数
import { observer } from "mobx-react-lite";// 用 observer 函数包裹目标组件
const Demo = observer(() => {return (<>{/* 获取实例 User 的属性 if_Login 的值 */}<div>登录状态:{User.if_Login ? "已登录" : "未登录"}</div>{/* 获取实例 User 的属性 info 值的 name 属性的值 */}<div>用户名称:{User.info.name}</div>{/* 调用实例 User 的方法 login,因有自定义传参,需使用箭头函数 */}<button onClick={() => User.login({ name: "朝阳" })}>登录</button>{/* 调用实例 User 的方法 logout */}<button onClick={User.logout}>登出</button></>);
});export default Demo;

最终效果
在这里插入图片描述

moxb 的自动计算 computed

与 vue 的 computed 概念相同,在响应式方法前加上 get 即可实现

src/store/Counter.js

import { makeAutoObservable } from "mobx";class Counter {constructor() {makeAutoObservable(this, {}, { autoBind: true });}value = 0;increase() {this.value++;}// 用 get 装饰的方法,即computed,会随方法内响应式属性的变化,自动计算get double() {return this.value * 2;}
}export default new Counter();

src/index.js

import Counter from "./store/Counter.js";import { observer } from "mobx-react-lite";const Demo = observer(() => {return (<><div>计数器的值为:{Counter.value}</div><div>双倍的计数器值为:{Counter.double}</div><button onClick={Counter.increase}>+1</button></>);
});export default Demo;

在这里插入图片描述

moxb 监听属性

autorun

与 vue3 的 watchEffect 的概念相同,能监听所有属性的变化,且在页面初始化时就会执行一次

// autorun 需要导入
import { makeAutoObservable, autorun } from "mobx";class Counter {constructor() {makeAutoObservable(this, {}, { autoBind: true });}value = 0;increase() {this.value++;}
}// 因 autorun 函数内需要使用到实例的属性,需先将实例存入变量 counter
const counter = new Counter();autorun(() => {//任一响应式属性变化时,都会执行,在页面初始化时,也会执行console.log("counter.value的值为", counter.value);
});
export default counter;

reaction

与 vue 的 watch 概念相同,可精准指定要监听的属性,在属性变化时才执行处理函数(可以获取到新值和旧值),再页面初始化时,不会执行。

// reaction 需要导入
import { makeAutoObservable, reaction } from "mobx";class Counter {constructor() {makeAutoObservable(this, {}, { autoBind: true });}value = 0;increase() {this.value++;}
}// 因 reaction 函数内需要使用到实例的属性,需先将实例存入变量 counter
const counter = new Counter();reaction(// 第1个参数为要监听的属性() => counter.value,// 第2个参数为响应函数(newValue, oldValue) => {//仅在 value 属性变化时执行,在页面初始化时,不会执行console.log("counter.value的旧值为", oldValue);console.log("counter.value的新值为", newValue);}
);
export default counter;

moxb 处理异步

异步执行的代码,需放入 runInAction 函数中(否则会有需在 action 中修改状态的提示)

// runInAction 需要导入
import { makeAutoObservable, runInAction } from "mobx";class Counter {constructor() {makeAutoObservable(this, {}, { autoBind: true });}value = 0;increase() {setTimeout(() => {// 异步执行的代码runInAction(() => {this.value++;});}, 1000);}
}export default new Counter();

moxb 模块化

当 store 设计的类比较多时,为了方便使用,可以将其模块化为一个 store 中,方便页面的导入和使用。

1. 将分散的store,全部放入RootStore

新建文件 src/store/index.js

import { createContext, useContext  } from "react";// 导入要统一管理的Store
import user from "./User.js";
import counter from "./Counter.js";// 将分散的store,全部放入RootStore
class RootStore {user = user;counter = counter;
}const store = new RootStore();
// 创建上下文
const Context = createContext(store);
// 导出自定义hook函数 --- useStore
export default function useStore() {// 返回 useContextreturn useContext(Context);
}

2. 页面中导入后,解构赋值使用

import { observer } from "mobx-react-lite";
// 导入自定义 hook 函数useStore
import useStore from "./store/index.js";const Demo = observer(() => {// 解构赋值,获取到需要的 storeconst { counter, user } = useStore();return (<><div>用户的登录状态为:{user.if_Login ? "已登录" : "未登录"}</div><div>计数器的值为:{counter.value}</div><button onClick={counter.increase}>+1</button></>);
});export default Demo;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言洛谷题目分享(11)回文质数

目录 1.前言 2.题目&#xff1a;回文质数 1.题目描述 2.输入格式 3.输出格式 4.输入输出样例 5.题解 3.小结 1.前言 哈喽大家好&#xff0c;今儿继续为大家分享一道蛮有价值的一道题&#xff0c;希望大家多多支持喔~ 2.题目&#xff1a;回文质数 1.题目描述 因为 151 …

【Oracle直播课】5月19日Oracle 19c OCM认证大师课 (附课件预览)

Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) 部分课件预览 OCM部分课件预览 Oracle Database 19c Certified Master Exam (OCM) 认证大师 25 天 / 150课时 什么是Oracle 19c OCM&#xff1f; Oracle Certified Master (OCM)是Oracle认证大师&#xff0c;…

【51】Camunda8-Zeebe核心引擎-Zeebe Gateway

概述 Zeebe网关是Zeebe集群的一个组件,它可以被视为Zeebe集群的联系点,它允许Zeebe客户端与Zeebe集群内的Zeebe代理进行通信。有关Zeebe broker的更多信息,请访问我们的附加文档。 总而言之,Zeebe broker是Zeebe集群的主要部分,它完成所有繁重的工作,如处理、复制、导出…

软件工程期末复习(2)

软件工程 软件危机与软件工程的提出&#xff1a; 面对软件危机&#xff0c;1968年德国召开的一次NATO会议上首次签署声明“软件工程”这一说法&#xff0c;认为软件工程应当使用业已建立的工程学科的基本原理和范型。 背后驱使的观念是&#xff1a;软件设计、实现和维护应当与…

网络编程套接字详解

目录 1. 预备介绍 2.网络字节序 3.udp网络程序 4.地址转换函数 5.udp网络编程 1.预备介绍 1.1源IP地址和目标IP地址 举个例子: 从北京出发到上海旅游, 那么源IP地址就是北京, 目标IP地址就是上海. 1.2 端口号 作用: 标识一个进程, 告诉OS这个数据交给那个进程来处理; (1)…

Redis详解(二)

事务 什么是事务&#xff1f; 事务是一个单独的隔离操作&#xff1a;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。 事务是一个原子操作&#xff1a;事务中的命令要么全部被执行&#xff0c;要么全部都…

JVM内存结构

文章目录 JVM的内存结构程序计数器虚拟机栈&#xff08;栈&#xff09;本地方法栈Native关键字 堆元空间&#xff08;JDK1.8之前为永久代&#xff09; 实例对象实例化的过程 JVM的内存结构 先看下图 内存结构分为以下的两种&#xff1a;线程私有以及线程共享 线程私有&#x…

1070: 邻接矩阵存储简单路径

解法&#xff1a; #include<iostream> #include<vector> using namespace std; int arr[100][100]; int n; int sta, des; vector<int> path; vector<vector<int>> res; void dfs(vector<int> &a,int i) {a[i] 1;path.push_back(i);…

【数据分析面试】42.用户流失预测模型搭建(资料数据分享)

题目 保持高的客户留存率可以稳定和提到企业的收入。因此&#xff0c;预测和防止客户流失是在业务中常见的一项数据分析任务。这次分享的数据集包括了电信行业、银行、人力资源和电商行业&#xff0c;涵盖了不同业务背景下的流失预测数据。 后台回复暗号&#xff08;在本文末…

【Ubuntu永久授权串口设备读取权限“/dev/ttyUSB0”】

Ubuntu永久授权串口设备读取权限 1 问题描述2 解决方案2.1 查看ttyUSB0权限&#xff0c;拥有者是root&#xff0c;所属用户组为dialout2.2 查看dialout用户组成员&#xff0c;如图所示&#xff0c;普通用户y不在dialout组中2.3 将普通用户y加入dialout组中2.4 再次查看dialout用…

Python 求高斯误差函数 erf 和 erfc

文章目录 Part.I IntroductionPart.II 概念定义Chap.I 误差函数 erfChap.II 误差函数补 erfc Part.II 求值与绘图Chap.I 求取方式Chap.II 绘图 Reference Part.I Introduction 本文将对误差函数&#xff08;ERror Function, ERF&#xff09;进行简单的介绍&#xff0c;并探索如…

Linux网站服务

1.概念:HTML:超级文本编辑语言 网页:使用HTML,PHP,JAVA语言格式书写的文件。 主页:网页中呈现用户的第一个界面。 网站:多个网页组合而成的一台网站服务器。 URL:统一资源定位符&#xff0c;访问网站的地址。 网站架构:LAMP: LinuxApacheMYSQLPHP(系统服务器程序数据管理…

Multitouch for Mac:手势自定义,提升工作效率

Multitouch for Mac作为一款触控板手势增强软件&#xff0c;其核心功能在于手势的自定义和与Mac系统的深度整合。通过Multitouch&#xff0c;用户可以轻松设置各种手势&#xff0c;如三指轻点、四指左右滑动等&#xff0c;来执行常见的任务&#xff0c;如打开应用、切换窗口、滚…

爬虫工作量由小到大的思维转变---<第七十三章 > Scrapy爬虫详解一下HTTPERROE的问题

前言&#xff1a; 在我们的日常工作中&#xff0c;有时会忽略一些工具或组件的重要性&#xff0c;直到它们引起一连串的问题&#xff0c;我们才意识到它们的价值。正如在Scrapy框架中的HttpErrorMiddleware&#xff08;HTTP错误中间件&#xff09;一样&#xff0c;在开始时&…

MATLAB R2017b安装的关键一步

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 MATLAB R2017b的安装文件比较庞大&#xff0c;由两个iso文件组成&#xff1a;R2017b_win64_dvd1.iso和R2017b_win64_dvd2.iso。安装时需要注意的是&#xff0c;首先使用DAEMON Tools Lite打开R2017b_win64_dvd1.iso&am…

【Git】Git在Gitee上的基本操作指南

文章目录 1. 查看 git 版本2. 从Gitee克隆仓库&#xff1a;3. 复制文件到工作目录&#xff1a;4. 将未跟踪的文件添加到暂存区&#xff1a;5. 在本地提交更改&#xff1a;6. 将更改推送到远程仓库&#xff08;Gitee&#xff09;&#xff1a;7. Windows特定提示&#xff1a; 1. …

品鉴中的品鉴笔记:如何记录和分享自己的品鉴心得

品鉴云仓酒庄雷盛红酒的过程&#xff0c;不仅是品尝美酒&#xff0c;更是一次与葡萄酒深度对话的旅程。为了更好地记录和分享自己的品鉴心得&#xff0c;养成写品鉴笔记的习惯是十分必要的。 首先&#xff0c;选择一个适合的记录工具。可以是传统的笔记本&#xff0c;也可以是…

使用Git管理github的代码库-上

1、下载安装Git https://download.csdn.net/download/notfindjob/11451730?spm1001.2014.3001.5503 2、注册一个github的账号&#xff08;已经注册的&#xff0c;可略过这一步&#xff09; 3、打开git命令行&#xff0c;配置github账号 git config --global user.name &quo…

【C语言】指针(一)

目录 一、内存 1.1 ❥ 理解内存和地址的关系 1.2 ❥ 编址 二、指针变量 2.1 ❥ 取地址操作符&#xff08;&&#xff09; 2.2 ❥ 指针变量和解引用操作符&#xff08;*&#xff09; 2.3 ❥ 指针变量的大小 三、指针类型的意义 3.1 ❥ 指针的解引用 3.2 ❥ 指针-整数 3…

攻防世界PHP2

1、打开靶机链接http://61.147.171.105:49513/&#xff0c;没有发现任何线索 2、尝试访问http://61.147.171.105:49513/index.php&#xff0c;页面没有发生跳转 3、尝试将访问 尝试访问http://61.147.171.105:49513/index.phps index.php 和 index.phps 文件之间的主要区别在于…