React-Redux的用法
基本流程1.UI组件Example,只接受this.props数据,包括reducer出来的数据state, import React,{ Component } from 'react'; import { render } from 'react-dom'; import { createStore } from 'redux'; import { Provider,connect } from 'react-redux'; import reducer from '../reducers/reducer6.js'; import { addAction,delAction } from '../actions/action2.js'; import Example from '../components/Example5.js'; const store = createStore(reducer); function mapStateToProps(state) { return { count: state.count }; } function mapDispatchToprops(dispatch) { return { add: () => dispatch(addAction()),del: () => dispatch(delAction()) }; } const App = connect(mapStateToProps,mapDispatchToprops)(Example) render( <Provider store={ store }> <App /> </Provider>,document.getElementById('root') ); import React,{ Component } from 'react'; class Example extends Component { render() { const { count,add,del } = this.props; return ( <div> <p>count: { count }</p> <p><button onClick={ add }>add</button></p> <p><button onClick={ del }>del</button></p> </div> ); } } export default Example; UI组件1.React-Redux将所有组件分成两大类:UI组件和容器组件. import React,{ Component } from 'react'; class Counter extends Component { render() { const { value,onIncreaseClick } = this.props; return ( <div> <span>{ value }</span> <button onClick={ onIncreaseClick }>Increase</button> </div> ); } } export default Counter; 1.只负责UI的呈现,不带有任何业务逻辑 2.没有状态(即不使用this.state这个变量) 3.所有数据都由参数(this.props)提供 4.不适用任何redux的API 因为不含有状态,UI组件又被称为'纯组件',即它跟纯函数一样,纯粹由参数决定它的值. 容器组件// Action const increaseAction = { type: 'increase' }; // Reducer function counter(state = { count: 0 },action) { const count = state.count; switch (action.type) { case 'increase': return { count: count + 1 } default: return state; } } // Store const store = createStore(counter); // Map Redux state to component props function mapStateToProps(state) { return { value: state.count }; } // Map Redux actions to component props function mapDispatchToProps(dispatch) { return { onIncreaseClick: () => dispatch(increaseAction) }; } // Connected Component const App = connect(mapStateToProps,mapDispatchToProps)(Counter); 容器组件的特征恰恰相反 1.负责管理数据和业务逻辑,不负责UI的呈现 2.带有内部状态 3.使用redux的API UI组件负责UI的呈现,容器组件负责管理数据和逻辑. connect()react-redux提供connect方法,用于从UI组件生成容器组件. 1.输入逻辑:外部的数据(即state对象)如何转化为UI组件的参数. 2.输出逻辑:用户发出的动作如何变为Action对象,从UI组件传出去 connect方法接受两个参数:mapStateToProps和mapDispatchToProps,他们定义了UI组件的业务逻辑, mapStateToProps()mapStateToProps是一个函数,它的作用就是像它的名字那样,建立一个从(外部的)state对象到(Ui组件的)props对象的映射关系. mapDispatchToPropsmapDispatchToProps是connect函数的第二个参数,用来建立UI组件的参数到store.dispatch方法的映射, <Provider>组件connect方法生成容器组件以后,需要让容器组件拿到state对象,才能生成UI组件的参数. render( <Provider store={ store }> <App /> </Provider>,document.getElementById('root') ); React-Router路由库使用React-Router的项目,与其他项目也没有不同之处,也是使用Provider在Router外面包一层,毕竟Provider的唯一功能就是传入store对象. const root = ({ store }) => ( <Provider store={ store }> <Router> <Route path="/" component={ App }> </Router> </Provider> ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |