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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现