You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
importReact,{Component}from'react'import{connect}from'./../react-redux'classThemeSwitchextendsComponent{handleClick(e){this.props.onSwitchColor(e.target.value)}render(){const{ color }=this.propsreturn(<buttonstyle={{ color }}onClick={e=>this.handleClick(e)}value="red">
Red
</button>)}}constmapStateToProps=state=>({color: state.themeColor,})constmapDispatchToProps=dispatch=>({onSwitchColor: color=>{dispatch({type: 'CHANGE_COLOR',themeColor: color})},})exportdefaultconnect(mapStateToProps,mapDispatchToProps)(ThemeSwitch)
主要内容
Redux
Redux 和 React-redux
Redux 和 React-redux 并不是同一个东西。
Redux 是一种架构模式(Flux 架构的一种变种),它不关注你到底用什么库,你可以把它应用到 React 和 Vue,甚至跟 jQuery 结合都没有问题。
而 React-redux 就是把 Redux 这种架构模式和 React.js 结合起来的一个库,就是 Redux 架构在 React.js 中的体现。
Redux 三大原则
Redux 流程图
Redux 为什么这么用
我们在代码中发现共享的状态如果可以被任意修改的话,那么程序的行为将非常不可预料,所以我们提高了修改数据的门槛:你必须通过 dispatch 执行某些允许的修改操作,而且必须大张旗鼓的在 action 里面声明。
这种模式挺好用的,我们就把它抽象出来一个 createStore,它可以产生 store,里面包含 getState 和 dispatch 函数,方便我们使用。
后来发现每次修改数据都需要手动重新渲染非常麻烦,我们希望自动重新渲染视图。所以后来加入了订阅者模式,可以通过 store.subscribe 订阅数据修改事件,每次数据更新的时候自动重新渲染视图。
接下来我们发现了原来的“重新渲染视图”有比较严重的性能问题,我们引入了“共享结构的对象”来帮我们解决问题,这样就可以在每个渲染函数的开头进行简单的判断避免没有被修改过的数据重新渲染。
我们优化了 stateChanger 为 reducer,定义了 reducer 只能是纯函数,功能就是负责初始 state,和根据 state 和 action 计算具有共享结构的新的 state。
createStore 现在可以直接拿来用了,套路就是:
以上内容原文见这里:动手实现 Redux(六):Redux 总结
Redux 使用
React-Redux 使用
项目结构
如项目中的结构:
rootReducer.js
modules/user.js
部分内容index.js
Next 项目中引入 redux,如
pages/_app.js
:使用 Hooks 获取、更新
使用 Class 获取、更新
如果使用了 Class,需要借助 connect 高阶组件函数:
如何实现一个 React-redux
问题
createStore 实现
React.js 除了状态提升以外并没有更好的办法帮我们解决组件之间共享状态的问题,而使用 context 全局变量让程序不可预测。
我们知道 store 里面的内容是不可以随意修改的,而是通过 dispatch 才能变更里面的 state。
高阶组件 connect 函数
所以我们尝试把 store 和 context 结合起来使用,可以兼顾组件之间共享状态问题和共享状态可能被任意修改的问题。
但是 store 和 context 结合有大量的重复逻辑和对 context 的依赖性过强。
我们尝试通过构建一个高阶组件 connect 函数的方式,把所有的重复逻辑和对 context 的依赖放在里面 connect 函数里面,而其他组件保持 Pure(Dumb) 的状态,让 connect 跟 context 打交道,然后通过 props 把参数传给普通的组件。
而每个组件需要的数据和需要触发的 action 都不一样,所以调整 connect,让它可以接受两个参数 mapStateToProps 和 mapDispatchToProps,分别用于告诉 connect 这个组件需要什么数据和需要触发什么 action。
Provider 实现
为了把所有关于 context 的代码完全从我们业务逻辑里面清除掉,我们构建了一个 Provider 组件。
Provider 作为所有组件树的根节点,外界可以通过 props 给它提供 store,它会把 store 放到自己的 context 里面,好让子组件 connect 的时候都能够获取到。
使用方式
全局配置 store:
使用 connect:
总结
以上内容主要包含:connect 函数和 Provider 容器组件。这就是 React-redux 的基本内容,当然它是一个残疾版本的 React-redux,很多地方需要完善。例如性能问题,现在不相关的数据变化的时候其实所有组件都会重新渲染的。但不影响我们理解它的原理。
参考资料
The text was updated successfully, but these errors were encountered: