react-redux
我们知道redux是:store中维护了一个state,当我们view层dispatch了一个action,然后reducer根据这个action来更新state。 而react-redux呢,是react和redux的一个桥梁,也不是说没有他 react和redux不能使用,而是他做了一些封装,使得开发者能够更方便的使用redux react-redux将组件分成两种: 1、容器组件(智能组件):容器组件负责做数据交互 2、UI组件(木偶组件):UI组件嵌套在容器组件里,只负责使用数据来显示数据
比起redux新增 两个模块
1、Provider 组件来对Router进行包裹,并传入store,这样在内部组件的其他组件都可以共享store的数据 并且对其进行更改
在根组件中导入 import {Provider} from 'react-redux' ... import store from './javascripts/redux/store' ReactDOM.render( <Provider store={store} > <Router history={hashHistory}> <Route path="/" component={App}> <IndexRoute component={A}/> <Route path="/a" component={A}></Route> <Route path="/b" component={B}></Route> </Route> </Router> </Provider>,document.getElementById("app"))
2、connect 是将store中的数据通过props来显示在view层,并封装一个函数来响应用户操作时dispatch的action
import {connect} from 'react-redux' import Actions from './redux/actionCreator' ... const mapStateToProps = (state) => { return { todos: getVisibleTodos(state.todos,state.visibilityFilter) } } const mapDispatchToProps = ( dispatch,ownProps ) => { return { onClick: () => { dispatch({ type: 'SET_VISIBILITY_FILTER',filter: ownProps.filter }); } }; } export default connect(mapStateToProps,mapDispatchToProps)(A) view层: <div>{this.props. todos}</div>
解析: connect接受的两个参数
-
mapStateToProps
是对store里的state和组件里的props对象形成映射关系, 每当store中的state有所更新,就会自动执行,重新计算,从而重新render 当然,他可以穿两个参数(state,ownProps) 这里如果容器组件里的ownprops改变,也会从新渲染 eg: // 容器组件的代码 <FilterLink filter="SHOW_ALL"> All </FilterLink> const mapStateToProps = (state,ownProps) => { return { active: ownProps.filter === state.visibilityFilter } } 他可以接收state参数,并返回一个对象,这样你就可以在这里进行对数据的处理 eg: const mapStateToProps = (state) => { return { todos: getVisibleTodos(state.todos,state.visibilityFilter) } }
-
mapDispatchToProps
这个函数或对象 是用来将用户的action传给store,他可以是一个函数,也可以是一个对象 函数: const mapDispatchTopProps = (dispatch,ownProps) = > { return { onClick: () => { dispatch({ type: 'ADD_NUM',filter:ownProps.filter }) } } } 这里,作为函数,他返回一个对象,对象里的键值对定义了ui组件的参数怎么发出action 对象: const mapDispatchToProps = { onClick: (filter) => { type: 'ADD_NUM',filter: filter }; } 这里,是将上面的函数写成对象形式
这一块就写到这里,如果有新的感悟会加进来....