Redux 生产实践使用注意事项
来源:互联网 发布:诺基亚s60软件下载 编辑:程序博客网 时间:2024/05/23 12:41
背景:在我们使用 React 时,通常都是和 Redux 配合使用,Redux 管理数据状态,去控制 DOM 的渲染与更新。
在使用 Redux 的时候,有一些注意的地方,否则可能出现意料之外的情况,却不知道原因是什么,其中有一点就是下面这个例子:
/** * action-reducer.js * @param {*} uid */const getUid = (uid) => ({type: GET_UID}, uid);const initialState = { uid: ""};const userInfo = (state = initialState, action) => { switch (action.type) { case GET_UID: return Object.assign({}, state, {uid: action.uid}); default: return state; }}export default userInfo;export {getUid};/** * 组件 */function mapStateToProps(state) { return {uid: state.userInfo.uid}}
代码分了两段,上面那段是我为了简单,将 action 和 reducer 合并成一个文件了,export 出一个 getUid 的函数,每次 dispatch 这个函数会将一个 uid 传入进去,更新 reducer userInfo state 的 uid。组件中 state 和组件通过 mapStateToProps 函数进行了绑定,这样每次dispatch(getUid())
更新 state 后将会重新渲染组件。
但是,这样的写法是有问题的哦
现在这个写法,多次 dispatch(getUid())
假如传入的是同一个 uid,render() 是不会重新渲染的。问题出在哪里?出在这里:
function mapStateToProps(state) { return {uid: state.userInfo.uid}}
mapStateToProps
的时候将 userInfo 中的 uid 提取出来进行了重新赋值,这样只要 uid 没有变化的话,对于 Redux 来说,state 是没有更新的,所以就不会重新渲染了,如果我们想要做到重新渲染的话,就要用下面的写法:
function mapStateToProps(state) { return {userInfo: state.userInfo}}
然后使用 this.props.userInfo.uid
来获取 uid,这样就可以更新组件了,即使 uid 是相同的哦。原因是:
case GET_UID: return Object.assign({}, state, {uid: action.uid});
每次 dispatch 时,都会通过 Object.assign() 生成一个新的对象,这样对于 state 来说,每次对象的引用是不同的,进行 diff 比较时,就会认为 state 是更新的,响应的组件就执行 render()。
OK,这次的注意事项就到这里!欢迎讨论!
- Redux 生产实践使用注意事项
- Rabbitmq生产环境使用注意事项
- redux-saga 实践总结
- react-native + redux 实践
- React + Redux 最佳实践 学习之 redux
- 生产环境中使用容器的10点注意事项
- 生产级Nodejs开发实践-使用连接池
- hadoop生产实践
- 使用Redux DevTools浏览器插件调试redux
- 使用Redux DevTools浏览器插件调试redux
- Redux状态管理5 使用react-redux
- Redux进阶系列1: React+Redux项目结构最佳实践
- Mycat生产实践---生产环境部署
- React-redux使用
- react-redux使用实例
- redux使用心得
- Redux基础使用
- Redux基本原理和使用
- 【Java】【HashMap】HashMap 同步性能比较
- 4种会话追踪方式
- oracle11g 导出表报EXP-00011:table不存在。
- TCP/IP详解一 ——TCP的可靠性保证方法
- 仿select下拉框,鼠标点击元素以外隐藏下拉框
- Redux 生产实践使用注意事项
- sd/mmc/tf插拔无法挂载文件系统
- react组件状态的一点说明
- 文件大小工具类.
- 基于ueditor-1.4.3.3实现图片上传到项目以外的目录下
- Maven实现直接部署Web项目到Tomcat
- Lua编程中遇到的table类型传递引用问题
- DOM节点删除之detach()和remove()区别
- SpringBoot加https的配置