網站首頁 編程語言 正文
useContetx的使用
在之前的開發中,我們要在組件中使用共享的Context有兩種方式:
類組件可以通過 類名.contextType = MyContext 的方式,在類中獲取context;
多個Context或者在函數式組件中通過 MyContext.Consumer 方式共享context;
但是多個Context共享時的方式會存在大量的嵌套(會導致代碼閱讀性非常差):
Context Hook允許我們通過Hook來直接獲取某個Context的值, 相對于class組件中的使用方式會簡單非常多;
例如定義兩個Context
import { createContext } from "react";
const InfoContext = createContext()
const ThemeContext = createContext()
export {
InfoContext,
ThemeContext
}
依然需要使用InfoContext和ThemeContext將組件包裹起來
const root = ReactDOM.createRoot(document.querySelector("#root"))
root.render(
<InfoContext.Provider value={{name: "chenyq", age: 18}}>
<ThemeContext.Provider value={{color: "red"}}>
<App/>
</ThemeContext.Provider>
</InfoContext.Provider>
)
在要使用的地方, 通過useContetx這個hook函數可以直接獲取到值
import React, { memo } from 'react'
import { useContext } from 'react'
import { InfoContext, ThemeContext } from './index'
const App = memo(() => {
// 通過hook拿到共享的數據
const info = useContext(InfoContext)
const theme = useContext(ThemeContext)
return (
<div>
{/* 展示共享的數據 */}
<h2>{info.name}-{info.age}</h2>
<h2>{theme.color}</h2>
</div>
)
})
export default App
注意事項:
當組件上層最近的 <MyContext.Provider> 更新時,該 Hook 會觸發重新渲染,并使用最新的值傳遞給 MyContext provider 的 context value 值。
useReducer的使用
很多人看到useReducer的第一反應應該是redux的某個替代品,其實并不是。
useReducer僅僅是useState的一種替代方案:
在某些場景下,如果state的處理邏輯比較復雜,我們可以通過useReducer來對其進行拆分;
或者這次修改的state需要依賴之前的state時,也可以使用;
useReducer函數使用過程如下:
例如我們先定義一個reducer函數
// 定義一個reducer函數
function reducer(state, action) {
switch(action.type) {
case "incremment":
return {...state, counter: state.counter + action.num}
case "decremment":
return {...state, counter: state.counter - action.num}
default:
return state
}
}
再在函數組件中通過useReducer函數將我們定義的reducer函數使用起來
import React, { memo } from 'react'
import { useReducer } from 'react'
// 定義一個reducer函數
function reducer(state, action) {
switch(action.type) {
case "incremment":
return {...state, counter: state.counter + action.num}
case "decremment":
return {...state, counter: state.counter - action.num}
default:
return state
}
}
// 函數組件
const App = memo(() => {
// 第一個參數傳reducer, 第二個參數初始化值
const [state, dispatch] = useReducer(reducer, { counter: 0 })
return (
<div>
{/* 使用reducer函數中的state */}
<h2>當前計數: {state.counter}</h2>
{/* 派發action通過reducer函數修改counter */}
<button onClick={() => dispatch({type: "incremment", num: 5})}>+5</button>
<button onClick={() => dispatch({type: "decremment", num: 5})}>-5</button>
</div>
)
})
export default App
數據是不會共享的,它們只是使用了相同的counterReducer的函數而已。
所以,useReducer只是useState的一種替代品,并不能替代Redux。
原文鏈接:https://lanan.blog.csdn.net/article/details/127490498
相關推薦
- 2021-11-21 CentOS7環境中DHCP配置教程_Linux
- 2024-01-13 nvm命令
- 2022-06-28 C#回收機制之資源回收托管_C#教程
- 2022-04-07 C++11時間日期庫chrono的使用_C 語言
- 2023-01-02 Flutter組件生命周期和App生命周期示例解析_Android
- 2022-06-16 Air實現Go程序實時熱重載使用過程解析示例_Golang
- 2022-07-15 Android拖拽助手ViewDragHelper的創建與使用實例_Android
- 2022-06-01 詳解C語言中二分查找的運用技巧_C 語言
- 最近更新
-
- 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同步修改后的遠程分支