如果有錯誤,歡迎留言指教~ Q_Q
useReducer
看起來跟 Redux
的 reducer 很像欸!那他能夠取代 Redux
嗎?
Redux 是一個用來管理 State
的 library
Flux、Vuex、MobX 等等也都是常見管理 state 的library
現在還有個 XState !
這樣維護和重用性也都能夠提高,未來的自己要看的時候,也清楚很多
Redux 有 Reducer、Store、provider
一個描述要做什麼事情的 object,store.dispatch() 把資訊傳遞到 store
一個簡單的 object,且盡量讓資料和 UI 狀態分離。
const initialState = {
id: '',
text: action.text,
completed: false
}
reducer 是一個 pure function,它接收先前的 state 和一個 action,然後回傳下一個 state。
(previousState, action) => newState
action 會傳入現在 reducer 要對 state 做什麼動作的指令及額外的參數
action 可以區分很多類型~ 再給 Store 統一管理
const reducer = (state = initState, action) => {
switch (action.type) {
case 'ADD_TODO':
return [
...state,
{
id: action.id,
text: action.text,
completed: false
}
]
case 'TOGGLE_TODO':
return state.map(todo =>
(todo.id === action.id)
? {...todo, completed: !todo.completed}
: todo
)
default:
return state
}
}
在 default case 回傳先前的 state。針對任何未知的 action 回傳先前的 state
4.建立 store,並傳入 Reducer
管理 Reducer 的地方,負責整合所有的 Reducer,一個專案只有一個,唯一!
使用 createStore 建立 store 並把 reducer 傳進去
import { createStore } from 'redux'
const store = createStore(reducer)
在最外層,且只有唯一一個:接收 store 給的資料後,再傳遞給內部的 component
用 Provider 將 store 根據需求將資料流進 component
用 connect 把 指定好的資料 state 和 component 連結起來
import { connect } from 'react-redux'
const mapStateToProps = state => ({
name: state.name
})
// 把資料和元件 connent 後,就會得到一個新的 組件
const Title = connect(mapStateToProps)(ConnectTitle)
484 就是跟 useReducer 很像呢~
不行!雖然很像,一樣擁有 Action/Reducer/dispatch......
但 useReducer
並不像 redux 擁有 global 的 store