useReducer与useContext组合实现跨组件的状态管理

useReducer 参数 1:reducer 函数,参数2:state的初始值。reducer函数接受两个参数 state、 action 。返回一个新的state 和 dispath,dispatch用来发布事件更新 state。

下面的例子中,父组件定义state、dispatch,通过Context与子组件公用state、dispatch。从而实现跨组件的状态管理。

index.react.js

复制代码
import React, { useReducer } from "react";
import reducer from "../reducer";
import SelectedList from "./selectedList/index.react";
function ChooseMemeber ({listData}) {
    const MemeberContext = createContext();
    const [state, dispatch] = useReducer(reducer, {
        selectedList: [],
        isShow: false
    });
    const {selectedList, isShow} = state;
    useEffect(() => {
        dispatch({ type: 'saveSelectedList', payload: [...listData] });
    }, [listData])

    return (
        <MemeberContext.Provider value={{ state, dispatch }}>//公用参数
            <SelectedList />
        </MemeberContext.Provider>
    )
}
复制代码

reducer.js

复制代码
function reducer(state, action) {
    switch (action.type) {
        case 'saveSelectedList':
            return {...state, selectedList: action.payload}
        case 'isShow':
            return {...state, isShow: action.payload}
        default:
            return state
    }
}
export default reducer
复制代码

selectedList/index.react

复制代码
import React, { useContext } from "react";
import { MemeberContext } from "../../index.react";
function SelectedList () {
    const memberCtx = useContext(MemeberContext);
    const { state: {selectedList}, dispatch } = memberCtx;
       const selectItem = (info, key) => {
        //todo selectedList
        dispatch({type: 'saveSelectedList', payload: [...selectedList]})
   }
   return (
        <div>
            {selectedList.map(data => {
                return <div>data.name</div>
            })}
        </div>
    )
}
export default SelectedList
复制代码

useReducer和redux

useReducer 和 redux 十分类似。但是useReducer不是一个整合的store,redux是。
userReducer中的dispatch是各自独立的,不像redux,是共同的。

useReducer和useState

如果你的state被多个component引用,请使用useReducer。

posted @   梁涛999  阅读(263)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示