Redux
Redux
核心概念(core concepts)
- 资料(state):一个物件,包含所有的资料状态。
- Globalized State
- 动作(action):一个物件,用来描述对资料要进行什麽样的操作。
- Increment
- reducer:一个函式,根 action 的描述对原有的资料进行变更。
- Dispatch
三个原则(three principles)
- Single source of truth:整个 App 的资料状态(state)都保存在单一的物件中,这个保存所有资料的物件称作 store。
- State is read-only:要改变资料状态的唯一方式就是透过 action。
- Change are made with pure functions:reducers 是一个单纯的函式,它会根据 action 和原有的 state,再不变更原有 state 的情况下回传新的 state。
Store
- 会拥有整个 App 的 state,在 Redux 中总是只会有一个 store,但可以有多可 reducer。
- 当 state 有更新时,store 会通知有订阅的 container 有新的 state。
- 透过 getState() 可以取得 state 的资料。
- 透过 dispatch(action) 可以更新 state 的资料。
- 透过 subscribe(listener) 可以註册监听事件。
缺点
- 共享单一Data Store
- 在取 state/action 名的时候都要格外小心
naming collision
- 在取 state/action 名的时候都要格外小心
- 额外的学习门槛,环境设定,也很难让人马上上手。
实作
- 每个 action 一定是个物件,且要包含 type 属性,其他选择性的属性包含 error, payload, meta,任何其他名称的属性都是不被允许的。
- reducer 一定要是 pure function,也就是要回传新的 state(immutable)
- 不要在裡面呼叫 API,这些不允许的行为都应该在 store.dispatch(action) 之前处理。
- 所有的 reducer 都会接收到 action,并回传 state,这个资料状态有可能是新的或旧的。
npm install redux react-redux
import {createStore} from 'redux';
const increment = () => {
return {
type: 'INCREMENT'
}
}
const counter = (state = 0, action) => {
switch (action.type) {
case 'INCREMENT':
return state + 1;
break;
default:
}
}
let store = createStore(counter);
store.subscribe(()=>console.log(store.getState()));
store.dispatch(increment());
import {createStore} from 'redux';
import {Provider} from 'react-redux';
const store = createStore(allReducer);
ReactDOM.render(
<Providor store="store">
<App />
</Providor>
);
import {useSelector, useDispatch} from 'react-redux';
import { increment } from './actions'
const counter = useSelector(state => state.counter)
const isLogged = useSelector(state => state.isLogged)
const dispatch = useDispatch();
return (
<button onClick={() => dispatch(increment())}}>
+
</button>
)
参考资料
- React Redux | React Redux
- 该不该用context api 来取代 redux?. React 16.3正式推出了 context api﹐被戏称“redux… | by pxn | Medium
- Redux DevTools - Chrome 线上应用程式商店
- [Redux] Redux Basic 基础 | PJCHENder 未整理笔记
- [Redux] middleware 笔记 | PJCHENder 未整理笔记
- [Redux] Redux Toolkit (RTK) 笔记 | PJCHENder 未整理笔记
- [Redux] Redux TypeScript 笔记 | PJCHENder 未整理笔记