React-Mobx(入门)
创始人
2024-01-31 01:43:28
0

目录

1. Mobx介绍

优势 

社区评价

​编辑

 2.配置开发环境

3.基础使用

1)初始化mobx

2)React使用store

 4.计算属性(衍生状态)

 5.异步数据处理

6. 模块化

1)定义task模块 

 2)定义counterStore

3)组合模块导出统一方法

4)组件使用模块中的数据

7. 多组件共享数据

文章推荐


1. Mobx介绍

一个可以和React良好配合的集中状态管理工具,和Redux解决的问题相似,都可以独立组件进行集中状态管理

优势 

        1.简单:编写无模板的极简代码精准描述你的意图

        2.轻松实现最优渲染: 依赖自动追踪,实现最小渲染优化

        3.架构自由: 可移植, 可测试 无特殊心智负担

社区评价

 2.配置开发环境

Mobx是一个独立的响应式的库,可以独立于任何UI框架存在,但是通常大家习惯把它和React进行绑定使用,用Mobx来做响应式数据建模,React作为UI视图框架渲染内容,我们环境的配置需要三个部分

  1. 一个create-react-app创建好的React项目环境
  2. mobx框架本身
  3. 一个用来链接mobx和React的中间件
# 创建项目
$ yarn create vite react-mobx --template react# 安装mobx和中间件工具 mobx-react-lite  只能函数组件中使用
$ yarn add  mobx  mobx-react-lite

3.基础使用

        简单使用mobx实现一个计数器的案例

1)初始化mobx

初始化步骤

  1. 定义数据状态state
  2. 在构造器中实现数据响应式处理 makeAutoObservble
  3. 定义修改数据的函数action
  4. 实例化store并导出
//counterStore.js
import { makeAutoObservable } from 'mobx'class CounterStore {count = 0 // 定义数据constructor() {makeAutoObservable(this)  // 响应式处理}// 定义修改数据的方法addCount = () => {this.count++}
}const counter = new CounterStore()
export default counter

2)React使用store

实现步骤

  1. 在组件中导入counterStore实例对象
  2. 在组件中使用storeStore实例对象中的数据
  3. 通过事件调用修改数据的方法修改store中的数据
  4. 让组件响应数据变化
//App.js
// 导入counterStore
import counterStore from './store'// 导入observer方法
import { observer } from 'mobx-react-lite'function App() {return (
) } // 包裹组件让视图响应数据变化 export default observer(App)

 4.计算属性(衍生状态)

概念: 有一些状态根据现有的状态计算(衍生)得到,我们把这种状态叫做计算属性, 看下面的例子

 实现步骤

  1. 生命一个存在的数据
  2. 通过get关键词 定义计算属性
  3. 在 makeAutoObservable 方法中标记计算属性
//counterStore.js
import { computed, makeAutoObservable } from 'mobx'class CounterStore {list = [1, 2, 3, 4, 5, 6]constructor() {makeAutoObservable(this, {filterList: computed})}// 修改原数组changeList = () => {this.list.push(7, 8, 9)}// 定义计算属性get filterList () {return this.list.filter(item => item > 4)}
}const counter = new CounterStore()export default counter

 5.异步数据处理

实现步骤:

  1. 在mobx中编写异步请求方法 获取数据 存入state中
  2. 组件中通过 useEffect + 空依赖 触发action函数的执行
//channelStore.js
// 异步的获取import { makeAutoObservable } from 'mobx'
import axios from 'axios'class ChannelStore {channelList = []constructor() {makeAutoObservable(this)}// 只要调用这个方法 就可以从后端拿到数据并且存入channelListsetChannelList = async () => {const res = await axios.get('http://www.bai.net/channels')this.channelList = res.data.data.channels}
}
const channlStore = new ChannelStore()
export default channlStore
//App.js
import { useEffect } from 'react'
import { useStore } from './store'
import { observer } from 'mobx-react-lite'
function App() {const { channlStore } = useStore()// 1. 使用数据渲染组件// 2. 触发action函数发送异步请求useEffect(() => {channlStore.setChannelList()}, [])return (
    {channlStore.channelList.map((item) => (
  • {item.name}
  • ))}
) } // 让组件可以响应数据的变化[也就是数据一变组件重新渲染] export default observer(App)

6. 模块化

场景: 一个项目有很多的业务模块,我们不能把所有的代码都写到一起,这样不好维护,提了提供可维护性,需要引入模块化机制 

实现步骤

  1. 拆分模块js文件,每个模块中定义自己独立的state/action
  2. 在store/index.js中导入拆分之后的模块,进行模块组合
  3. 利用React的context的机制导出统一的useStore方法,给业务组件使用

1)定义task模块 

import { makeAutoObservable } from 'mobx'class TaskStore {taskList = []constructor() {makeAutoObservable(this)}addTask () {this.taskList.push('vue', 'react')}
}const task = new TaskStore()export default task

 2)定义counterStore

import { makeAutoObservable } from 'mobx'class CounterStore {count = 0list = [1, 2, 3, 4, 5, 6]constructor() {makeAutoObservable(this)}addCount = () => {this.count++}changeList = () => {this.list.push(7, 8, 9)}get filterList () {return this.list.filter(item => item > 4)}
}const counter = new CounterStore()export default counter

3)组合模块导出统一方法

import React from 'react'import counter from './counterStore'
import task from './taskStore'class RootStore {constructor() {this.counterStore = counterthis.taskStore = task}
}const rootStore = new RootStore()// context机制的数据查找链  Provider如果找不到 就找createContext方法执行时传入的参数
const context = React.createContext(rootStore)const useStore = () => React.useContext(context)
// useStore() =>  rootStore  { counterStore, taskStore }export { useStore }

4)组件使用模块中的数据

import { observer } from 'mobx-react-lite'
// 导入方法
import { useStore } from './store'
function App() {// 得到storeconst store = useStore()return (
) } // 包裹组件让视图响应数据变化 export default observer(App)

7. 多组件共享数据

目标:当数据发生变化 所有用到数据的组件都会得到同步的组件的更新

实现步骤:在Foo组件和Bar组件中分别使用store中的数据,然后在app组件中进行数据修改,查看Foo组件和Bar组件是否得到更新

// Bar.js
// 用taskStore中的taskList数据
import { useStore } from './store'
import { observer } from 'mobx-react-lite'
const Bar = () => {const { taskStore } = useStore()return (
    {taskStore.taskList.map((item) => (
  • {item}
  • ))}
) }export default observer(Son)
//Foo.js
// 用taskStore中的taskList数据
import { useStore } from './store'
import { observer } from 'mobx-react-lite'
const Bar = () => {const { taskStore } = useStore()return (
    {taskStore.taskList.map((item) => (
  • {item}
  • ))}
) }export default observer(Son)
//App.js
import Bar from './Bar'
import Foo from './Foo'
import { useStore } from './store'
function App() {const { taskStore } = useStore()return (
) } export default App

文章推荐

        1.React组件(进阶--children/props) 

        2.React组件(进阶--生命周期 ) 

        3.React--hooks详解(入门) 

        4.React--hooks详解(进阶) 

        5.React-Router详解(入门) 

相关内容

热门资讯

王毅同沙特外交大臣会谈:沙方重... 为加强中国同沙特关系,应沙特阿拉伯王国外交大臣费萨尔邀请,中共中央政治局委员、中华人民共和国外交部长...
麻黄梁派出所抓好“主防”工作 ... ■记者 张壮壮 榆林市公安局榆阳分局麻黄梁派出所始终坚持以人民为中心的工作理念,坚持和发展新时代“...
今年降雪怎么不用融雪剂了?北京... 本文转自【北京晚报】; 往年雪后总要亮相的绿化带挡盐板“下岗”了。据北京晚报报道,今年北京明确在人行...
多地加快推进房屋体检制度,体检... 房子像人一样,要定期体检,以便及时发现安全隐患,确保房屋使用安全。近日,郑州、长沙、南通等多个城市纷...
重庆市城市管线条例 重庆市人民代表大会常务委员会公告 〔六届〕第102号 《重庆市城市管线条例》已于2025年11月28...
20州因签证问题起诉联邦政府,... 【环球时报特约记者 任重】据美国《新闻周刊》13日报道,当地时间12日,美国20个州起诉联邦政府,反...
水晶宫主帅格拉斯纳:0比3失利... 在12月15日的英超联赛中,水晶宫主场迎战曼城,最终以0比3的比分落败。这场比赛不仅对水晶宫来说是一...
明年将根据形势出台实施增量政策 ● 本报记者 熊彦莎 中央财办分管日常工作的副主任、中央农办主任韩文秀12月13日在中国国际经济交流...
“何晴告别仪式”将以家人送别的... 12月13日,著名演员何晴在北京安然离世,享年61岁。 记者从98版《水浒传》制片主任汪瑞处获悉,根...
外籍男子携带多件文物出境被查!... 12月14日,南都N视频记者从“海关发布”公众号获悉,近日,西九龙站海关查获出境旅客携带11件/套古...