import React, { useReducer, useContext } from "react";
// 原始值
const initstate = {
btn1: "",
btn2: ""
};
// 创建一个reducer函数来处理 原始值
const reducer = (prevState, action) => {
// 不改变原始state
const state = { ...prevState };
switch (action.type) {
case "btn1":
state.btn1 = action.value;
return state;
case "btn2":
state.btn2 = action.value;
return state;
default:
return prevState;
}
};
// 通过 React.createContext 创建一个全局上下文
const GlobalContext = React.createContext();
function ChildWrap() {
// 使用useReducer将 reducer和initstate结合
const [state, dispatch] = useReducer(reducer, initstate);
// GlobalContext.Provider 向组件内提供value, value里的值是供里面的子组件使用的
return (
<GlobalContext.Provider
value={{
state,
dispatch
}}
>
<Btns />
<Child1 />
<Child2 />
</GlobalContext.Provider>
);
}
function Btns() {
// GlobalContext.Provider 包着的组件都可以使用useContext来获取value值
const { dispatch } = useContext(GlobalContext);
return (
<>
<button
onClick={() => dispatch({ type: "btn1", value: "我被btn1改变了" })}
>
Child1
</button>
<button
onClick={() => dispatch({ type: "btn2", value: "我被btn2改变了" })}
>
Child2
</button>
</>
);
}
function Child1() {
// GlobalContext.Provider 包着的组件都可以使用useContext来获取value值
const { state } = useContext(GlobalContext);
return <p>child1 - {state.btn1}</p>;
}
function Child2() {
// GlobalContext.Provider 包着的组件都可以使用useContext来获取value值
const { state } = useContext(GlobalContext);
return <p>child2 - {state.btn2} </p>;
}
export default function App() {
return <ChildWrap />;
}
hooks中 useReducer和useContext结合实现 跨组件通信
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- Vue2.0与 [百度地图] 结合使用: 1.vue init webpack-simple vue-baidu-...
- https://www.bilibili.com/video/BV15741177Eh?p=64[https://...
- 在前面,小编已经陆陆续续为大家分享了很多知识点,那么今天要为大家分享的是将组件通信和双向绑定结合在一起。这个案...