React Hooks - useContetx和useReducer的使用實(shí)例詳解
useContetx的使用
在之前的開(kāi)發(fā)中,我們要在組件中使用共享的Context有兩種方式:
類組件可以通過(guò) 類名.contextType = MyContext 的方式,在類中獲取context;
多個(gè)Context或者在函數(shù)式組件中通過(guò) MyContext.Consumer 方式共享context;
但是多個(gè)Context共享時(shí)的方式會(huì)存在大量的嵌套(會(huì)導(dǎo)致代碼閱讀性非常差):
Context Hook允許我們通過(guò)Hook來(lái)直接獲取某個(gè)Context的值, 相對(duì)于class組件中的使用方式會(huì)簡(jiǎn)單非常多;
例如定義兩個(gè)Context
import { createContext } from "react";
const InfoContext = createContext()
const ThemeContext = createContext()
export {
InfoContext,
ThemeContext
}依然需要使用InfoContext和ThemeContext將組件包裹起來(lái)
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>
)在要使用的地方, 通過(guò)useContetx這個(gè)hook函數(shù)可以直接獲取到值
import React, { memo } from 'react'
import { useContext } from 'react'
import { InfoContext, ThemeContext } from './index'
const App = memo(() => {
// 通過(guò)hook拿到共享的數(shù)據(jù)
const info = useContext(InfoContext)
const theme = useContext(ThemeContext)
return (
<div>
{/* 展示共享的數(shù)據(jù) */}
<h2>{info.name}-{info.age}</h2>
<h2>{theme.color}</h2>
</div>
)
})
export default App注意事項(xiàng):
當(dāng)組件上層最近的 <MyContext.Provider> 更新時(shí),該 Hook 會(huì)觸發(fā)重新渲染,并使用最新的值傳遞給 MyContext provider 的 context value 值。
useReducer的使用
很多人看到useReducer的第一反應(yīng)應(yīng)該是redux的某個(gè)替代品,其實(shí)并不是。
useReducer僅僅是useState的一種替代方案:
在某些場(chǎng)景下,如果state的處理邏輯比較復(fù)雜,我們可以通過(guò)useReducer來(lái)對(duì)其進(jìn)行拆分;
或者這次修改的state需要依賴之前的state時(shí),也可以使用;
useReducer函數(shù)使用過(guò)程如下:
例如我們先定義一個(gè)reducer函數(shù)
// 定義一個(gè)reducer函數(shù)
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
}
}再在函數(shù)組件中通過(guò)useReducer函數(shù)將我們定義的reducer函數(shù)使用起來(lái)
import React, { memo } from 'react'
import { useReducer } from 'react'
// 定義一個(gè)reducer函數(shù)
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
}
}
// 函數(shù)組件
const App = memo(() => {
// 第一個(gè)參數(shù)傳reducer, 第二個(gè)參數(shù)初始化值
const [state, dispatch] = useReducer(reducer, { counter: 0 })
return (
<div>
{/* 使用reducer函數(shù)中的state */}
<h2>當(dāng)前計(jì)數(shù): {state.counter}</h2>
{/* 派發(fā)action通過(guò)reducer函數(shù)修改counter */}
<button onClick={() => dispatch({type: "incremment", num: 5})}>+5</button>
<button onClick={() => dispatch({type: "decremment", num: 5})}>-5</button>
</div>
)
})
export default App
數(shù)據(jù)是不會(huì)共享的,它們只是使用了相同的counterReducer的函數(shù)而已。
所以,useReducer只是useState的一種替代品,并不能替代Redux。
到此這篇關(guān)于React Hooks - useContetx和useReducer的基本使用的文章就介紹到這了,更多相關(guān)React Hooks基本使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- React?的?useReducer?和?Redux?的區(qū)別及什么情況下應(yīng)該使用?useReducer
- 詳解React如何使用??useReducer???高階鉤子來(lái)管理狀態(tài)
- 一文帶你搞懂React中的useReducer
- React組件useReducer的講解與使用
- React useContext與useReducer函數(shù)組件使用
- React超詳細(xì)分析useState與useReducer源碼
- React useReducer終極使用教程
- React?Hooks useReducer?逃避deps組件渲染次數(shù)增加陷阱
- react中useReducer復(fù)雜狀態(tài)管理
相關(guān)文章
react+zarm實(shí)現(xiàn)底部導(dǎo)航欄的示例代碼
本文主要介紹了react?+?zarm?實(shí)現(xiàn)底部導(dǎo)航欄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
React-redux實(shí)現(xiàn)小案例(todolist)的過(guò)程
這篇文章主要為大家詳細(xì)介紹了React-redux實(shí)現(xiàn)小案例(todolist)的過(guò)程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
淺談react.js中實(shí)現(xiàn)tab吸頂效果的問(wèn)題
下面小編就為大家?guī)?lái)一篇淺談react.js中實(shí)現(xiàn)tab吸頂效果的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
react中setState的執(zhí)行機(jī)制詳解
setState() 的執(zhí)行機(jī)制包括狀態(tài)合并、批量更新、異步更新、虛擬 DOM 比較和渲染組件等步驟,這樣可以提高性能并優(yōu)化渲染過(guò)程,這篇文章主要介紹了react中的setState的執(zhí)行機(jī)制,需要的朋友可以參考下2023-10-10
react實(shí)現(xiàn)動(dòng)態(tài)選擇框
這篇文章主要為大家詳細(xì)介紹了react實(shí)現(xiàn)動(dòng)態(tài)選擇框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
react-player實(shí)現(xiàn)視頻播放與自定義進(jìn)度條效果
本篇文章通過(guò)完整的代碼給大家介紹了react-player實(shí)現(xiàn)視頻播放與自定義進(jìn)度條效果,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-01-01
React應(yīng)用框架Dva數(shù)據(jù)流向原理總結(jié)分析
這篇文章主要為大家介紹了React 應(yīng)用框架Dva數(shù)據(jù)流向原理總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
react navigation中點(diǎn)擊底部tab怎么傳遞參數(shù)
本文主要介紹了react navigation中點(diǎn)擊底部tab怎么傳遞參數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
如何在React?Native開(kāi)發(fā)中防止滑動(dòng)過(guò)程中的誤觸
在使用React?Native開(kāi)發(fā)的時(shí),當(dāng)我們快速滑動(dòng)應(yīng)用的時(shí)候,可能會(huì)出現(xiàn)誤觸,導(dǎo)致我們會(huì)點(diǎn)擊到頁(yè)面中的某一些點(diǎn)擊事件,誤觸導(dǎo)致頁(yè)面元素響應(yīng)從而進(jìn)行其他操作,表現(xiàn)出非常不好的用戶體驗(yàn)。2023-05-05
關(guān)于useEffect執(zhí)行兩次的問(wèn)題及解決
這篇文章主要介紹了關(guān)于useEffect執(zhí)行兩次的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09

