我是一个不信邪的人,所以无论如何我也要把这个搞明白
先来看下直接在React中使用Redux
|
|
那么为什么还要使用react-redux呢?
React推崇的是单向数据流,自上而下进行数据的传递,但是由下而上或者不在一条数据流上的组件之间的通信就会变的复杂。解决通信问题的方法很多,如果只是父子级关系,父级可以将一个回调函数当作属性传递给子级,子级可以直接调用函数从而和父级通信。
组件层级嵌套到比较深,可以使用上下文getChildContext来传递信息,这样在不需要将函数一层层往下传,任何一层的子级都可以通过this.context直接访问。
兄弟关系的组件之间无法直接通信,它们只能利用同一层的上级作为中转站。而如果兄弟组件都是最高层的组件,为了能够让它们进行通信,必须在它们外层再套一层组件,这个外层的组件起着保存数据,传递信息的作用,这其实就是redux所做的事情。
组件之间的信息还可以通过全局事件来传递。不同页面可以通过参数传递数据,下个页面可以用location.param来获取。其实react本身很简单,难的在于如何优雅高效的实现组件之间数据的交流。
###1Provider核心源码
Provider是一个组件,它接受store作为props,然后通过context往下传,这样react中任何组件都可以通过context获取store。也就意味着我们可以在任何一个组件里利用dispatch(action)来触发reducer改变state,并用subscribe监听state的变化,然后用getState获取变化后的值。但是并不推荐这样做,它会让数据流变的混乱,过度的耦合也会影响组件的复用,维护起来也更麻烦。
|
|
|
|
使用如下:provider的主要作用就是将store作为props对象中的一个属性传递给Provider实例化的之后的对象
|
|
此时store是Provider对象的props中的一个属性之一.
=========
after four hours 我有点信邪了 , 毕竟我是才学这个的小白.
Provider
内的任何一个组件(比如这里的 FilterLink
),如果需要使用 store
中的数据,就必须是「被 connect 过的」组件——使用 connect
方法对「你编写的组件(Link
)」进行包装后的产物。
|
|
2 connect函数 connect(mapStateToProps, mapDispatchToProps, mergeProps)
Connects a React component to a Redux store.
It does not modify the component class passed to it. Instead, it returns a new, connected component class, for you to use.
connect函数的主要作用是将React组件和Redux的store联系起来
往根本去说其实是将redux的store对象中的 state dispatch 这些属性添加(映射)到 react组件的props属性上
|
|
而connect函数的作用就是向props组件中添加属性
|
|
2.1 看一个组件的声明
Link.js 组件
|
|
为了方便大家看懂bable转码如下
|
|
2.2 这个时候我们需要注意下{ active, children, onClick }来自何方?
FilterLink.js(container容器)
|
|
- mapStateToProps(state,ownProps) 这个函数的作用就是将store对象中的state状态赋值给组件的props属性
- mapDispatchToProps(dispatch, ownProps)这个函数的作用就是将store对象中dispatch方法给到props属性
源码暂时没有告破