React项目中使用Mobx状态管理(二)

并上一节使用的是普通的数据状态管理,不过官方推荐使用装饰器模式,而在默认的react项目中是不支持装饰器的,需要手动启用。

官方参考

一、添加配置

官方提供了四种方法,

方法一、使用TypeScript,顾名思义该方法是项目使用typescript时的配置

方法二、使用babel-preset-mobx, 安装并添加到.babelrc配置中,该方法需要升级一些依赖,

  babel-core -> @/babel-core 7.x

  babel-loader -> @/babel-loader 8.x

  babel-preset-env -> @/babel-preset-env

  babel-preset-react -> @babel-preset-react

  

同时需要修改.babelrc配置,相当麻烦

方法三、使用babel-plugin-transform-decorators-legacy, 安装并添加到.babelrc即可, 但需要注意的是必须将其放在其他插件之前。

方法四、在create-react-app中使用,需要eject或者使用react-app-rewired-mobx

  1. 使用eject时 ($ npm run eject),是将项目的配置文件全部暴露出来,注意该操作不可逆,然后再使用方法二或者方法三进行配置

  2. 使用react-app-rewired-mobx是为了避免eject项目, 安装模块后在项目根目录新建文件config-overrides.js

1 const rewireMobX = require(‘react-app-rewire-mobx‘);
2
3 /* config-overrides.js */
4 module.exports = function override(config, env) {
5   config = rewireMobX(config, env);
6   return config;
7 }

综合以上方法,显而易见方法三最简单而且不易出错。

二、修改业务代码

  1. 根组件不变

 1 import React from ‘react‘;
 2 import appState from ‘./store‘;
 3 import Todo from "./components/Todo";
 4
 5 export default class App extends React.Component {
 6   render() {
 7     return (
 8       <div className=‘app‘>
 9         <Todo appState={appState}/>
10       </div>
11     )
12   }
13 }

  2 . 修改store

 1 import {observable, action } from ‘mobx‘
 2   // 常量改成类
 3 class AppState {   // 装饰器@
 4   @observable timer = 0
 5
 6   @action
 7   resetTimer() {
 8     this.timer = 0;
 9   }
10
11   @action.bound
12   increase() {
13     console.log(‘increase‘)
14     this.timer++;
15   }
16 }
17 // 将类实例化,后再暴露, 也可以先导出再在组件使用时再实例化
18 const appState = new AppState()  // 外部调用类的方法
19 setInterval(appState.increase, 1000)
20
21 export default appState;

  3 . 修改子组件,(将observer改成@observer放在类的前面即可)

 1 import React, {Component} from ‘react‘;
 2 import { observer } from ‘mobx-react‘;
 3
 4 // 装饰器方式@
 5 @observer
 6 class TodoList extends Component {
 7
 8   constructor(props) {
 9     super(props);
10   }
11   // 该绑定方式属于ES7,需要添加预设babel-preset-stage-2
12   _resetTimer = ()=> {
13     this.props.appState.resetTimer()
14   }
15   _increase = () => {
16     this.props.appState.increase()
17   }
18
19   render() {
20     return (
21       <div>
22         <h2>TodoList</h2>
23         <p>{this.props.appState.timer}</p>
24         <button onClick={this._resetTimer}>复位</button>
25         <button onClick={this._increase}>增加</button>
26       </div>
27     );
28   }
29 }
30
31 // 直接导出类组件
32 export default TodoList;

修改完毕,项目正常运行。

原文地址:https://www.cnblogs.com/hughes5135/p/10201936.html

时间: 2024-10-11 16:13:31

React项目中使用Mobx状态管理(二)的相关文章

react项目的中使用mobx状态管理安装ES7装饰器(Decorator)语法教程

那么如何实现装饰器的使用呢? 1.在命令行工具中使用 npm run eject.不熟的情况下可能会报错,如果报错的信息大概意思是:有些文件未被追踪到,那么直接git add . 再 git commit -m "",或者直接在.gitignore中忽略这些文件(不建议)2.npm run eject之后package.json中会出现很多依赖建议yarn/npm i 一下.3.然后打开package.json文件,找到“babel”开头的一个对象,(一般在最后,),这是原始的样子:

在react项目中启用mobx的配置方法

1.安装插件 npm install --save-dev babel-preset-mobx mobx mobx-react 2.package.json配置 { "presets": ["mobx"] } 参考:https://cn.mobx.js.org/best/decorators.html 原文地址:https://www.cnblogs.com/piaobodewu/p/10505614.html

BOS项目 第10天(activiti工作流第二天,流程变量、组任务、排他网关、spring整合activiti、项目中实现流程定义管理)

BOS项目笔记 第10天 今天内容安排: 1.流程变量(设置.获取) 2.组任务(候选人.候选组) 3.排他网关使用 4.spring整合activiti 5.将activiti应用到bos项目中 6.在bos项目中实现流程定义管理(部署.查询.查看png.删除) 1. 流程变量 1.1 设置流程变量的方式 l 方式一:启动流程实例时设置 l 方式二:办理任务时设置 l 方式三:使用RuntimeService的set方法设置 l 方式四:使用TaskService的set方法设置 注意:如果设

(译) Google Flutter 中的简单状态管理

原文链接 我是如何遇见 Google Flutter的 这对我来这是像往常一样的码代码的一天.我的一个朋友在我们的开发者群组中发了这么一个问题,是否有人尝试过Google Flutter.它想要知道React Native 和 Google Flutter之间的比较.这个问题让我种草了Google Flutter.我之前从没有听过Google Flutter.它是否值得与React Native进行比较,就像AngularJS相较于ReactJS? 我必须承认.我是一个React的迷弟.我已经使

深入浅出TypeScript(5)- 在React项目中使用TypeScript

前言 在第二小节中,我们讨论了利用TypeScript创建Web项目的实现,在本下节,我们讨论一下如何结合React创建一个具备TypeScript类型的应用项目. 准备 Webpack配置在第二小节项目的基础上做了一些修改, 添加React相关依赖:react.react-dom.@types/react 和@types/react-dom 修改Webpack配置文件 修改webpack.base.config.js,其余文件和第二小节保持一致,修改如下: const HtmlWebpackP

java框架-----spring框架------在自己的项目中如何用maven管理spring相关jar包

1.文章内容概述: spring框架是支持maven的,因为spring框架的所有模块打包而成的jar包以及spring所依赖的其他jar包都被存放了一份在maven的中央仓库中,如果你的项目使用maven进行管理,那么你就可以在你的项目中通过maven来引入你的项目所依赖的spring相关的jar包或其他依赖库. 2.spring框架中maven相关的东西: 概述:使用maven管理spring相关的jar包,需要在pom.xml中配置groupId.artifactId之类的东西,只有在po

(21)项目中Hibernate Session的管理方式

1.openSession和getCurrentSession的区别 package com.rk.hibernate.cache; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.junit.Test; public class App_SessionInProject { private static Se

react项目中遇到的BUG

前情提要:最近在学习react,然后就将项目中遇到的bug总结下来,作为借鉴! 项目结构: demo |app |app.js |main.js |center.js |toutiao.js |quanzi.js |shipin.js |dinggou.js |style.css |build |index.html |.babelrc |package.json |node_modules |webpack.config.js html文件: <!DOCTYPE html> <html

react项目中引用amap(高德地图)坑

最近在写一个react项目,用到了需要定位的需求,于是乎自己决定用高德地图(AMap),但是react官方文档的案列很少,大多都是原生JS的方法. 在调用amap的 Geocoder Api 时,一直不能从AMap对象下找到Geocoder 的方法, 后来花了几个小时的时间找问题在哪 结果在index中引入链接时,需要在链接上配置plugin=AMap.Geocoder, 才能够在AMap调用Geocoder Api. 下面是例子: <script type="text/javascrip