redux是用于管理react状态的一个状态管理器react
核心有三大部分组成--action、reducer、storenpm
action:是触发state改变的状态,是普通的js对象,语义做用;redux
const addAction = { type: 'ADD_ITEM', text: 'to add a new item' }
reducer:纯函数 传递action以触发state改变的函数,传入state和action,作一些符合action的处理,建立state的副本,并返回这个副本。性能优化
function todoApp(state, action) { switch(action.type){ case 'ADD_ITEM': return Object.assign({},state,{ ...state.todos, {text: action.text, completed: true} }); } }
store:存储state的地方。
方法:
getState():获取state
dispatch(action): 更新state
subscribe(listener): 注册监听器,返回一个函数,调用此函数可注销监听器。函数
建立store:性能
import { createStore } from 'redux'; import rodoApp from './reducers'; let store = createStore(todoApp);
单向数据流--数据生命周期:
调用store.dispath(action)
;
redux store会自动调用传入的reducer函数;
根reducer会把多个子reducer输出合并成一个单一的reducer树;
redux store保存根reducer返回的完整state树,该state树就是下一个state,全部调用store.subscribe(listener)
的监听器都将被调用,在监听器中能够经过调用store.getState()
来获取当前的state。优化
配合react(redux自己和react没有关系)
安装react绑定库:npm install --save react-redux
其基于react的容器组件与UI组件相分离的思想来开发。spa
UI组件 | Container组件 | |
---|---|---|
是否直接使用Redux | 否 | 是 |
数据来源 | props | 监听redux state |
数据修改 | 从props调用回调函数 | 向redux派发action |
调用方式 | 手动 | 一般由react redux生成 |
做用 | 展现骨架、样式 | 数据获取、状态更新 |
容器组件用connect()
方法生成。【该方法内部作了一些性能优化,避免了不少没必要要的rerender
】
其本质是经过store.subscribe()
从redux state
树中读取部分数据,并经过props
将这些数据传给对应的UI组件。code
connect()
的用法对象
import { connect } from 'react-redux'; connect(mapStateToProps, mapDispathToProps)(TodoList); const getVisibleTodos = (todos, filter) => { switch(filter) { case 'SHOW_COMPLETED': return todos.filter(...) // ... } } const mapStateToProps = state => { return { todos: getVisibleTodos(state.todos, state.visibilityFilter) } } const mapDispathToProps = dispatch => { return { onTodoClick: id => { dispatch(toggleTodo(id)) } } }
mapStateToProps
: 该函数用于指定如何将当前的redux store的state映射到对应UI组件的props中。mapDispathToProps
:该函数接收dispatch()
方法并返回指望注入到UI组件props中的回调函数。