redux VS mobx (装饰器配合使用)
前言:redux和mobx都是状态管理器,避免父级到子级再到子子级嵌套单向数据流,可以逻辑清晰的管理更新共享数据。(刷新页面redux储蓄数据即消失)
配置使用装饰器(使用高阶函数包装你的组件):
npm install babel-plugin-transform-decorators-legacy --save-dev
.babelrc配置:
{
"presets": [
"react-app"
],
"plugins": [
[
"import",
{
"libraryName": "antd",
"style": true
}
],
"transform-decorators-legacy"
]
}
当使用react native的时候,下面这个预设可以代替 transform-decorators-legacy
"babel": {
"presets": [
"react-app",
"react-native-stage-0/decorator-support"
]
},
一.redux
redux.js文件:
// 定义变量
const CODE_CHANGE = 'CODE_CHANGE'
const NUMBER_LIST = 'NUMBER_LIST'
const ERROR_MSG = 'ERROR_MSG' // 初始化数据
const initState = {
industryNumber: storage.get('industryNumber'),
numberList: [],
msg: ''
} // reducer
export function isNumber(state = initState, action) {
switch (action.type) {
case CODE_CHANGE:
return { ...state, industryNumber: action.industryNumber }
case NUMBER_LIST:
return { ...state, numberList: action.numberList }
case ERROR_MSG:
return { ...state, msg: action.msg }
default:
return state
}
}
reducer.js文件:
import { combineReducers } from 'redux'
import { isNumber } from '/redux' export default combineReducers({ isNumber }) // 合并所有的reducer,并且返回
index.js入口文件:
import React from 'react'
import ReactDOM from 'react-dom'
import MainRouter from './Router'
// 引入redux
import { createStore, applyMiddleware, compose } from 'redux'
importthunk from 'redux-thunk' // 中间插件,增强dispatch功能,可异步加载action可接受函数参数
import { Provider } from 'react-redux' //redux组件,全部子级可以直接更新redux的state
import reducers from './reducer'
// 这里判断浏览器环境是否开启Redux DevTools的插件(chrome浏览器扩展插件应用商店下载)
const reduxDevtools = window.devToolsExtension ? window.devToolsExtension() : h => h //没有插件则返回空函数
const store = createStore(reducers, compose( applyMiddleware(thunk), reduxDevtools )) // 创建store
ReactDOM.render(
<Provider store={store}>
<MainRouter/> //路由
</Provider>,
document.getElementById('root')
)
某子组件:
import { connect } from 'react-redux' // 装饰器 const fetchNumberList = () => {
return dispatch => { // 异步请求需要 dispatch => {}包裹
fetch('异步请求').then(res => {
if (res.code === 0) {
dispatch({ type: 'NUMBER_LIST', numberList: res.data })
}
})
}
} @connect(
state => state.isNumber, // 如果有多个reducer: state => ({ ..state.isNumber, ...state.someName })
{ fetchNumberList } // 一些之前写好的action方法
) class IndustryManagement extends Component {
constructor(props) {
super(props)
this.state= {
industryNumber: this.props.industryNumber && this.props.industryNumber[0], // 直接props引用redux的state
}
} btnChange() {
this.props.fetchNumberList() //经过装饰器的函数都可用props引用
} render() {
return (
<button onClick={ this.btnChange.bind(this) }>
)
}
}
二. mobx
这里推荐使用mobx-state-tree的写法,有兴趣的可去github上看用法,以下是传统写法:
store.js文件:
import { observable, action, runInAction } from 'mobx'
// runInAction接受异步action
class RootStore {
@observable userInfo = null //注册变量并监视变化(可以是引用类型值或者普通值) @observable number1 = 1 @observable number2 = 2 @computed getTotal(){
return this.number1 + this.number2 // 每当监视数据发生变化就会执行@computed
} @action.bound getData= async() => { // bound是为了绑定this上下文(箭头函数可不需要)
let res = await get('接口地址')
if (res.success) {
runInAction(() => { // runInAction函数可异步修改@observable数据
this.userInfo = res.data
})
}
}
} export default rootStore = new RootStore()
index.js入口文件:
import { Provider } from 'mobx-react' // 与上文的redux的Provider相似
import rootStore from './store'
ReactDOM.render(
<Provider rootStore={rootStore}>
<MainRouter />
</Provider>,
document.getElementById('root')
)
某子组件:
import { observer, inject } from 'mobx-react' @inject(({store, otherStore}) => ({ // 选择注入store(如果有多个store),如果不用inject函数可直接import store from '../store',组件中直接store.userInfo使用
userInfo: store.userInfo,
total: store.getTotal
})) @observer
class EmpRec extends Component {
constructor(props) {
super(props)
} render() {
return(
<div>
<div>this.props.userInfo</div>
<div>this.props.total</div>
</div>
)
}
}
.
redux VS mobx (装饰器配合使用)的更多相关文章
- react mobx 装饰器语法配置
1.弹出项目配置 npm run eject 此处注意,若弹出项目配置失败,请先执行以下两行代码(我的项目执行上一句都会报错,所以都会执行) 1.git add . 2.git commit -m & ...
- 解决用creact-react-app新建React项目不支持 mobx装饰器模式导致报错问题 。
创建react项目 create-react-app mobx-demo cd my-app npm run start 使用react-app-rewired npm install customi ...
- MobX基础 ----- 类的静态属性和装饰器
当我们使用MobX的时候,首先要声明一个store, 用来保存状态,它的最基本的语法 如下: class Todo { @observable title = ""; @obser ...
- 关于Mobx中装饰器语法的环境配置
1.弹出项目配置 npm run eject 此处注意,若弹出项目配置失败,请先执行以下两行代码(若没有安装git则请跳过,本人是在安装git的情况下解决问题的) 1.git add . 2.git ...
- create-react-app 构建的项目使用 mobx (说到底就是为了使用装饰器语法对 babel 做些配置
在 create-react-app 命令行构建的 React 项目中使用 Mobx 会出现如下警告: Support for the experimental syntax 'decorators- ...
- redux和mobx比较(二)
Redux Redux 是 JavaScript 状态容器,提供可预测化的状态管理. 三大核心 在 Redux 中,最为核心的概念就是 action .reducer.store 以及 state,那 ...
- Decorator - 利用装饰器武装前端代码
历史 以前做后端时,接触过一点Spring,也是第一次了解DI.IOC等概念,面向切面编程,对于面向对象编程还不怎么熟练的情况下,整个人慌的一批,它的日志记录.数据库配置等都非常方便,不回侵入到业务代 ...
- redux和mobx入门使用
redux和mobx入门使用 项目涉及技术 公共插件 create-react-app react-dom react-router react-router-dom react-hook redux ...
- python学习笔记-(八)装饰器、生成器&迭代器
本节课程内容概览: 1.装饰器 2.列表生成式&迭代器&生成器 3.json&pickle数据序列化 1. 装饰器 1.1 定义: 本质上是个函数,功能是装饰其他函数—就是为其 ...
随机推荐
- RQNOJ123_多人背包_C++_Pascal
题目:http://www.rqnoj.cn/problem/123 不得不说,RQNOJ 的机子跑得好慢呀,5*107 的数据范围本地跑 0.2s,服务器上愣是把我卡掉了,最后只好写了一份 Pasc ...
- EditText双光标问题
模拟器会出现中双的光标 从没有字符开始输入多了一个竖线怎么回事?光标丢失就好了,下面是手机情况 修改样式更换一个样式试试看:比如我以前的是 android:theme="@android ...
- Appium+python自动化1-环境搭建(上)【转载】
前言 appium可以说是做app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本语言也是支持java和Python.小编擅长Python,所以接下来的教程是appium+py ...
- android 使用 LocalStorage
PS:本身是.net 出身 因为项目需要 研究了好几天安卓 这个方法网上也有 自己也写出来 有时间自己看看 和 给还没有解决问题的朋友借鉴下,下面有标个重点 是允许使用localstorage 的关键 ...
- git提交代码出现错误fatal: Unable to create '项目路径/.git/index.lock': File exists.
git提交代码出现错误fatal: Unable to create '项目路径/.git/index.lock': File exists. 具体出错代码如下: 具体原因不详,在stackoverf ...
- 用SparkSQL构建用户画像
用SparkSQL构建用户画像 二. 前言 大数据时代已经到来,企业迫切希望从已经积累的数据中分析出有价值的东西,而用户行为的分析尤为重要. 利用大数据来分析用户的行为与消费习惯,可以预测商品的发展 ...
- LIS【p1704】寻找最优美做题曲线
Description 洛谷OJ刷题有个有趣的评测功能,就是系统自动绘制出用户的"做题曲线".所谓做题曲线就是一条曲线,或者说是折线,是这样定义的:假设某用户在第b[i]天AC了c ...
- hiho一下第131周 后缀自动机二·重复旋律8(循环相似子串)
后缀自动机五·重复旋律8 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 小Hi ...
- Tomcat配置和Spring MVC配置
Tomcat启动时,先找系统变量CATALINA_BASE,如果没有,则找CATALINA_HOME.然后找这个变量所指的目录下的conf文件夹,从中读取配置文件.最重要的配置文件:server.xm ...
- POJ2955 Brackets(区间DP)
给一个括号序列,求有几个括号是匹配的. dp[i][j]表示序列[i,j]的匹配数 dp[i][j]=dp[i+1][j-1]+2(括号i和括号j匹配) dp[i][j]=max(dp[i][k]+d ...