Reactjs 管理全局状态是错误的吗?
我正在导出在项目根组件中使用的钩子的返回。然后其他组件就可以很容易地导入globalState和setGlobalState() 我在这里做了几次测试,效果很好。问题是我没有看到社区中有人以同样的方式使用它Reactjs 管理全局状态是错误的吗?,reactjs,react-hooks,Reactjs,React Hooks,我正在导出在项目根组件中使用的钩子的返回。然后其他组件就可以很容易地导入globalState和setGlobalState() 我在这里做了几次测试,效果很好。问题是我没有看到社区中有人以同样的方式使用它 import React, { useState } from "react"; import Level2 from "./components/Level2"; export let setGlobalState = () => {}; export let globalSta
import React, { useState } from "react";
import Level2 from "./components/Level2";
export let setGlobalState = () => {};
export let globalState = {};
const initalState = { counter: 0 };
const App = () => {
[globalState, setGlobalState] = useState(initalState);
return (
<>
<Level2 />
</>
);
};
export default App;
import React,{useState}来自“React”;
从“/components/Level2”导入Level2;
导出let setGlobalState=()=>{};
导出let globalState={};
常量initalState={计数器:0};
常量应用=()=>{
[globalState,setGlobalState]=useState(初始状态);
返回(
);
};
导出默认应用程序;
以这种方式管理全球国家是错误的吗?如果是,为什么
这里我有一个包含整个项目的存储库:
全局定义状态然后对其进行变异是不正确的,因为同一组件的多个实例可能需要有自己的状态,而不是共享状态。如果全局定义状态,则所有状态都将共享相同的状态,这将导致不一致 演示
const{useState}=React;
设initialState=0;
让全球国家;
让setGlobalState;
函数计数器(){
[globalState,setGlobalState]=useState(初始状态);
返回(
计数:{globalState}
setGlobalState(计数=>count+1)}>Increment
)
}
函数App(){
返回(
柜台1:
柜台2:
)
}
ReactDOM.render(,document.getElementById('root'))代码>
全局定义状态然后对其进行变异是不正确的,因为同一组件的多个实例可能需要有自己的状态,而不是共享状态。如果全局定义状态,则所有状态都将共享相同的状态,这将导致不一致
演示
const{useState}=React;
设initialState=0;
让全球国家;
让setGlobalState;
函数计数器(){
[globalState,setGlobalState]=useState(初始状态);
返回(
计数:{globalState}
setGlobalState(计数=>count+1)}>Increment
)
}
函数App(){
返回(
柜台1:
柜台2:
)
}
ReactDOM.render(,document.getElementById('root'))代码>
此方法在更新方面存在一些问题。只有App
组件的子组件才能对全局状态更改做出反应。如果树中的某些内容阻止了更新(PureComponent
,React.memo
,等等),这些子级可能仍然无法重新获得请求
另外,setGlobalState
可能会被某些模块重新定义
检查此项以观察问题。所有组件都将更新全局状态,但“损坏”的组件不会对更新作出反应,因为其道具不会更改。这种方法在更新方面存在一些问题。只有App
组件的子组件才能对全局状态更改做出反应。如果树中的某些内容阻止了更新(PureComponent
,React.memo
,等等),这些子级可能仍然无法重新获得请求
另外,setGlobalState
可能会被某些模块重新定义
检查此项以观察问题。所有组件都将更新全局状态,但“损坏”的组件不会对更新作出反应,因为其道具不会更改。您在代码库中的哪个位置使用它?您从未重新分配setGlobalState/globalState,因此它们将永远只是默认分配。App
组件中的变量与导出没有任何关系,只是具有隐藏的变量名。创建全局状态的唯一方法类似于使用默认的React API,就是使用一个包装组件树的上下文?您从未重新分配setGlobalState/globalState,因此它们将永远只是默认分配。App
组件中的变量与导出没有任何关系,只是具有隐藏的变量名。使用默认的React API创建全局状态的唯一方法是使用一个包装组件树的上下文。这似乎是一个很好的答案!你提供的例子,真的帮助我更好地理解。实际上我重写了它。如果问得不多,你能告诉我这种新方法是否解决了这个问题吗:(我会在现实生活中的应用程序中使用useEffects清理侦听器数组)在上下文中使用globalState
和setGlobalState
,而不是useGlobal
,会更容易。结果相同,编码更少。回答得真好!你提供的例子,真的帮助我更好地理解。实际上我重写了它。如果问得不多,你能告诉我这种新方法是否解决了这个问题吗:(我会在现实生活中的应用程序中使用useEffects清理侦听器数组)在上下文中使用globalState
和setGlobalState
,而不是useGlobal
,会更容易。结果相同,编码更少。