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
相关推荐
RichardLau_Cx9 天前
零依赖!纯前端 AI 辅助病例管理系统 aiCaseManage:无后端也能实现诊疗行为核验
前端·人工智能·前端开发·localstorage·医疗科技·ai辅助开发·零依赖项目
晔子yy11 天前
ReAct范式全流程详解
java·ai·react
天若有情67312 天前
从 try-catch 回调到链式调用:一种更优雅的 async/await 错误处理方案
前端·异常处理·前端开发·async·异步·await·异步编程
长路 ㅤ   15 天前
优化篇之AI Chat响应换行渲染效果不生效
前端开发·markdown渲染·事件流·ai对话·换行处理
_OP_CHEN16 天前
【前端开发之JavaScript】(四)JS基础语法下篇:函数与对象核心要点深度解析
开发语言·前端·javascript·界面开发·前端开发·网页开发·语法基础
SuniaWang18 天前
Spring Boot + Spring AI + Vue 3 + TypeScript + Milvus 项目实战
java·人工智能·spring boot·spring·typescript·框架·前端开发
熊猫钓鱼>_>20 天前
【开源鸿蒙跨平台开发先锋训练营】Day20 React Native 鸿蒙开发全阶段大复盘:从零到一的跨越
react native·开源·react·harmonyos·鸿蒙·openharmony·native
_OP_CHEN20 天前
【前端开发之JavaScript】(二)JS基础语法上篇:吃透变量 / 类型 / 输入输出
开发语言·javascript·html·ecmascript·前端开发·网页开发
全栈探索者23 天前
useState 换个名字叫 @State,仅此而已
react·harmonyos·arkts·前端开发·deveco studio·状态管理·鸿蒙next
全栈探索者1 个月前
@Component + struct = 你的新函数组件——React 开发者的鸿蒙入门指南(第 2 期)
react·harmonyos·arkts·前端开发·deveco studio·鸿蒙next·函数组件