action
- Action 本质上是 JavaScript 普通对象。我们约定,action 内必须使用一个字符串类型的 type 字段来表示将要执行的动作。多数情况下,
type会被定义成字符串常量。当应用规模越来越大时,建议使用单独的模块或文件来存放 action- type 字符串常量 命名:
表示要执行的动作 - 除了
type字段外,action 对象的结构完全由你自己决定, 参考链接
- type 字符串常量 命名:
- action 创建函数
const addTodo = text => ({
type: 'ADD_TODO',
payload: {
text
}
})
-
它是 store 数据的唯一来源
-
一般来说你会通过 store.dispatch() 将 action 传到 store。
-
Redux 中只需把action 创建函数的结果传给 dispatch() 方法,即可发起一次dispatch过程
- 直接调用
dispatch(addTodo(text))- 或者创建一个
被绑定的action创建函数来自动 dispatch
const boundAdd = text => dispatch(addTodo(text)) // 然后直接调用它 boundAdd(text) -
store 里能直接通过 store.dispatch() 调用 dispatch() 方法
-
多数情况下你会使用 react-redux 提供的
connect()帮助器来调用。 -
bindActionCreators()可以自动把多个 action 创建函数 绑定到 dispatch() 方法上
reducer 指定应用状态的变化如何响应actions并发送到store
设计State结构
- 所有的 state 都被保存在一个单一对象中
{
visibilityFilter: 'SHOW_ALL',
todos: [
{
text: 'Consider using Redux',
completed: true
},
{
text: 'Keep all state in a single tree',
completed: false
}
]
}
-
纯函数 (state, action) => state
-
action 如何把state 转变成下一个 state
-
state 类型可以是基本类型、数组、对象, 并且state变化是需要返回全新的对象。而不是修改传入的参数
⚠️ 不要修改 state 。 使用Object.assign({}, state, {...}),或者ES7的展开运算符{...state, ...newState}, 总之,不要修改state
⚠️ 在 default 情况下返回旧的state
import { combineReducers } from 'redux'
import * as reducers from './reducers'
const todoApp = combineReducers(reducers)
store 存放应用状态
import {createStore} from 'redux'
let store = createStor(// reducers中的纯函数)
页面链接
const mapStateToProps = state => {
return {
todos: getVisibleTodos(state.todos, state.visibilityFilter)
}
}
const mapDispatchToProps = dispatch => {
return {
onTodoClick: id => {
dispatch(toggleTodo(id))
}
}
}
const VisibleTodoList = connect(
mapStateToProps,
mapDispatchToProps
)(TodoList)
connect
复杂的redux应用可以将connect 从组件中拆分出来,放到一个connect.js中
然后在组件中引用
- 明显看出代码简洁很多
ps: 项目比较小的时候,没有太多页面间状态共通的时候,尽量不要用redux
2018.8.22
{
//执行createStore其实返回的就是这些东东
dispatch, //触发action去执行reducer,更新state
subscribe, //订阅state改变,state改变时会执行subscribe的参数(自己定义的一个函数)
getState, //获取state树
replaceReducer, //替换reducer
[?observable]: observable
//redux内部用的,对我们来说没用
}
em~就酱~~~