1. redux 三大原则
- 单一数据源
- 整个应用程序的 state 被存储在一颗 object tree 中,并且这个 object tree 只存储在一个 store 中;
- 可以创建多个 store, 但是这样做不利于数据的维护;
- 单一的数据源可以让整个应用程序的 state 变得方便维护、追踪、修改;
- State是只读的
- 唯一修改 State 的方法一定是触发 action,不要试图在其他地方通过任何的方式来修改 State;
- 可以保证所有的修改都被集中化处理,并且按照严格的顺序来执行,所以不需要担心竞态的问题;
- 使用纯函数来执行修改
- 通过 reducer 将旧 state 和actions 联系在一起,并且返回一个新的 State;
- 随着应用程序的复杂度增加,我们可以将 reducer 拆分成多个小的 reducers,分别操作 state tree 的一部分;
- 所有的 reducer 都应该是纯函数,不应该产生任何的副作用;
2. redux 的使用
const store = require("./store")
const { changeNameAction, addCounterAction } = require("./store/actionCreators")
const unSubcribe = store.subscribe(() => {
console.log("订阅数据的变化", store.getState())
})
store.dispatch(changeNameAction("Kobe"))
store.dispatch(changeNameAction("lilei"))
store.dispatch(addCounterAction(10))
store.dispatch(addCounterAction(20))
store.dispatch(addCounterAction(30))
store.dispatch(addCounterAction(100))
const { createStore } = require("redux")
const { reducer } = require("./reducer")
const store = createStore(reducer)
module.exports = store
const { CHANGE_NAME, ADD_COUNTER } = require("./constants")
const initialState = {
name: "lwz",
counter: 100
}
function reducer(state = initialState, action) {
switch (action.type) {
case CHANGE_NAME:
return { ...state, name: action.name }
case ADD_COUNTER:
return { ...state, counter: state.counter + action.num }
default:
return state
}
}
module.exports = { reducer }
const CHANGE_NAME = "change_name"
const ADD_COUNTER = "add_counter"
module.exports = { CHANGE_NAME, ADD_COUNTER }
const { CHANGE_NAME, ADD_COUNTER } = require("./constants")
const changeNameAction = name => ({ type: CHANGE_NAME, name })
const addCounterAction = num => ({ type: ADD_COUNTER, num })
module.exports = {
changeNameAction,
addCounterAction
}