Redux是js应用的 一种可预测的状态容器
(1)Web 应用是一个状态机,视图与状态是一一对应的。
(2)所有的状态,保存在一个对象里面。
不使用redux:多个嵌套的父子组件消息传递只能使用一层一层向上传递的方式进行通知,使用起来比较麻烦,维护成本高,容易出错
使用redux:单一数据源store用来存储数据状态,所有的组件既可以通过action来改变store,也可以通过store来获取最新的数据状态,同一个页面,嵌套很深的子组件只需要发一个全局异步请求,别的组件去捕获数据状态发生变化实时更新就行,操作非常简单,代码逻辑清晰,容易梳理
整个应用的state都被存储到一个状态树里面,并且这个状态树,只存在于唯一的store中
state是只读的,唯一改变state的方法就是触发action,action是一个用于描述以发生时间的普通对象
使用纯函数来执行修改,为了描述action如何改变state的,你需要编写reducers
//store/index.js
import { createStore } from 'redux'
import reducer from './reducer';
const store = createStore(reducer);
export default store;
import { createStore } from 'redux';
const store = createStore(fn);
const state = store.getState();
State 的变化,会导致 View 的变化。但是,用户接触不到 State,只能接触到 View。所以,State 的变化必须是 View 导致的。Action 就是 View 发出的通知,表示 State 应该要发生变化了。
const action = {
type: 'ADD_TODO',
payload: 'Learn Redux'
};
上面代码中,Action 的名称是ADD_TODO,它携带的信息是字符串Learn Redux。
可以这样理解,Action 描述当前发生的事情。改变 State 的唯一办法,就是使用 Action。它会运送数据到 Store。
const ADD_TODO = '添加 TODO';
function addTodo(text) {
return {
type: ADD_TODO,
text
}
}
const action = addTodo('Learn Redux');
import { createStore } from 'redux';
const store = createStore(fn);
store.dispatch({
type: 'ADD_TODO',
payload: 'Learn Redux'
});
上面代码中,store.dispatch接受一个 Action 对象作为参数,将它发送出去。
结合 Action Creator,这段代码可以改写如下。
store.dispatch(addTodo('Learn Redux'));
const reducer = function (state, action) {
// ...
return new_state;
};
整个应用的初始状态,可以作为 State 的默认值。下面是一个实际的例子。
const defaultState = 0;
const reducer = (state = defaultState, action) => {
switch (action.type) {
case 'ADD':
return state + action.payload;
default:
return state;
}
};
const state = reducer(1, {
type: 'ADD',
payload: 2
});?
import { createStore } from 'redux';
const store = createStore(reducer);
const actions = [
{ type: 'ADD', payload: 0 },
{ type: 'ADD', payload: 1 },
{ type: 'ADD', payload: 2 }
];
const total = actions.reduce(reducer, 0); // 3
上面代码中,数组actions表示依次有三个 Action,分别是加0、加1和加2。数组的reduce方法接受 Reducer 函数作为参数,就可以直接得到最终的状态3。
原文:https://www.cnblogs.com/Hsong/p/12145245.html