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

在React里面使用mobx状态管理详细步骤

1、安装MobX和MobX React:

在你的项目目录下运行以下命令安装MobX和MobX React:

npm install mobx mobx-react

2、创建MobX Store:

创建一个用于管理状态的MobX Store。这个Store应该包含你希望全局管理的状态和相关的操作。以下是一个简单的示例:

// store.js
import { makeAutoObservable } from 'mobx';class AppStore {counter = 0;constructor() {makeAutoObservable(this);}increment() {this.counter += 1;}decrement() {this.counter -= 1;}
}const appStore = new AppStore();
export default appStore;export const useStore = () => appStore;

3、使用MobX Provider:

在你的应用中,使用MobxProvider包裹整个应用,同时将创建的MobX Store传递给Provider:

import React from 'react';
import { Provider } from 'mobx-react';
import App from './App';
import store from './mobxStore/store';
import { createRoot } from 'react-dom/client';// 使用 ReactDOM.createRoot 创建 React 根节点
const root = createRoot(document.getElementById('root'));// 在根节点上渲染应用
root.render(<React.StrictMode>{/* 使用 MobxProvider 包裹整个应用,并传递 MobX Store */}<Provider store={store}><App /></Provider></React.StrictMode>
);

4、获取 MobX Store

在你的React组件中使用MobX状态和操作。你可以使用MobX提供的useStore hook或者@inject注解。

// App.js
import React from 'react';
import { useObserver } from 'mobx-react';
import { useStore } from './mobxStore';const App = () => {const store = useStore();return useObserver(() => (<div><h1>Counter: {store.counter}</h1><button onClick={() => store.increment()}>Increment</button><button onClick={() => store.decrement()}>Decrement</button></div>));
};export default App;
// mobxStore.js
import { createContext, useContext } from 'react';class AppStore {// ... (同上)
}const appStore = new AppStore();const MobxStoreContext = createContext();export const MobxProvider = ({ children }) => (<MobxStoreContext.Provider value={appStore}>{children}</MobxStoreContext.Provider>
);export const useStore = () => {const store = useContext(MobxStoreContext);if (!store) {throw new Error('useStore must be used within a MobxProvider');}return store;
};export default appStore;

5、@inject注解。是什么

在MobX中,@inject是一个装饰器(Decorator),它用于将数据注入到React组件中。该装饰器的作用是将指定的mobx store(或者stores)中的数据注入到组件的props中,以便在组件中直接访问mobx的状态和操作。

在使用@inject装饰器之前,你需要确保你的项目支持装饰器语法。如果你使用的是Create React App等工具,它们可能需要额外的配置。在许多现代React应用中,支持装饰器语法已经默认启用。

以下是一个简单的例子,演示了如何使用@inject

// mobxStore.js
import { observable, action } from 'mobx';class CounterStore {@observable count = 0;@action increment() {this.count += 1;}@action decrement() {this.count -= 1;}
}const counterStore = new CounterStore();
export default counterStore;
// App.js
import React from 'react';
import { observer, inject } from 'mobx-react';// 使用 @inject 注入 counterStore
@inject('counterStore')
@observer
class App extends React.Component {render() {const { counterStore } = this.props;return (<div><h1>Counter: {counterStore.count}</h1><button onClick={() => counterStore.increment()}>Increment</button><button onClick={() => counterStore.decrement()}>Decrement</button></div>);}
}export default App;

在这个例子中,@inject('counterStore')注入了一个名为counterStore的mobx store到App组件的props中。然后,@observer装饰器使得组件能够观察mobx状态的变化,实时更新UI。

请注意,@inject的参数是要注入的mobx stores的名称。在上述例子中,counterStore是一个实例,但你可以有多个不同的stores,然后在@inject中指定需要的stores名称。

在使用装饰器语法的同时,确保你的项目配置支持装饰器。在Create React App中,你可能需要使用react-app-rewired等工具来进行额外的配置。

相关文章:

  • Linux内核--进程管理(十二)LinuxIO基础知识与概念
  • uniapp自定义顶部导航并解决打包成apk后getMenuButtonBoundingClientRect方法失效问题
  • 华为“纯血”鸿蒙加速进场 高校、企业瞄准生态开发新风口
  • 安防监控EasyCVR视频融合/汇聚平台大华热成像摄像机智能告警上报配置步骤
  • 计算机算法贪心算法
  • 爆肝整理,接口测试+为什么要做接口测试总结,策底贯通...
  • 9.spring aop 原理
  • C++学习笔记(三十二):c++ 堆内存与栈内存比较
  • 什么是原生ip和广播ip
  • 记录汇川:H5U与Fctory IO测试8
  • 程序员英语 - 英文会议常用句型
  • Springboot+vue的毕业论文管理系统(有报告)。Javaee项目,springboot vue前后端分离项目
  • 国标28181平台的手机视频监控客户端的电子地图功能对比
  • 紫光展锐5G扬帆出海 | 欧洲积极拥抱更多5G选择
  • C++系列十五:字符串
  • 【Leetcode】101. 对称二叉树
  • Fundebug计费标准解释:事件数是如何定义的?
  • gitlab-ci配置详解(一)
  • Hexo+码云+git快速搭建免费的静态Blog
  • Mac转Windows的拯救指南
  • Promise初体验
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • springMvc学习笔记(2)
  • text-decoration与color属性
  • 后端_MYSQL
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 入口文件开始,分析Vue源码实现
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用common-codec进行md5加密
  • 微信小程序填坑清单
  • Java总结 - String - 这篇请使劲喷我
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (09)Hive——CTE 公共表达式
  • (AngularJS)Angular 控制器之间通信初探
  • (Forward) Music Player: From UI Proposal to Code
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (阿里云万网)-域名注册购买实名流程
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (原創) 未来三学期想要修的课 (日記)
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET Core 成都线下面基会拉开序幕
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net framework4与其client profile版本的区别
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET的微型Web框架 Nancy
  • .NET连接数据库方式
  • .NET正则基础之——正则委托
  • // an array of int
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @font-face 用字体画图标