React useReducer終極使用教程
1. 概述
useReducer 這個 Hooks 在使用上幾乎跟 Redux 一模一樣,唯一缺點的就是無法使用 redux 提供的中間件。
使用 hook 函數(shù)后,一般情況下,一個組件組中的數(shù)據(jù)我們可以用 useReducer 來管理,而不是用 redux 來完成,redux 一般存儲公用數(shù)據(jù),而不是把所有的數(shù)據(jù)都存儲在里面,redux 它是一個單一數(shù)據(jù)源,如果存儲多個數(shù)據(jù)的話,性能會降低。
2. useReducer使用
import React, { useReducer } from 'react' // useReducer 它就是一個小型的redux,它幾乎和redux是一樣的,也可以管理數(shù)據(jù) // 初始化數(shù)據(jù) const initState = { count: 100 } // reducer純函數(shù)中的state無需在定義函數(shù)時指定初始值,initState 會賦值給 reducer // const reducer = (state,action)=>{} // type, payload 是從 action 中結(jié)構(gòu)出來的 const reducer = (state, { type, payload }) => { if (type === 'add') { return { ...state, count: state.count + payload } } return state } const App = () => { // state 它就是初始化后數(shù)據(jù)的對象,狀態(tài) // dispatch 它就是用來發(fā)送指令讓reducer來修改state中的數(shù)據(jù) // reducer它就是一個純函數(shù),用來修改initState初始化后數(shù)據(jù)狀態(tài)函數(shù) // initState 初始化數(shù)據(jù) const [state, dispatch] = useReducer(reducer, initState) const addCount = () => { // 數(shù)據(jù)以改變就會觸發(fā) useReducer 中的 reducer 函數(shù) dispatch({ type: 'add', payload: 2 }) } return ( <div> <h3>App組件 -- {state.count}</h3> <button onClick={addCount}>++++</button> </div> ); } export default App;
useReducer 的惰性初始化:
import React, { useReducer } from 'react' const initState = { count: 100 } const reducer = (state, { type, payload }) => { if (type === 'add') { return { ...state, count: state.count + payload } } return state } const App = () => { // initState 初始化數(shù)據(jù) // 如果useReducer它有第3個參數(shù),則第2個參數(shù)就沒有意義,它以第3個參數(shù)優(yōu)先,第3個參數(shù),惰性初始化,提升性能 // 第3參數(shù)它是一個回調(diào)函數(shù)且一定要返回一個對象數(shù)據(jù),當然你也可以直接返回一個值也可以,不建議 const [state, dispatch] = useReducer(reducer, null, () => ({ count: 2000 })) const addCount = () => { dispatch({ type: 'add', payload: 2 }) } return ( <div> <h3>App組件 -- {state.count}</h3> <button onClick={addCount}>++++</button> </div> ); } export default App;
注意:惰性初始化可以提升性能,惰性初始化使得數(shù)據(jù)不會在一開始就進行初始化,而是在使用的時候再進行初始化。
3. 使用useReducer完成todolist列表功能
reducer.js:
// 導(dǎo)出初始化數(shù)據(jù) export const initState = { // 任務(wù)列表數(shù)據(jù)源 todos: [] } // 導(dǎo)出用于操作當前todos任務(wù)列表的純函數(shù) export const reducer = (state, { type, payload }) => { // [...state.todos, payload] 追加數(shù)據(jù) if ('add' === type) return { ...state, todos: [...state.todos, payload] } if ('del' === type) return { ...state, todos: state.todos.filter(item => item.id != payload) } return state }
父組件(App.jsx):
import React from 'react'; import Todo from './Todo'; const App = () => { return ( <div> <Todo /> </div> ); } export default App;
ToDo組件:
import React, { useReducer } from 'react' import Form from './components/Form' import List from './components/List' // 導(dǎo)入 reducer 文件中的初始化數(shù)據(jù)和操作數(shù)據(jù)函數(shù) import { initState, reducer } from './reducer' const Todo = () => { const [{ todos }, dispatch] = useReducer(reducer, initState) return ( <div> {/* 表單項 */} <Form dispatch={dispatch} /> {/* 任務(wù)項 */} <List dispatch={dispatch} todos={todos} /> </div> ) } export default Todo
表單項組件:
import React from 'react' // 表單項組件 const Form = ({ dispatch }) => { // 回車事件 const onEnter = evt => { if (evt.keyCode === 13) { const title = evt.target.value.trim() // todo每項中的數(shù)據(jù) const todo = { id: Date.now(), title, done: false } dispatch({ type: 'add', payload: todo }) evt.target.value = '' } } return ( <div> <input onKeyUp={onEnter} /> </div> ) } export default Form
任務(wù)項組件:
import React from 'react' // 任務(wù)項組件 const List = ({ todos, dispatch }) => { const del = id => { dispatch({ type: 'del', payload: id }) } return ( <div> <h3>任務(wù)項</h3> <hr /> <ul> {todos.map(item => ( <li key={item.id}> <span>{item.title}</span> <span onClick={() => del(item.id)}>刪除</span> </li> ))} </ul> </div> ) } export default List
到此這篇關(guān)于React useReducer終極使用教程的文章就介紹到這了,更多相關(guān)React useReducer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解如何使用React和MUI創(chuàng)建多選Checkbox樹組件
這篇文章主要為大家詳細介紹了如何使用 React 和 MUI(Material-UI)庫來創(chuàng)建一個多選 Checkbox 樹組件,該組件可以用于展示樹形結(jié)構(gòu)的數(shù)據(jù),并允許用戶選擇多個節(jié)點,感興趣的可以了解下2024-01-01react拖拽組件react-sortable-hoc的使用
本文主要介紹了react拖拽組件react-sortable-hoc的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02更強大的React 狀態(tài)管理庫Zustand使用詳解
這篇文章主要為大家介紹了更強大的React 狀態(tài)管理庫Zustand使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10React18+TS通用后臺管理系統(tǒng)解決方案落地實戰(zhàn)示例
這篇文章主要為大家介紹了React18+TS通用后臺管理系統(tǒng)解決方案落地實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08react antd-mobile ActionSheet+tag實現(xiàn)多選方式
這篇文章主要介紹了react antd-mobile ActionSheet+tag實現(xiàn)多選方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10修復(fù)Next.js中window?is?not?defined方法詳解
這篇文章主要為大家介紹了修復(fù)Next.js中window?is?not?defined方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12