Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 管理全局状态是错误的吗?_Reactjs_React Hooks - Fatal编程技术网

Reactjs 管理全局状态是错误的吗?

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

我正在导出在项目根组件中使用的钩子的返回。然后其他组件就可以很容易地导入globalState和setGlobalState()

我在这里做了几次测试,效果很好。问题是我没有看到社区中有人以同样的方式使用它

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
,会更容易。结果相同,编码更少。