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 的值设置为 true
    this.if_Login = true;
    // 将传入的参数赋值给属性 info
    this.info = newInfo;
  }

  // 方法 -- 用户登出
  logout() {
    // 将属性 if_Login 重置为 false
    this.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() {
  // 返回 useContext
  return useContext(Context);
}

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

import { observer } from "mobx-react-lite";
// 导入自定义 hook 函数useStore
import useStore from "./store/index.js";

const Demo = observer(() => {
  // 解构赋值,获取到需要的 store
  const { counter, user } = useStore();
  return (
    <>
      <div>用户的登录状态为:{user.if_Login ? "已登录" : "未登录"}</div>
      <div>计数器的值为:{counter.value}</div>

      <button onClick={counter.increase}>+1</button>
    </>
  );
});

export default Demo;

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

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

相关文章

Kubernetes的Pod控制器深度解析

1.1 Pod控制器介绍 在Kubernetes中&#xff0c;Pod是最小的管理单元&#xff0c;用于运行容器。根据Pod的创建方式&#xff0c;可以将其分为两类&#xff1a; 自主式Pod&#xff08;Stateless Pods&#xff09;&#xff1a;这些Pod是直接由用户或管理员创建的&#xff0c;通常…

【058】基于SpringBoot+Vue校园失物招领系统的设计与实现

系统介绍 基于SpringBootVue校园失物招领系统主要通过使用Java语言编码设计系统功能&#xff0c;MySQL数据库管理数据&#xff0c;AJAX技术设计简洁的、友好的网址页面&#xff0c;然后在IDEA开发平台中&#xff0c;编写相关的Java代码文件&#xff0c;接着通过连接语言完成与…

【中级软件设计师】上午题16-算法(应试考试简略版)

上午题16-算法 1 回溯法1.1 n皇后问题 2 分治法3 动态规划3.1 0-1背包问题3.2 最长公共子序列3.3 矩阵连乘 4 贪心算法5 分支限界法总结 1 回溯法 深度优先方法搜索 1.1 n皇后问题 2 分治法 一般来说&#xff0c;分治算法在每一层递归上都有3个步骤 &#xff08;1&#xff…

kubeflow文档-介绍与架构

1. kubeflow介绍 Kubeflow项目致力于使机器学习&#xff08;ML&#xff09;工作流在Kubernetes上的部署变得简单、可移植和可扩展。目标不是重新创建其他服务&#xff0c;而是提供一种直接的方法&#xff0c;将ML的开源系统部署到不同的基础设施中。无论在哪里运行Kubernetes&a…

步入式恒温恒湿试验箱厂家哪家好?DHT(多禾试验)是您不二之选

步入式恒温恒湿试验箱厂家是一种广泛应用于科研、生产和质量控制领域的设备&#xff0c;所以选择一个合适的步入式恒温恒湿试验箱厂家&#xff0c;是确保试验数据准确性和可靠性的核心因素。因此在选择步入式恒温恒湿试验箱厂家时&#xff0c;需要考虑多方面因素&#xff0c;如…

01-02-4

1、中级阶段-day1作业 使用的代码 #include<stdio.h> typedef struct Student {int num;char name[20];char sex; }Stu; int main() {Stu s;scanf("%d%s %c", &s.num, s.name, &s.sex);//读取字符串时&#xff0c;scanf()的占位符用%s即可&#xff0c…

如何在windows server下安装mysql5.7数据库,并使用Navicat Premium 15可视化工具新建数据库并读取数据库信息。

如何在windows server下安装mysql5.7数据库&#xff1f; MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/点击↑&#xff0c;然后选择对应版本和平台↓下载 将下载后的安装包放入固定目录&#xff08;这里以D:…

韩国Doosan斗山机械手维修

在现代工业领域&#xff0c;斗山机器人以其高效、精准和稳定的性能而受到广泛应用。然而&#xff0c;随着使用时间的增加&#xff0c;机器人难免会出现Doosan机器人故障。 常见斗山机器人故障及Doosan机械手维修方法 1. 电源故障 - 故障现象&#xff1a;机器人电源无法正常开…

【JavaSE】多线程

目录 进程与线程进程线程 几个基本概念串行和并行并行与并发 多线程概念多线程的优点/好处多线程问题分析 Java多线程的基本使用Thread类主线程守护线程案例&#xff1a;显示主线程名 多线程实现方式继承java.lang.Thread类步骤代码实现start()和run()的区别&#xff1f; 注意 …

专业音频修复软件:iZotope RX 11 for Mac 激活版

iZotope RX 专为满足后期制作专业人士的苛刻需求而设计的一款专业音频修复软件。iZotope RX 10添加了新的特性和功能&#xff0c;以解决当今后期项目中存在的一些最常见的修复问题&#xff0c;使其成为音频后期制作的最终选择。虽然包含许多其他新功能&#xff0c;但这里是新的…

Git-基础

概念&#xff1a;一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用&#xff1a;记录代码内容&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 Git安装 安装路径不能出现中文 git -v//查看git版本 Git配置用户信息…

代码大师的工具箱:现代软件开发利器

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

MySQL数据查询优化

MySQL调优是开发中必不可少的内容&#xff0c;以下是对MySQL查询性能优化的部分总结 1. explain关键字的使用 explain关键字可以模拟优化器执行sql查询语句&#xff0c;获取sql的执行信息&#xff0c;使用方法&#xff1a; explainsql语句 1.1 字段详解 id&#xff08;select …

东南亚电商巨头:Zalora,卖家如何通过自养号测评快速提升产品销量

Zalora&#xff0c;中文名为“左拉”&#xff0c;是东南亚地区备受瞩目的时尚电商平台。总部位于新加坡&#xff0c;其业务已覆盖包括中国香港、中国台湾、印尼、菲律宾、泰国、越南、马来西亚及文莱等11个亚太地区。Zalora以其丰富的品牌产品线、卓越的服务体验和高效的物流配…

数据分析的数据模型

数据分析的数据模型 前言一、优化模型1.1线性优化模型1.1.1线性优化模型定义1.1.2线性优化模型求解算法1. 1.2.1图解法1. 1.2.2. 单纯形法 1.1.3 线性优化模型的应用 1.2非线性优化模型1.2.1非线性优化模型定义1.2.2非线性优化划模型求解方法1. 2.2.1有约束非线性模型算法1.2.2…

windows版本达梦数据复制软件 DMDRS安装

安装步骤&#xff1a; 1&#xff1a; 2&#xff1a;注意安装提醒 3&#xff1a;接受 4&#xff1a;选择安装路径&#xff0c;注意权限以及所需空间大小 5&#xff1a;观察支持的数据源类型

华企盾DSC数据防泄密软件有哪些水印功能?

在企业数据安全领域&#xff0c;水印技术是一种重要的信息保护策略&#xff0c;用于防止数据泄露和确保信息的原始性和完整性。根据回顾的资料&#xff0c;以下是企业中常用的几种水印技术&#xff1a; 屏幕浮水印&#xff1a;这种水印能够在用户的屏幕上显示公司的标志或者其他…

安服仔养成篇——漏洞修复

漏洞披露是安全服务工作的日常内容之一&#xff0c;常见漏洞扫描和渗透测试两种方式&#xff0c;完整的工作流程还包括了后续的复核以及提供漏洞整改建议&#xff0c;这篇文章给大家分享一下up在漏洞修复上的一些经验和容易遇到的问题&#xff0c;希望能对师傅们有所帮助。 漏洞…

mmdetection在训练自己数据集时候 报错‘ValueError: need at least one array to concatenate’

问题&#xff1a; mmdetection在训练自己数据集时候 报错‘ValueError: need at least one array to concatenate’ 解决方法&#xff1a; 需要修改数据集加载的代码文件&#xff0c;数据集文件在路径configs/base/datasets/coco_detection.py里面&#xff0c;需要增加meta…

RSAC2024: 洞悉安全新趋势 - 天空卫士前沿观察

以"可能的艺术"&#xff08;The Art of the Possible&#xff09;为主题&#xff0c;备受瞩目的RSA Conference 2024&#xff08;RSAC2024&#xff09;已于5月6日在旧金山盛大开幕。这一年度盛会不仅是网络安全领域最新技术与趋势的展示窗口&#xff0c;更是全球网络…