React 快速上手 - 08 redux 状态管理 react-redux
目录
React 快速上手 - 08 redux 状态管理 react-redux今天我会快速的过一下 目标
闲话
笔者为了写这文章,可是安静的读了一遍 首先
好像懂了什么,不知道呢 然后
其实 Example: Todo List 这才是最有帮助的 又听了视频 Getting Started with Redux 视频 好啰嗦啊
不过这也是学习的正确姿势,总要看一遍官方文档,无奈官网设计的更像一个学术站点,而不是类库工具一类的指导说明 好了好了~吐槽完毕,开始正文! redux 是什么,可以不用么
这张图是 Flux 官网的,画的很好。
好了,概念一句话说完了,来看看什么情况下用
这个界面,如果用 按我们之前的组件拆分,结构是合理,但是这个数据管理麻烦了,各种业务数据压入子组件,各种业务事件返回到主容器组件,可能的代码结构如下 // 状态 this.state = { data1:...,data2:...,data3:...,data...n:... } // 事件 function handelEvent1 = {...} function handelEvent2 = {...} function handelEvent3 = {...} function handelEvent...n = {...} // JSX <主视图组件> <用户信息 data1={this.state.data1} handleEven1={...} handleEven2={...} handleEven...n={...} /> <主播信息> <基础资料 data...n={...} handleEven...n={...} /> <头像 data...n={...} handleEven...n={... /> <关注 data...n={...} handleEven...n={... /> <标签 data...n={...} handleEven...n={... /> <热度 data...n={...} handleEven...n={... /> ... </主播信息> <播放器 ...> <... /> ... <播放器> ... <...播放器/> ... </主视图组件> 会发现组件套组件,父父子子的,完全没法维护了,梳理这些关系就很费时间,而且容易错误
但是也不好滥用,我看到有些简单的 表单操作,竟然也套了 动手创建一个 redux 应用来个经典例子
第一步: 编写 Action界面上产生的操作 let nextTodoId = 0 export const addTodo = text => ({ type: 'ADD_TODO',id: nextTodoId++,text }) export const toggleTodo = id => ({ type: 'TOGGLE_TODO',id })
第二步: 编写 Reducers事件对应的响应处理,处理完后返回新 const todos = (state = [],action) => { switch (action.type) { case 'ADD_TODO': return [ ...state,{ id: action.id,text: action.text,completed: false } ] case 'TOGGLE_TODO': return state.map( todo => todo.id === action.id ? {...todo,completed: !todo.completed} : todo ) default: return state } } export default todos 第三步: 合并 Reducers使用 import { combineReducers } from 'redux' import todos from './todos' export default combineReducers({ todos }) 假设你有其它业务,如: 用户 import { combineReducers } from 'redux' import todos from './todos' import user from './user' import cart from './cart' export default combineReducers({ todos,user,cart }) 第四步: 编写组件
|
名称 | 说明 |
---|---|
mapStateToProps | store 绑定 state ,做更新的需要传入 |
mapDispatchToProps | 绑定派发事件 event ,不传的话默认 dispatch 对象,就像上面的 AddTodo 组件 |
mergeProps | [mergeProps(stateProps,dispatchProps,ownProps): props] (Function): 合并属性自定义,自己不传的话默认 ·Object.assign ,我也是放空默认的 |
options | 一些选项,我没怎么在意,知道有就行 |
[mapStateToProps],[mapDispatchToProps]
这两个用到的多,大家自己练习下
第六步: 容器组件
import React from 'react' import AddTodo from './AddTodo' import TodoList from './TodoList' const App = () => ( <div> <AddTodo /> <TodoList /> </div> ) export default App
这里简单,并列排放
最后: 适配 App
import React,{Component} from 'react' import {createStore} from 'redux' import {Provider} from 'react-redux' import TodoApp from './todos/components/App' import todoReducer from './todos/redux/reducers' const store = createStore(todoReducer) class BaseRedux extends Component { render() { return ( <Provider store={store}> <TodoApp /> </Provider> ) } } export default BaseRedux
-
标准代码格式
-
createStore(reducers)
创建store
-
Provider
适配器压入store
对象,子节点都受Redux
控制
-
调试工具 Redux DevTools extension
动图效果
1. 安装 chrome 插件
打开 redux-devtools
2. 配置代码
const store = createStore( todoReducer,window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__() )
createStore
时加入 window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
3. 开启插件
打开 chrome
调试工具,点击面板 Redux
codepen
https://codepen.io/ducafecat/...
代码
- reactjs-example / 6-redux.js
参考
- redux 官网
- flux 官网
- Getting Started with Redux 视频
- Building React Applications with Idiomatic Redux 视频
- Redux 中文文档
- Example: Todo List
- Redux DevTools extension
- zalmoxisus/redux-devtools-extension
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!