react状态管理方案有不少,其中最简单的最经常使用的是redux。javascript
redux作状态管理,是利用reducer和action实现的state的更新。 若是想要用redux,须要几个步骤java
建立actions.jsreact
// actions.js
export const SET_NAME = 'SET_NAME';
export const setName = (name) => {
return {
type: SET_NAME,
name,
}
}
复制代码
建立reducers.jsgit
// 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;
复制代码
项目的入口文件github
// 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')
)
复制代码
业务组件代码redux
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结合。app
Provider是一个高阶组件,他须要在最外层,才能实现store被全部子组件共享。dom
connect方法是将react组件链接store的方法。connect方法会将组件使用到的state和须要触发的action映射到react组件的属性上。ide
详解请看react-redux文档函数
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