react项目中使用mobx
创始人
2024-01-27 05:07:59

目录

  • 什么是mobx
  • 装饰器babel
    • 安装和注册装饰器
    • 理解装饰器
  • mobx
    • 安装mobx
    • 定义store
    • 项目全局注册store
    • 在类组件中使用mobx的store
    • 在函数组件中使用mobx的store
    • store与本地存储结合

什么是mobx

一个比redux简便的状态管理工具

装饰器babel

安装和注册装饰器

  1. 安装装饰器
npm i @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties -D 
  1. 在vite.config.js中注册装饰器
import { defineConfig } from "vite"
import react from "@vitejs/plugin-react"// https://vitejs.dev/config/
export default defineConfig({plugins: [react({babel: {plugins: [["@babel/plugin-proposal-decorators", { legacy: true }],["@babel/plugin-proposal-class-properties", { loose: true }],],},}),],
})
完成装饰器注册后,需要重启一次项目

理解装饰器

如下的代码,可以在控制台,看到Home这个类组件有个名为study的函数,@addFun这个装饰器,相当于起了和Home=addFun(Home)这句代码一样的作用。
注意:vscode中直接写装饰器会报错,在vscode的设置中搜索Experimental Decorators,启用这个选项即可。

import React, { Component } from "react"function addFun(ele) {ele.prototype.study = () => {console.log("新增的类方法")}return ele
}@addFun
class Home extends Component {render() {console.log(this)return (

主页

)} }export default Home

mobx

安装mobx

npm i mobx
npm i mobx-react

定义store

在src下新建store文件夹,在store下新建文件index.js,文件中代码如下:

import { makeAutoObservable } from "mobx"/* mobx6以上版本的定义store方式 */
class Store {constructor() {// 自动观察所有的state变量makeAutoObservable(this)}//定义一个state变量count = 0// 定义一个actionincrementCount() {this.count += 1}
}/* mobx6以下版本的定义store方式 */
// import { observable,action } from "mobx"
// class Store {
//   //定义一个state变量
//   @observable count = 0
//   // 定义一个action
//   @action incrementCount() {
//     this.count+=1
//   }
// }const store = new Store()
export default store

项目全局注册store

在main.jsx中做如下修改:

import React from "react"
import ReactDOM from "react-dom/client"
import App from "./App"
import "./index.css"
import store from "./store"
import { Provider } from "mobx-react"ReactDOM.createRoot(document.getElementById("root")).render(store}>
)

在类组件中使用mobx的store

注意,observer装饰器的作用

import React, { Component } from "react"
import { Link } from "react-router-dom"
// 引入store
import store from "../store"
import { observer } from "mobx-react"/* store中的方法调用并改变state中的变量后,组件不会重新render,
使用mobx-react中的observer装饰组件可以解决这个问题 */
@observer
class ClassEle extends Component {render() {return (

类组件页面

go fun页面

计数器

{/* 使用store中的变量和函数 */}
)} }export default ClassEle

在函数组件中使用mobx的store

import React from "react"
import { Link } from "react-router-dom"
import store from "../store"
import { observer } from "mobx-react"const FunEle = () => {return (

函数组件页面

go class页面

计数器

{/* 使用store中的变量和函数 */}
) } // 使用observer包裹函数组件,解决state中变量改变后,不自动render的问题 export default observer(FunEle)

store与本地存储结合

对store/index.js进行如下改写:

import { makeAutoObservable } from "mobx"// mobx6以上版本的定义store方式
class Store {constructor() {// 自动观察所有的state变量makeAutoObservable(this)}//定义一个state变量count = 0 || localStorage.getItem("count")// 定义一个actionincrementCount() {this.count += 1localStorage.setItem("count", this.count)}
}const store = new Store()
export default store

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
电脑c盘满了怎么办 如何深度清... 如果电脑在使用一段时间后,C盘莫名其妙满了,磁盘变成红色,那么大多数都是因为自己使用上的问题,不接受...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...