Fork me on GitHub

redux VS mobx

前言:redux和mobx都是状态管理器,避免父级到子级再到子子级嵌套单向数据流,可以逻辑清晰的管理更新共享数据。

一.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文件:

// 合并所有的reducer,并且返回
import { combineReducers } from 'redux'
import { isNumber } from '/redux'

export default combineReducers({ isNumber })

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功能,可异步调用可接受函数参数
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 => {
    fetch('异步请求').then(res => {
      if (res.code === 0) {
        dispatch({ type: NUMBER_LIST, numberList: res.data })
      } 
    })
  }
}

@connect(
  state => state.isNumber,
  { fetchNumberList }  // 一些之前写好的方法
)
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) }>
       )
      }  
}    

 

posted @ 2018-04-18 12:02  天满  阅读(368)  评论(0编辑  收藏  举报