并上一节使用的是普通的数据状态管理,不过官方推荐使用装饰器模式,而在默认的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

 const rewireMobX = require('react-app-rewire-mobx');

 /* config-overrides.js */
module.exports = function override(config, env) {
config = rewireMobX(config, env);
return config;
}

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

二、修改业务代码

  1. 根组件不变

 import React from 'react';
import appState from './store';
import Todo from "./components/Todo"; export default class App extends React.Component {
render() {
return (
<div className='app'>
<Todo appState={appState}/>
</div>
)
}
}

  2 . 修改store

 import {observable, action } from 'mobx'

  // 常量改成类
class AppState {
   // 装饰器@
@observable timer = 0 @action
resetTimer() {
this.timer = 0;
} @action.bound
increase() {
console.log('increase')
this.timer++;
}
}
// 将类实例化,后再暴露, 也可以先导出再在组件使用时再实例化
const appState = new AppState()
  // 外部调用类的方法
setInterval(appState.increase, 1000) export default appState;

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

 import React, {Component} from 'react';
import { observer } from 'mobx-react'; // 装饰器方式@
@observer
class TodoList extends Component { constructor(props) {
super(props);
}
// 该绑定方式属于ES7,需要添加预设babel-preset-stage-2
_resetTimer = ()=> {
this.props.appState.resetTimer()
}
_increase = () => {
this.props.appState.increase()
} render() {
return (
<div>
<h2>TodoList</h2>
<p>{this.props.appState.timer}</p>
<button onClick={this._resetTimer}>复位</button>
<button onClick={this._increase}>增加</button>
</div>
);
}
} // 直接导出类组件
export default TodoList;

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

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

  1. React项目中使用Mobx状态管理(一)

    1.安装 $ yarn add mobx mobx-react 2.新建store/index.js,存放数据(以下思路仅限于父子组件的简单应用) 注意:这里暂时没使用装饰器@observable,装 ...

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

    1.安装插件 npm install --save-dev babel-preset-mobx mobx mobx-react 2.package.json配置 "dependencies& ...

  3. react项目中实现搜索关键字呈现高亮状态(一)

    最近有个需求,在一个react项目中,实现搜索关键字呈现高亮状态.这个在普通的html文件中还好操作些,在react项目中有点懵逼了,因为react项目中很少操作dom,有点无从下手.但最后还是实现了 ...

  4. mobx状态管理快速入门

    1.mobx状态管理   安装: creact-react-app mobx  

  5. 优雅的在React项目中使用Redux

    概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与React没有任何关系,其他UI框架也可以使用Redux react-redux React插件,作用:方便在 ...

  6. 如何在非 React 项目中使用 Redux

    本文作者:胡子大哈 原文链接:https://scriptoj.com/topic/178/如何在非-react-项目中使用-redux 转载请注明出处,保留原文链接和作者信息. 目录 1.前言 2. ...

  7. 如何优雅地在React项目中使用Redux

    前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...

  8. 【已解决】React项目中按需引入ant-design报错TypeError: injectBabelPlugin is not a function

    react项目中ant-design按需加载,使用react-app-rewired的时候报错 运行npm start或者yarn start报如下错误: TypeError: injectBabel ...

  9. react项目中使用less并修改antd主题样式

    一.react项目中使用less 1. 安装配置 npm i -D less less-loader 2. 查看webpack配置 npm run eject 此操作不可逆,生成新的目录. 3. 修改 ...

随机推荐

  1. tensorflow使用pb文件进行模型预测

  2. 【模板】HDU 1541 树状数组

    http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意:给你一堆点,每个点右一个level,为其右下方所有点的数量之和,求各个level包含的点数. 题解: ...

  3. C和C指针小记(八)-操作符、左值右值

    1.移位操作符 移位操作符分为左移操作符(<<)和右移操纵符(>>) 对于无符号数:左右位移操作都是逻辑位移 对于有符号数:到底是采用逻辑位移还是算术位移取决于编译器.如果一个 ...

  4. iOS FMDB的是使用和注意事项

    1.FMDB 默认的使用方法不是线程安全的. 2.Sqlite 默认不支持外键. 3.Sqlite 不支持用 ALTER 关键字给已有表添加外键约束 解决: 1.FMDBDatabaseQueue 2 ...

  5. dbclient python ---influxdb -install -relay--http write--read.[create db]

    1s=1000ms 1ms=1000 microseconds 1microsecond=1000 nanoseconds+01:00 from influxdb import InfluxDBCli ...

  6. LeetCode 1012 Complement of Base 10 Integer 解题报告

    题目要求 Every non-negative integer N has a binary representation.  For example, 5 can be represented as ...

  7. Java ServiceLoader(SPI)学习

    1. 几个不错的关于ServiceLoader的文章,大家可以先参考一下 1) http://www.myexception.cn/program/1355384.html 这篇的后面的问题分析不错 ...

  8. 【Python全栈-HTML】HTML入门

    HTML入门介绍 参考: https://www.bilibili.com/video/av21663728/?p=339 http://www.cnblogs.com/yuanchenqi/arti ...

  9. JDBC的简单封装

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  10. 计算机网络 0.初识Internet与TCP/IP协议

    互联网,即因特网,Internet.互联网是一个世界范围的计算机网络.连接了世界上无数的计算设备,这些计算设备为PC.基于Linux的工作站,serverservers等等. 这些设备依据其作用不同可 ...