react状态管理方案有不少,其中最简单的最经常使用的是redux。react
redux作状态管理,是利用reducer和action实现的state的更新。 若是想要用redux,须要几个步骤git
建立actions.jsgithub
// actions.js export const SET_NAME = 'SET_NAME'; export const setName = (name) => { return { type: SET_NAME, name, } }
建立reducers.jsredux
// reducers.js import {SET_NAME} from './actions'; const nameState = (state = '', action) => { switch(action.type) { case SET_NAME: { return action.name; } default: { return state; } } } export default nameState;
项目的入口文件app
// index.js import React from 'react' import { render } from 'react-dom' import { Provider } from 'react-redux' import { createStore } from 'redux' import rootReducer from './reducers' import App from './App' const store = createStore(rootReducer) render( <Provider store={store}> <App /> </Provider>, document.getElementById('root') )
业务组件代码dom
import React, { Component } from 'react'; import { connect } from 'react-redux'; import {setName} from './actions'; class App extends Component { constructor(props) { super(props); } handleClick() { this.props.setName('张三李四') } render() { return ( <div> {this.props.name} <button onClick={this.handleClick.bind(this)}>修改name</button> </div> ) } } const mapStateToProps = (state) => { return { name: state.name, }; }; const mapDispatchToProps = (dispatch) => { return { setName(name) { dispatch(setName(name)); } } } export default connect(mapStateToProps, mapDispatchToProps)(App);
redux是状态管理工具,react-redux使得react组件能与redux结合。ide
Provider是一个高阶组件,他须要在最外层,才能实现store被全部子组件共享。函数
connect方法是将react组件链接store的方法。connect方法会将组件使用到的state和须要触发的action映射到react组件的属性上。工具
详解请看react-redux文档post
redux提供了很是系统完整的state管理方案,用文档里的一句话则是:
经过限制更新发生的时间和方式,Redux 试图让 state 的变化变得可预测.
由于他很完整,因此相对复杂,须要较多的配置。在小的项目中想要更简便的状态管理方案,因此抛弃redux,寻找其余方案。
目的就是使用起来最简单,所以我可能会这样用
// 组件中使用 import React, { Component } from 'react'; import {connect} from 'xubox'; class AA extends Component { constructor(props) { super(props) } handleClick() { // 给组件挂在setState$方法,在这里直接改变state值 this.props.setState$({ name: '张三李四' }) } render() { return ( <div> {this.props.name} <button onClick={this.handleClick.bind(this)}></button> </div> ) } } // 与redux同样,函数返回组件须要的state const mapStateToProps = (state) => { return { name: state.name, }; }; // 与redux同样用法,区别是只传递mapStateToProps一个参数 connect(mapStateToProps)(AA);
从代码看上去与redux好像,只不过少了dispatch缓解,改为了直接改变state。那其余设置呢?除了手动设置初始state值,其余不须要任何设置。
设置state的初始值
// 入口文件 import configureState from 'xubox'; configureState({ name: localStorage.getItem('name') || '无名氏' });
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import App from './app.js' import configure from 'xudux'; // 初始state let state = { name: '无名氏', }; configure(state); ReactDOM.render( <App /> , document.getElementById('root'));
app.js
import React, { Component } from 'react'; import { connect } from 'xudux'; class App extends Component { constructor(props) { super(props); } handleClick() { this.props.setState$({ name: '张三李四', }); } render() { return ( <div> {this.props.name} <button onClick={this.handleClick.bind(this)}>修改name</button> </div> ) } } const mapStateToProps = (state) => { return { name: state.name, }; }; export default connect(mapStateToProps)(App);
简单的两部就完成了状态管理。示例为一个组件内state渲染后视图,视图发起事件改变state,state改变引起视图的从新渲染。多组件间的通讯同理。
简单介绍xudux原理。原理很简单,connect造成高阶组件,在高阶组件内部监听state的变化,若是state变化则引起传入的react组件props发生变化,从而从新渲染。redux大概也是这样的逻辑。
setState$方法:此方法实际上是xudux内部更新state的方法,任何组件调用此方法会触发xudux中state更新,state更新会推送给全部组件,每一个组件判断自身的state是否改变,从而决定react组件是否更新。
有兴趣的大佬能够尝试一下 github