mobx是一个可以和react良好配合的集中状态管理工具,相当于vue和vuex
1、mobx依赖包下载
npm install mobx mobx-react-lite
2、mobx使用
新建一个store文件
import { makeAutoObservable } from 'mobx'
class CounterStore {
// 定义数据
count = 0
constructor() {
// 把数据弄成响应式
makeAutoObservable(this)
}
addCount = () => {
// 定义action函数
this.count++
}
}
const counterStore = new CounterStore()
export default counterStore
在组件中使用store中的数据
// 导入counterStore文件
import counterStore from '../store/counter'
// 导入中间件连接mobx react完成响应式变化
import { observer } from 'mobx-react-lite'
function Layout() {
return (
<div>
{/* 渲染数据 */}
<h2>{counterStore.count}</h2>
<button onClick={counterStore.addCount}>点击加一</button>
</div>
)
}
// 包括Layout组件
export default observer(Layout)
3、mobx计算属性——computed
- 声明一个存在的数据
- 定义get计算属性
- 在makeAutoObservable方法中标记(不标记也能生效)
store文件
import { computed, makeAutoObservable } from 'mobx'
class CounterStore {
// 定义原始数据
list = [1, 2, 3, 4, 5]
constructor() {
makeAutoObservable(this, {
filterList: computed,
number: computed,
})
}
get filterList() {
return this.list.filter((item) => item > 2)
}
get number() {
return this.list[0]
}
}
const counterStore = new CounterStore()
export default counterStore
组件中使用
// 导入counterStore文件
import counterStore from '../store/counter'
// 导入中间件连接mobx react完成响应式变化
import { observer } from 'mobx-react-lite'
function Layout() {
return (
<div>
{/* 渲染数据 */}
<h2>{counterStore.filterList.join('-')}</h2>
<h2>{counterStore.number}</h2>
</div>
)
}
// 包括Layout组件
export default observer(Layout)
4、mobx模块化——用于组合子模块
1、新建一个counter.js
import { makeAutoObservable } from 'mobx'
class CounterStore {
// 定义数据
count = 1
constructor() {
makeAutoObservable(this)
}
getCount = (count) => {
this.count = count
}
}
export { CounterStore }
2、新建一个lister.js
import { makeAutoObservable } from 'mobx'
class ListStore {
list = ['react', 'vue']
constructor() {
makeAutoObservable(this)
}
addList = () => {
this.list.push('angular')
}
}
export { ListStore }
3、新建index.js,用于组合子模块,封装统一导出的供业务使用的方法
import React from 'react'
import { CounterStore } from './counter'
import { ListStore } from './lister'
// 1、声明一个rootstore
class RootStore {
constructor() {
// 对子模块进行实例化操作
this.counterStore = new CounterStore()
this.listStore = new ListStore()
}
}
// 使用react context机制,完成统一方法封装
const rootStore = new RootStore()
// 查找机制:useContext 优先从Provider value找,如果找不到,就会找createContext方法传递过来的默认参数
const context = React.createContext(rootStore)
// 通过useContext拿到rootStore实例对象 然后返回
const useStore = () => React.useContext(context)
// 导出useStore方法,供组件通过调用该方法使用根实例
export default useStore
4、在组件中使用
// 导入useStore
import useStore from '../store/index'
// 导入中间件连接mobx react完成响应式变化
import { observer } from 'mobx-react-lite'
function Layout() {
// 解构赋值
const { counterStore, listStore } = useStore()
return (
<div>
{/* 渲染数据 */}
<h2>{counterStore.count}</h2>
<h2>{listStore.list.join('-')}</h2>
<button onClick={() => counterStore.getCount(5)}>count赋值</button>
</div>
)
}
// 包裹Layout组件
export default observer(Layout)