首先我们来看看什么是 redux,react.
redux
redux 是一个 JavaScript 状态容器, 主要提供状态管理. 可以运行于服务端, 客户端, 原生应用. 除了支持 React 外还支持其他的 UI 框架, 体积小, 只有 2kb. 当要与 React 一起使用的时候, 可以使用 react-redux 插件来进一步提升我们的开发体验.
可以通过调用相应的 API 或者是以相应的机制改变这个容器中的数据就可以了, 其他组件可以通过主动重新从容器中获取新数据来重新进行渲染.
此外这个容器还需支持发布订阅机制, 即当某个数据改变了, 关心这个数据的组件就产即会得到通知.
react
react 是 Facebook 推出的一个用来构建用户界面的 JavaScript 库. React 主要用于构建 UI, 很多人认为 React 是 MVC 中的 V(视图).React 拥有较高的性能, 代码逻辑非常简单, 越来越多的人已开始关注和使用它.
React 是一个为数据提供渲染为 html 视图的开源 JavaScript 库. React 视图通常采用包含以自定义 HTML 标记规定的其他组件的组件渲染. React 为程序员提供了一种子组件不能直接影响外层组件的模型, 数据改变时对 HTML 文档的有效更新, 和现代单页应用中组件之间干净的分离.
学会用自己的思想来理解 React 和 Redux; 不能光听别人描述名词, 理解起来是很困难的.
从需求出发, 看看使用 React 需要什么:
1,React 有 props 和 state: props 意味着父级分发下来的属性, state 意味着组件内部可以自行管理的状态, 并且整个 React 没有数据向上回溯的能力, 也就是说数据只能单向向下分发, 或者自行内部消化.
理解这个是理解 React 和 Redux 的前提.
2, 一般构建的 React 组件内部可能是一个完整的应用, 它自己工作良好, 你可以通过属性作为 API 控制它. 但是更多的时候发现 React 根本无法让两个组件互相交流, 使用对方的数据.
然后这时候不通过 DOM 沟通 (也就是 React 体制内) 解决的唯一办法就是提升 state, 将 state 放到共有的父组件中来管理, 再作为 props 分发回子组件.
3, 子组件改变父组件 state 的办法只能是通过 onClick 触发父组件声明好的回调, 也就是父组件提前声明好函数或方法作为契约描述自己的 state 将如何变化, 再将它同样作为属性交给子组件使用.
这样就出现了一个模式: 数据总是单向从顶层向下分发的, 但是只有子组件回调在概念上可以回到 state 顶层影响数据. 这样 state 一定程度上是响应式的.
4, 为了面临所有可能的扩展问题, 最容易想到的办法就是把所有 state 集中放到所有组件顶层, 然后分发给所有组件.
5. 为了有更好的 state 管理, 就需要一个库来作为更专业的顶层 state 分发给所有 React 应用, 这就是 Redux. 让我们回来看看重现 ` 上面结构的需求:
需要回调通知 state (等同于回调参数) -> action
需要根据回调处理 (等同于父级方法) -> reducer
需要 state (等同于总状态) -> store
对 Redux 来说只有这三个要素:
action 是纯声明式的数据结构, 只提供事件的所有要素, 不提供逻辑.
reducer 是一个匹配函数, action 的发送是全局的: 所有的 reducer 都可以捕捉到并匹配与自己相关与否, 相关就拿走 action 中的要素进行逻辑处理, 修改 store 中的状态, 不相关就不对 state 做处理原样返回.
store 负责存储状态并可以被 react API 回调, 发布 action.
当然一般不会直接把两个库拿来用, 还有一个 binding 叫 react-redux, 提供一个 Provider 和 connect. 很多人其实看懂了 redux 卡在这里.
Provider 是一个普通组件, 可以作为顶层 App 的分发点, 它只需要 store 属性就可以了. 它会将 state 分发给所有被 connect 的组件, 不管它在哪里, 被嵌套多少层.
connect 是真正的重点, 它是一个科里化函数, 意思是先接受两个参数(数据绑定 mapStateToProps 和事件绑定 mapDispatchToProps), 再接受一个参数(将要绑定的组件本身):
mapStateToProps: 构建好 Redux 系统的时候, 它会被自动初始化, 但是你的 React 组件并不知道它的存在, 因此你需要分拣出你需要的 Redux 状态, 所以你需要绑定一个函数, 它的参数是 state, 简单返回你关心的几个值.
mapDispatchToProps: 声明好的 action 作为回调, 也可以被注入到组件里, 就是通过这个函数, 它的参数是 dispatch, 通过 redux 的辅助方法 bindActionCreator 绑定所有 action 以及参数的 dispatch, 就可以作为属性在组件里面作为函数简单使用了, 不需要手动 dispatch. 这个 mapDispatchToProps 是可选的, 如果不传这个参数 redux 会简单把 dispatch 作为属性注入给组件, 可以手动当做 store.dispatch 使用.
这也是为什么要科里化的原因.
做好以上流程 Redux 和 React 就可以工作了.
简单地说就是:
1. 顶层分发状态, 让 React 组件被动地渲染.
2. 监听事件, 事件有权利回到所有状态顶层影响状态.
总结:
react 需要一个管理状态的管理者, redux 就充当这个角色进行顶层分发状态, 改变 react 组件的渲染.
更多 web 前端开发 https://www.html.cn/ 知识, 请查阅 HTML 中文网 !!
来源: http://www.css88.com/qa/react/17023.html