網站首頁 編程語言 正文
1. 概述
useReducer 這個 Hooks 在使用上幾乎跟 Redux 一模一樣,唯一缺點的就是無法使用 redux 提供的中間件。
使用 hook 函數后,一般情況下,一個組件組中的數據我們可以用 useReducer 來管理,而不是用 redux 來完成,redux 一般存儲公用數據,而不是把所有的數據都存儲在里面,redux 它是一個單一數據源,如果存儲多個數據的話,性能會降低。
2. useReducer使用
import React, { useReducer } from 'react'
// useReducer 它就是一個小型的redux,它幾乎和redux是一樣的,也可以管理數據
// 初始化數據
const initState = {
count: 100
}
// reducer純函數中的state無需在定義函數時指定初始值,initState 會賦值給 reducer
// const reducer = (state,action)=>{}
// type, payload 是從 action 中結構出來的
const reducer = (state, { type, payload }) => {
if (type === 'add') {
return { ...state, count: state.count + payload }
}
return state
}
const App = () => {
// state 它就是初始化后數據的對象,狀態
// dispatch 它就是用來發送指令讓reducer來修改state中的數據
// reducer它就是一個純函數,用來修改initState初始化后數據狀態函數
// initState 初始化數據
const [state, dispatch] = useReducer(reducer, initState)
const addCount = () => {
// 數據以改變就會觸發 useReducer 中的 reducer 函數
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 初始化數據
// 如果useReducer它有第3個參數,則第2個參數就沒有意義,它以第3個參數優先,第3個參數,惰性初始化,提升性能
// 第3參數它是一個回調函數且一定要返回一個對象數據,當然你也可以直接返回一個值也可以,不建議
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;
注意:惰性初始化可以提升性能,惰性初始化使得數據不會在一開始就進行初始化,而是在使用的時候再進行初始化。
3. 使用useReducer完成todolist列表功能
reducer.js:
// 導出初始化數據
export const initState = {
// 任務列表數據源
todos: []
}
// 導出用于操作當前todos任務列表的純函數
export const reducer = (state, { type, payload }) => {
// [...state.todos, payload] 追加數據
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'
// 導入 reducer 文件中的初始化數據和操作數據函數
import { initState, reducer } from './reducer'
const Todo = () => {
const [{ todos }, dispatch] = useReducer(reducer, initState)
return (
<div>
{/* 表單項 */}
<Form dispatch={dispatch} />
{/* 任務項 */}
<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每項中的數據
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
任務項組件:
import React from 'react'
// 任務項組件
const List = ({ todos, dispatch }) => {
const del = id => {
dispatch({ type: 'del', payload: id })
}
return (
<div>
<h3>任務項</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
原文鏈接:https://blog.csdn.net/weixin_45605541/article/details/127234734
相關推薦
- 2023-07-08 SparkMD5獲取不同圖片的md5顯示相同,解決辦法
- 2022-12-10 C++的std::vector<bool>轉儲文件問題_C 語言
- 2022-10-02 iOS實現可拖動的浮動菜單_IOS
- 2022-12-01 Go語言中基本數據類型的相互轉換詳解_Golang
- 2022-01-17 計算屬性 computed與 watch 的區別
- 2022-04-20 Xamarin渲染器移植到.NET?MAUI項目中_實用技巧
- 2022-10-05 Iptables防火墻string模塊擴展匹配規則_安全相關
- 2022-04-04 運行npm run dev報錯(已解決)
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支