React--》状态管理工具—Mobx的讲解与使用

news2024/11/18 3:22:26

目录

Mobx的讲解与使用

Mobx环境配置

Mobx的基本使用

Mobx计算属性的使用

Mobx监听属性的使用

Mobx处理异步的使用

Mobx的模块化


Mobx的讲解与使用

Mobx是一个可以和React良好配合的集中状态管理工具,mobx和react的关系相当于vuex和vue之间的关系,同类工具还有:redux、dva、recoil。

mobx优势:编写无模板的极简代码来精准描述你的意图;依赖自动追踪最小渲染优化轻松实现最优渲染;可移植和测试轻松实现架构自由;学习成本小且面向对象编程,对TS友好。

mobx的核心思想:任何源自应用状态的东西都应该自动的获得。

Mobx与redux的区别:Mobx写法上更偏向于OOP(面向对象编程),对一份数据直接进行修改操作,不需要始终返回一个新的数据;并非单一store,可以是对store; redux默认以JavaScript原生对象形式存储数据,而Mobx使用可观察对象。详细比较如下:

reduxmobx
有严格的工作流程,需要写大量的模板代码无模板代码,非常简洁
需要保证数据不可变数据是响应式的,可以直接修改数据(proxy)
redux需要中间件处理异步mobx可以直接处理异步
redux约束强,更适合大型多人协作开发mobx适合简单,规模不大的应用

Mobx版本说明:经过时间的积淀,mobx也迎来了许多版本的迭代,其中具体的版本说明如下:

Mobx4可以运行在任何支持ES5语法的浏览器(Object.defineProperty)

Mobx5版本运行在任何支持ES6语法的浏览器(Proxy)

Mobx4和Mobx5具有相同的api,都需要使用装饰器语法

Mobx6是目前最新版本,为了与标准的JavaScript的最大兼容性,默认情况下放弃了装饰器语法,因为装饰器语法仅仅是给提案,举例ES标准化还需要很久。

还是那句老生常谈的话:想了解前沿技术还是多多看看官方手册:mobx官方文档

Mobx环境配置

Mobx是一个独立的响应式的库,可以独立于任何UI框架而存在,但是通过人们把它和React来绑定使用,用Mobx来做响应式数据建模,React作为UI视图架构渲染内容。配置Mobx如下:

通过类似create-react-app创建好的react项目环境,使用create-react-app初始化react项目,如果要详细了解react框架的搭建,推荐看一下这篇文章:React脚手架的搭建与使用 :

npx create-react-app 项目名称

安装 mobx 和 mobx-react或mobx-react-lite,这里简单提一下:mobx-react和mobx-react-lite都是连接react和mobx的中间件,两种的区别是mobx-react支持类和函数组件,体积相对而言较大;而mobx-react-lite只支持函数组件,体积较小,自己可以根据具体情况进行使用下载:

npm install mobx mobx-react-lite

Mobx的基本使用

安装好mobx相关的第三方包之后,就可以使用mobx进行状态管理了,如下,在src目录下新建一个store文件夹,在store文件夹下新建一个counter.jsx文件,用来管理count状态,如下:

import { action, makeObservable, observable } from "mobx";

class Counter {
  constructor(){
    // 参数1:target 把谁变成响应式(可观察);参数2:指定哪些属性或方法变成可观察
    makeObservable(this,{ // 设置观察模式
      count:observable, // 设置管理状态的数据
      increment:action.bound,  // 可以设置bound属性修改this指向
      decrement:action,
      reset:action
    })
  }
  // 当前的初始化状态数据
  count = 0
  
  // 操作状态的方法
  increment(){
    this.count++
  }
  decrement(){
    this.count--
  }
  reset(){
    this.count = 0
  }
}
// eslint-disable-next-line import/no-anonymous-default-export
export default new Counter()

在想使用count数据的相关组件中进行引入并使用即可,过程如下:

import React from 'react'
import { observer } from 'mobx-react-lite'
import counter from './store/counter'

function App() {
  return (
    <div>
      <h3>计数器案例</h3>
      <div>点击次数:{counter.count}</div>
      <button onClick={()=>counter.increment()}>加1</button>
      <button onClick={()=>counter.decrement()}>减1</button>
      <button onClick={()=>counter.reset()}>重置</button>
    </div>
  )
}

// 使用ovserver高阶组件函数包裹需要使用store的组件
export default observer(App)

默认情况下class中的方法不会绑定this,this指向取决于如何调用,当然如果你想调用函数时不想通过箭头函数来调用函数,在使用makeAutoObservable时可以通过bound属性来修改指向问题:

makeAutoObservable的使用:makeAutoObservable就像加强版的makeObservable,默认情况下它将推断所有的属性,推断的规则为:所有的属性都成为observable,所有的方法都成为action,所有的计算属性都成为computed (计算属性接下来会讲到)。具体的使用如下:

import { makeAutoObservable } from "mobx";

class Counter {
  constructor(){
    // 参数1:target让对象变成可观察
    // 参数2:排除属性和方法
    // 参数3:指定自动绑定this
    makeAutoObservable(this,{},{autoBind:true})
  }
  // 当前的初始化状态数据
  count = 0
  // 操作状态的方法
  increment(){
    this.count++
  }
  decrement(){
    this.count--
  }
  reset(){
    this.count = 0
  }
}
// eslint-disable-next-line import/no-anonymous-default-export
export default new Counter()

Mobx计算属性的使用

computed可以用来从其它可观察对象中派生信息,计算值采用惰性求值,会缓存其输出,并且只有当其依赖的可观察对象被改变时才会重新计算。

注意:计算属性是一个方法,且方法前面必须使用get进行修饰,计算属性还需要通过makeAutoObservable方法指定,如下:

Mobx监听属性的使用

Mobx监听属性主要有以下两种方式,现在分别对两种监听方式的使用进行讲解,如下:

autoRun的使用

autoRun函数接受一个函数作为参数,每当该函数所观察的值发生变化时,它都应该运行,当自己创建 autoRun 时,它也会运行一次,Mobx会自动收集并订阅所有的可观察属性,一旦有改变发生,autorun将会再次执行。

import { autorun, makeAutoObservable } from "mobx";
class Counter {
  constructor(){
    makeAutoObservable(this,{},{autoBind:true})
  }
  count = 0
  increment(){
    this.count++
  }
  decrement(){
    this.count--
  }
  reset(){
    this.count = 0
  }
}
const counter = new Counter()
// 监听数据的变化
autorun(()=>{
  console.log('counter.count',counter.count);
})
export default counter

reaction的使用

reaction类似于autorun,但可以更加精细地控制要跟踪的可观察对象,与autorun不同,reaction在初始化时不会自动运行。

import { makeAutoObservable, reaction } from "mobx";
class Counter {
  constructor(){
    makeAutoObservable(this,{},{autoBind:true})
  }
  count = 0
  increment(){
    this.count++
  }
  decrement(){
    this.count--
  }
  reset(){
    this.count = 0
  }
}
const counter = new Counter()
// 监听数据的变化
// reaction接收两个参数,参数1:data函数,其返回值会作为第二个函数的输入;参数2:回调函数
reaction(()=> counter.count,(value,oldvalue)=>{
  console.log('count数据发生变化了',value,oldvalue);
})

export default counter

Mobx处理异步的使用

异步进程在Mobx中不需要任何特殊处理,因为不论是何时引起的所有 reactions 都将会自动更新,因为可观察对象是可变的,因此在action执行过程中保持对它们的引用一般是安全的,如果可观察对象的修改不是在action函数中,控制台会报警告(可以关闭,但是不推荐)。什么意思呢?如下:

我们在进行异步加一之后,打开浏览器的控制台,看看能得出什么结果,如下:

当然,控制台虽然爆出警告,但是不影响实际的效果的产生的,如果想消除警告,可以设置严格模式,如下:

这种虽然是能消除警告,但是并不符合规范,如果想符合规范的话,建议采用这种方式:

runlnAction的使用

Mobx处理异步的方式除了使用上面的方式外,还可以使用runlnAction进行异步处理,通过runlnAction可以保证所有异步更新可观察对象的步骤都应该标识为action,使用方式如下:

Mobx的模块化

在大型项目中,是不能将所有状态和方法都放到一个store中的,我们可以根据业务模块定义多个store,然后通过一个根store统一管理所有的store。一般我们会将在store文件夹下的index文件设置为根store,如下:

// 封装统一导出的store
import { createContext, useContext } from 'react';
// 两个store文件
import counter from './counter'
import list from "./list";

// 声明一个 RootStore
class RootStore {
  counter = counter
  list = list
}
const store = new RootStore()
// 创建一个上下文对象,用于跨级组件通讯
// 如果createContext提供了默认值,不需要Provider
const Context = createContext(store)
// 自定义hook
export default function useStore(){
  return useContext(Context)
}

总结:Mobx5版本及之前版本对装饰器的语法,这里就不再讲解了,想要了解的朋友可以参考官方文档或者自行百度。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IntelliJ IDEA【前端必备插件】

有志者事竟成&#xff0c;破釜沉舟百二秦关终属楚苦心人天不负&#xff0c;卧薪尝胆三千越甲可吞吴。 &#x1f4cc;博主介绍 &#x1f492;首页:水香木鱼 &#x1f6eb;专栏&#xff1a;工欲善其事必先利其器 ✍简介: 博主姓&#xff1a;陈&#xff0c;名&#xff1a;春波。…

前端开发神器VS Code安装教程

✅作者简介&#xff1a;CSDN一位小博主&#xff0c;正在学习前端 &#x1f4c3;个人主页&#xff1a;白月光777的CSDN博客 &#x1f4ac;个人格言&#xff1a;但行好事&#xff0c;莫问前程 安装VS CodeVS Code简介VS Code安装VS Code汉化结束语&#x1f4a1;&#x1f4a1;&…

webpack热更新原理-连阿珍都看懂了

前言 在旧开发的时代&#xff0c;前端项目在开发的过程中修改代码&#xff0c;很有可能是手动切到浏览器刷新页面来看到改动效果。操作不方便且页面之前的编辑记录也都丢失&#xff0c;体验可以说为0。想象一下一个表达你努力填满了所有输入项&#xff0c;结果因为调了一下样式…

vue3.0全新文档快速上手学习内容整理

目录 ## 1.Vue3简介 ## 2.Vue3带来了什么 ### 1.性能的提升 ### 2.源码的升级 ### 4.新的特性 1. Composition API&#xff08;组合API&#xff09; 2. 新的内置组件 3. 其他改变 # 一、创建Vue3.0工程 ## 1.使用 vue-cli 创建 ## 2.使用 vite 创建 # 二、常用 Com…

vue3导出表格excel(支持多sheet页),并自定义导出样式

前期准备 npm install file-saver npm install xlsx npm install xlsx-js-style 先说一说这里为什么选择用xlsx-js-style插件设置导出excel的样式。因项目需要&#xff0c;我在网上找了很多关于导出excel自定义样式的文章&#xff0c;用的最多最普遍的插件就是xlsx-style&#…

unipush2.0教程

解释一下名词 透传消息&#xff1a;无论手机app&#xff0c;是否在运行(打开了)&#xff0c;还是清了后台&#xff08;关闭&#xff09;&#xff0c;都可以收到消息 通知消息&#xff1a;只能app打开了&#xff0c;才能收到 1.开通unipush 2.点击上图的unipush2.0下面的配置&am…

【VSCode】调试器debugger详细使用手册

Visual Studio Code 的主要功能之一是其出色的调试支持。VS Code 的内置调试器有助于加速您的编辑、编译和调试循环。 调试器扩展 VS Code 具有对Node.js运行时的内置调试支持&#xff0c;并且可以调试 JavaScript、TypeScript 或任何其他转换为 JavaScript 的语言。 开始调…

【CSS】CSS 特性 ③ ( CSS 优先级 | 权重叠加计算公式 )

文章目录一、权重叠加计算公式1、后代选择器权重计算2、后代选择器权重计算二3、链接伪类选择器权重计算二、代码示例1、标签结构2、后代选择器选择案例 12、后代选择器选择案例 23、后代选择器选择案例 3一、权重叠加计算公式 在使用 多个类型的 基础选择器 进行 组合 时 , 如…

【JavaScript】手撕前端面试题:手写new操作符 | 手写Object.freeze

&#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&#xff09; &#x1f5a5;️ TypeScript知识总结&…

HttpServletRequest 获取参数

1 HttpServletRequest获取参数方法 可以使用HttpServletRequest获取客户端的请求参数&#xff0c;相关方法如下&#xff1a; String getParameter(String name)&#xff1a;通过指定名称获取参数值&#xff1b;String[] getParameterValues(String name)&#xff1a;通过指定名…

new bing 申请加入候补

最近Chatgpt非常的火爆&#xff0c; 微软也是把新版必应Chatgpt的测试版已经推出。1.下载安装新必应(new bing)需要下载 Edge新版本 Edge dev下载链接: Microsoft Edge 预览体验成员 (microsoftedgeinsider.com)安装插件在设置中找到扩展-> 获取Microsoft Edge扩展搜索获取 …

vue中的nexttick

我们了解nexttick之前&#xff0c;我们先来看一个例子。 我们先要每一次都在点击按钮的时候&#xff0c;都进行字符串的累加操作&#xff0c;并且在该函数中计算该字符串所占的高度offsetHeight&#xff0c;但是我们当进行第一次点击的时候&#xff0c;此时打印的结果不符合,因…

Javascript Object和Map之间的转换

简单的区分Map和Object Map是ES6退出的一个类型&#xff0c;特点&#xff1a;任何值都可作为属性名 Object特点&#xff1a;属性名只能是字符串(一开始我也不信&#xff0c;测试后才发现的) 代码图片创建一个map类型 new Map([[key, value],[key1, value1] ])简单的介绍下面…

vue 获取后端数据

目录 proxy 解决本地请求问题 vite Vue CLI fetch 代码演示 Post请求 ​编辑Get请求 Axios 安装 代码演示 Post请求 Get请求 TS 封装Axios 代码演示 proxy 解决本地请求问题 为什么会出现跨域问题? 浏览器的同源策略 首先给出浏览器“同源策略”的一种经典定义…

this.$router.push跳转页面携带参数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、params和query使用方式二、实现代码1.index.js代码2.test.vue代码3.testParams代码4.testParams代码5.效果总结前言 this.$router.push进行页面跳转时。携带…

Vue.js安装与创建默认项目(详细步骤)

前言 上一篇博文已经对Node.js的安装与配置进行了详细介绍&#xff0c;详见https://blog.csdn.net/qq_42006801/article/details/124830995 另外&#xff1a;文中项目存放的路径及项目名称可根据自身实际情况进行更改。 一、Vue.js简述 Vue是一套用于构建用户界面的渐进式Ja…

基于React的富文本编辑器——Braft Editor使用

antd 是基于 Ant Design 设计规范实现的 高质量 React 组件库&#xff0c;倾向于只提供符合该规范且带有视觉展现的 UI 组件&#xff0c;也尽量不重复造轮子。 如果要在React项目中使用富文本编辑器&#xff0c;官方推荐使用 react-quill 与 braft-editor。 详细点击这里 这篇…

Vue3.0项目——打造企业级音乐App(二)图片懒加载、v-loading指令的开发和优化

系列文章目录 内容参考链接Vue3.0 项目启动Vue3.0 项目启动&#xff08;打造企业级音乐App&#xff09;Vue3.0项目——打造企业级音乐App&#xff08;一&#xff09;Tab栏、轮播图、歌单列表、滚动组件Vue3.0项目——打造企业级音乐App&#xff08;二&#xff09;图片懒加载、…

「Vue面试题」vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?

文章目录一、是什么二、如何做接口权限路由权限控制菜单权限方案一方案二按钮权限方案一方案二小结参考文章一、是什么 权限是对特定资源的访问许可&#xff0c;所谓权限控制&#xff0c;也就是确保用户只能访问到被分配的资源 而前端权限归根结底是请求的发起权&#xff0c;…

Code For Better 谷歌开发者之声——谷歌Web工具包(GWT)

&#x1f34e;个人主页&#xff1a;亮点菌的博客 &#x1f34a;个人信条&#xff1a;点亮编程之路&#xff0c;做自己的亮点 文章目录一、GWT简介二、运行模式1、开发模式&#xff08;以前称为托管模式&#xff09;2、生产模式&#xff08;以前称为Web模式&#xff09;三、组件…