React 中的 useContext 和 useReducer

1. useContext简介

用 createContext 创建上下文对象,传递全局变量,在底层任意一个子组件可使用 useContext 获取该上下文对象,同时获取里面定义的全局变量值,进行渲染。

解决问题:当组件嵌套层级过多时,传递属性不方便。

2. useContext代码示例

javascript 复制代码
import React, { useContext } from "react"

// 创建上下文
const UserContext = React.createContext({ name: '' })


function App() {
    return (
        // 用上下文包裹父组件
        <UserContext.Provider value={{ name: 'Augus' }}>
            <div>
                <p>欢迎学习React后台课程</p>
                <Parent />
            </div>
        </UserContext.Provider>
    )
}

function Parent() {
    return (
        <div>
            <p>
                <span>Parent</span>
            </p>
            <p>
                <Child />
            </p>
        </div>
    )
}

function Child() {
    // 在子组件中进行消费
    const { name } = useContext(UserContext)
    return <span>Child:{name}</span>
}

export default App

3. useReducer简介

useReducer 实际上是 useState 的升级版,都是用来存储和更新 state,只是应用的场景不一样。

一般情况下,我们使用 useState 就足够项目需要了,不多当遇到以下场景时,使用useReducer 会更好些 。

  1. 状态逻辑复杂:当状态的更新逻辑比较复杂时,使用 useReducer 可以将这个逻辑封装在 reducer 函数中,使代码更加清晰易懂;

  2. 多组件共享状态:当多组件需要共享一个状态时,可以将这个状态放在父组件,然后通过 useReducer 将状态和更新函数传递给子组件,从而实现状态共享;

  3. 需要处理连续的多个状态更新:当需要连续处理多个状态更新时,使用 useReducer 可以帮助我们更好地管理状态的变化和更新;

4. useReducer代码示例

javascript 复制代码
import { useReducer } from "react"

const initialState = { count: 0 };

function reducer(state, action) {
    switch (action.type) {
        case 'increment':
            return { count: state.count + 1 };
        case 'decrement':
            return { count: state.count - 1 };
        default:
            throw new Error();
    }
}

function Counter() {
    const [state, dispatch] = useReducer(reducer, initialState);
    return (
        <>
            Count: {state.count}
            <button onClick={() => dispatch({ type: 'decrement' })}>-</button>
            <button onClick={() => dispatch({ type: 'increment' })}>+</button>
        </>
    );
}

5. useReducer的高级用法

javascript 复制代码
import React, { useContext,useReducer} from "react"

// 创建上下文
const UserContext = React.createContext({})


function App() {
    const reducer = (state:string,action:{type:string,name:string})=>{
        switch(action.type){
            case 'update_name':
                return action.name
            default :
                return state
        }
    }
    const [name,dispatch] = useReducer(reducer,'Augus');
    return (
        // 用上下文包裹父组件
        <UserContext.Provider value={{ name,dispatch }}>
            <div>
                <p>欢迎学习React后台课程</p>
                <Child1 />
                <Child2 />
            </div>
        </UserContext.Provider>
    )
}

function Child1(){
    const { dispatch }:any = useContext(UserContext);
    const handlick = ()=>{
        dispatch({
            type:'update_name',
            name:Math.random()+''
        })
    }
    return (
        <p>
            <span>Child1</span>
            <button onClick={handlick}></button>
        </p>
    )
}


function Child2(){
    const {name}:any = useContext(UserContext);
    return (
        <p>
            <span>Child2:{name}</span>
        </p>
    )
}


export default App
相关推荐
gentle coder2 天前
【langchain】agent部署的基础入门代码(持续更新中~)
python·langchain·react
RichardLau_Cx2 天前
【保姆级实操】MediaPipe SDK/API 前端项目接入指南(Web版,可直接复制代码)
前端·vue·react·webassembly·mediapipe·手部追踪·前端计算机视觉
小小工匠3 天前
大模型开发 - 零手写 AI Agent:深入理解 ReAct 模式与 Java 实现
人工智能·react
雪域迷影3 天前
MacOS中运行Next.js项目注册新用户时MongoDB报错MongoServerError
mongodb·macos·react·next.js
Highcharts.js3 天前
使用Highcharts与React集成 官网文档使用说明
前端·react.js·前端框架·react·highcharts·官方文档
im_AMBER6 天前
Web文件下载 : 从PDF预览Bug到Hook架构演进
前端·架构·react·浏览器·blob
shadow fish6 天前
React学习笔记(二)
前端·javascript·react
Marshmallowc12 天前
React 刷新页面 Token 消失?深度解析 Redux + LocalStorage 数据持久化方案与 Hook 避坑指南
javascript·react·数据持久化·redux·前端工程化
bin915312 天前
(文后附完整代码)html+css+javascript 弓箭射击游戏项目分析
前端·javascript·css·游戏·html·前端开发
bin915313 天前
(文后附完整代码)html+css+javascript 弹球射击游戏项目分析
前端·javascript·css·游戏·html·前端开发