react中 useContext 和useReducer的使用

简介: react中 useContext 和useReducer的使用

一. useContext基本使用可以分为固定的三步
1.根组件导入并调用createContext方法,得到Context对象
import React, { useContext } from 'react'
const GlobalContext = React.createContext()
2.在根组件中使用 Provider 组件包裹需要接收数据的后代组件,并通过 value 属性提供要共享的数据

{
setInfo(value)
}
}
}
>

3.需要获取公共数据的后代组件:
a) 导入useContext,并按需导入根组件中导出的Context对象;
b) 调用useContext(第一步中导出的Context) 得到value的值

a)
const value = useContext(GlobalContext)
return (

{ value.changeInfo(context); }}>
{value.title}

)
b)
return (

{
(value) =>

{value.info}

}

)
4.完整例子
import React, { useState, useEffect, useContext } from 'react'
import axios from 'axios'
import './css/index.css'
const GlobalContext = React.createContext()
export default function app() {
const [list, setlist] = useState([])
const [info, setInfo] = useState("")
useEffect(() => {
    axios.get("./test.json").then(res => {
        setlist(res.data[2].list)

    })
}, [])
return (
    <GlobalContext.Provider value={
        {
            title: "12313",
            info: info,
            changeInfo: (value) => {
                setInfo(value)
            }
        }}>
        <div className="w-warp">
            <div className="business-why">
                <div className='business-ul'>
                    {

                        list && list.map((item, index) =>
                            <ReasonLi key={index} {...item} ></ReasonLi>
                        )
                    }
                </div>
                <ReasonDetails />
            </div>
        </div>
    </GlobalContext.Provider>
)

}
function ReasonLi(props) {
let { name, url, context } = props
const value = useContext(GlobalContext)
return (

{ value.changeInfo(context); }}>
{name}

{name}


)
}

function ReasonDetails() {
return (

{
(value) =>


{value.info}

}

)

}
实际效果
二. useReducer基本使用可以分为固定的三步
1.页面引入 useReducer 并且创建相关对象
import React, { useReducer} from 'react'
父组件创建
const [state, dispatch] = useReducer(reducer, intialState)
2.页面根组件定义reducer的函数和初始状态值intialState
reducer里面包含两个参数(prevState,action) 之前状态值和 操作改变的类型
定义初始状态值 intialState 可以是对象包含多个值

const reducer=(prevState,action) => {
console.log(prevState,acton) // count:0 ,action.type:minus
}
const intialState = {
count:0
}
const intialState = {
count:0
}
3.父组件定义相关的dispatch状态改变操作类型


4.完整例子
import React, { useReducer } from 'react'
const reducer=(prevState,action) => {
const newState = {...prevState}
switch (action.type) {
case 'minus':
newState.count--;
return newState ;
case 'add':
newState.count++;
return newState

    default: return newState
}

}
const intialState = {
count:0
}

export default function app() {
const [state,dispatch] = useReducer(reducer,intialState)
return (



{state.count}


)
}
这个一个简单的数字加加和减减,根据的是action的类型判断状态的改变。下面看一个例子是useReducer结合useContext使用的例子。如果共享状态值和共享改变后的状态值。
如下效果

效果

其中两个按钮是组件1,child2 和child3 为组件2 和组件3 ,通过组件1的操作改变组件2和组件3的值共享之前的状态和改变之后的状态,具体demo如下

import React, { useReducer, useContext } from 'react'
const intialState = {
a: "1111",
b: "22222"
}
const reducer = (prevState, action) => {
let newState = { ...prevState }
switch (action.type) {
case "child2":
newState.a = "aaaa";
return newState;
case "child3":
newState.b = "bbbb";
return newState;
default: return newState;
}

}
const GlobalContext = React.createContext()
export default function app() {
const [state, dispatch] = useReducer(reducer, intialState)
return (






)
}

function Child1() {
const value = useContext(GlobalContext)
return (





)
}

function Child2() {
const value = useContext(GlobalContext)
return (


Child2 {value.state.a}

)
}

function Child3() {
const value = useContext(GlobalContext)
return (


Child3 {value.state.b}
)

}

相关文章
|
前端开发 JavaScript
react-兄弟-父子组件共享状态-useContext
react-兄弟-父子组件共享状态-useContext
95 0
|
14天前
|
前端开发 JavaScript 中间件
React中使用​​useReducer​​​高阶钩子来管理状态
通过本文的介绍,您可以在React中使用 `useReducer`高阶钩子来管理复杂的状态逻辑。`useReducer`不仅提供了清晰的状态管理方式,还可以通过与 `useContext`结合,实现全局状态管理。此外,通过自定义中间件,可以进一步扩展其功能。希望本文对您理解和应用 `useReducer`有所帮助。
26 0
|
2月前
|
缓存 前端开发 JavaScript
在react项目中实现按钮权限createContext && useContext
文章介绍了在React项目中如何使用`createContext`和`useContext`来实现按钮级别的权限控制。
63 0
|
4月前
|
前端开发 JavaScript 数据格式
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
92 1
|
4月前
react18【系列实用教程】useReducer —— 升级版的 useState (2024最新版)
react18【系列实用教程】useReducer —— 升级版的 useState (2024最新版)
59 0
|
4月前
|
前端开发
react18【系列实用教程】useContext —— Context 机制实现越层组件传值 (2024最新版)
react18【系列实用教程】useContext —— Context 机制实现越层组件传值 (2024最新版)
48 0
|
6月前
|
前端开发 JavaScript
React中的状态管理:useState与useReducer的使用与探讨
【4月更文挑战第25天】本文探讨了React中构建动态界面的关键——状态管理,重点关注`useState`和`useReducer` Hook。`useState`适用于简单状态管理,例如计数器,而`useReducer`在处理复杂逻辑和多个状态更新时更具优势,提供更好的组织和可维护性。选择使用哪个取决于状态逻辑复杂度、可维护性和性能需求。合理运用这两个工具能实现高效、可维护的React应用。
|
6月前
|
前端开发 JavaScript
深入理解React中的useReducer:管理复杂状态逻辑的利器
深入理解React中的useReducer:管理复杂状态逻辑的利器
|
6月前
|
前端开发
掌握React中的useContext:访问父组件数据的神奇技巧
掌握React中的useContext:访问父组件数据的神奇技巧
|
6月前
|
存储 前端开发 JavaScript
React Hooks实战:从useState到useContext深度解析
React Hooks 深度解析:useState用于函数组件的状态管理,通过初始化和更新状态实现渲染控制;useContext则提供跨组件数据传递。useState的状态更新是异步的,不支持浅比较,可结合useEffect处理副作用。useContext在多层组件间共享状态,但可能导致不必要的渲染。两者结合可创建复杂应用场景,如带主题切换的计数器。了解其工作原理和优化策略,能有效提升React应用性能。
92 0