当前位置: 首页 > news >正文

react_11

MobX

介绍

需求,组件0 改变了数据,其它组件也想获得改变后的数据,如图所示

这种多个组件之间要共享状态数据,useState 就不够用了,useContext 也不好用了

能够和 react 配合使用的状态管理库有

  • MobX

  • Redux

其中 Redux API 非常难以使用,这里选择了更加符合人类习惯的 MobX,它虽然采用了面向对象的语法,但也能和函数式的代码很好地结合

文档
  • MobX 中文文档

  • MobX 官方文档

安装
 npm install mobx mobx-react-lite

在异步操作里为状态属性赋值,需要放在 runInAction 里,否则会有警告错误

使用 store,所有使用 store 的组件,为了感知状态数据的变化,需要用 observer 包装,对应着图中 reactions

  • mobx 目前版本是 "mobx": "^6.10.2"

  • mobx-react-lite 目前版本是 "mobx-react-lite": "^4.0.5"

  • 名词
  • Actions 用来修改状态数据的方法

  • Observable state 状态数据,可观察

  • Derived values 派生值,也叫 Computed values 计算值,会根据状态数据的改变而改变,具有缓存功能

  • Reactions 状态数据发生变化后要执行的操作,如 react 函数组件被重新渲染

  • 使用

    首先,定义一个在函数之外存储状态数据的 store,它与 useState 不同:

  • useState 里的状态数据是存储在每个组件节点上,不同组件之间没法共享

  • 而 MobX 的 store 就是一个普通 js 对象,只要保证多个组件都访问此对象即可

  • import axios from "axios";
    import { Student } from "../model/Student";
    import { makeAutoObservable, runInAction, makeObservable, observable, action, computed } from 'mobx'
    import R from "../model/R";
    class StudentStore {//属性 对应状态数据(observable state),可观察@observable student: Student = { id: 0, name: 'zhangsan' }//对应着action方法(用来修改状态数据的方法)
    //手动标识的时候使用 @action@action setName(name: string) {this.student.name = name}//对应着action方法(用来修改状态数据的方法)@action async fetch(id: number) {const resp = await axios.get<R<Student>>(`http://localhost:8080/api/students/${id}`)runInAction(() => {this.student = resp.data.data})}//派生值(derived values)或者叫计算值(computed values)会根据状态数据的改变而改变,计算值具有一个特性,//它具有缓存功能,比如第一次输入的是宋远桥,会计算出是宋大侠,第二次以及之后,如果宋远桥不变,那 //么displayName不会再执行了,它第一次执行的时候会把结果缓存起来@computed get displayName() {console.log('dispalyName 执行了')const first = this.student.name.charAt(0)if (this.student.sex === '男') {return first + '大侠'} else if (this.student.sex === '女') {return first + '女侠'}else {return ''}}//构造器constructor() {
    //手动标识的时候使用makeObservable(this)
    //自动使用的时候使用,如果不使用此代码,那么属性和方法就是普通属性和方法//makeAutoObservable(this)}
    }
    export default new StudentStore()

    其中 makeAutoObservable 会

  • 将对象的属性 student 变成 Observable state,即状态数据

  • 将对象的方法 fetch 变成 Action,即修改数据的方法

  • 将 get 方法变成 Computed values

  • 手动标识的时候需要在在tsconifg.json 中加入配置

  • {"compilerOptions": {// ..."experimentalDecorators": true}
    }

相关文章:

  • 消息中间件-RabbitMQ介绍
  • 机器人伺服驱动控制环
  • python爬虫(数据获取——selenium)
  • 【css】sass中的模块化
  • Jmeter_逻辑控制器
  • JavaScript继承的几种方式
  • Python中 lambda 的妙用
  • 昇腾CANN 7.0 黑科技:DVPP硬件加速训练数据预处理,友好解决Host CPU预处理瓶颈
  • TCP/IP的基础知识
  • C# 继承,抽象,接口,泛型约束,扩展方法
  • 微服务中配置文件(YAML文件)和项目依赖(POM文件)的区别与联系
  • 使用 AIGC ,ChatGPT 快速合并Excel工作薄
  • VMWare中的Centos7,DHCP获取不到IP地址
  • Python-loguru-跨进程的日志服务器-django
  • SQL必知会(二)-SQL查询篇(2)-排序检索数据
  • ES6指北【2】—— 箭头函数
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Android单元测试 - 几个重要问题
  • Angular Elements 及其运作原理
  • ECS应用管理最佳实践
  • mongo索引构建
  • node-glob通配符
  • rabbitmq延迟消息示例
  • vue2.0项目引入element-ui
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于Android乐音识别(2)
  • 聊一聊前端的监控
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端技术周刊 2019-01-14:客户端存储
  • 设计模式 开闭原则
  • 深入 Nginx 之配置篇
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微信小程序--------语音识别(前端自己也能玩)
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • ​flutter 代码混淆
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #if 1...#endif
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (145)光线追踪距离场柔和阴影
  • (27)4.8 习题课
  • (30)数组元素和与数字和的绝对差
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二开)Flink 修改源码拓展 SQL 语法
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET6 命令行启动及发布单个Exe文件