React Hooks - useContetx和useReducer的使用實例詳解
useContetx的使用
在之前的開發(fā)中,我們要在組件中使用共享的Context有兩種方式:
類組件可以通過 類名.contextType = MyContext 的方式,在類中獲取context;
多個Context或者在函數(shù)式組件中通過 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函數(shù)可以直接獲取到值
import React, { memo } from 'react' import { useContext } from 'react' import { InfoContext, ThemeContext } from './index' const App = memo(() => { // 通過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
注意事項:
當組件上層最近的 <MyContext.Provider> 更新時,該 Hook 會觸發(fā)重新渲染,并使用最新的值傳遞給 MyContext provider 的 context value 值。
useReducer的使用
很多人看到useReducer的第一反應應該是redux的某個替代品,其實并不是。
useReducer僅僅是useState的一種替代方案:
在某些場景下,如果state的處理邏輯比較復雜,我們可以通過useReducer來對其進行拆分;
或者這次修改的state需要依賴之前的state時,也可以使用;
useReducer函數(shù)使用過程如下:
例如我們先定義一個reducer函數(shù)
// 定義一個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ù)組件中通過useReducer函數(shù)將我們定義的reducer函數(shù)使用起來
import React, { memo } from 'react' import { useReducer } from 'react' // 定義一個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(() => { // 第一個參數(shù)傳reducer, 第二個參數(shù)初始化值 const [state, dispatch] = useReducer(reducer, { counter: 0 }) return ( <div> {/* 使用reducer函數(shù)中的state */} <h2>當前計數(shù): {state.counter}</h2> {/* 派發(fā)action通過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ù)是不會共享的,它們只是使用了相同的counterReducer的函數(shù)而已。
所以,useReducer只是useState的一種替代品,并不能替代Redux。
到此這篇關于React Hooks - useContetx和useReducer的基本使用的文章就介紹到這了,更多相關React Hooks基本使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決React在安裝antd之后出現(xiàn)的Can''t resolve ''./locale''問題(推薦)
這篇文章主要介紹了解決React在安裝antd之后出現(xiàn)的Can't resolve './locale'問題,本文給大家分享解決方案,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05react-router4 配合webpack require.ensure 實現(xiàn)異步加載的示例
本篇文章主要介紹了react-router4 配合webpack require.ensure 實現(xiàn)異步加載的示例,非常具有實用價值,需要的朋友可以參考下2018-01-01React?antd中setFieldsValu的簡便使用示例代碼
form.setFieldsValue是antd?Form組件中的一個方法,用于動態(tài)設置表單字段的值,它接受一個對象作為參數(shù),對象的鍵是表單字段的名稱,值是要設置的字段值,這篇文章主要介紹了React?antd中setFieldsValu的簡便使用,需要的朋友可以參考下2023-08-08