【问题标题】:How to initialise state stored in separate components from a single async request?如何从单个异步请求初始化存储在单独组件中的状态?
【发布时间】:2020-06-12 20:35:11
【问题描述】:

我想做的事:

  • 我有各种独立的组件,它们在自己内部管理自己的状态。每个组件的状态绝对应该在每个组件内处理。
  • 它们的初始状态来自后端。在此之后,它们会保持自己的状态。
  • 我不想为每个组件发出大量单独的请求,所以我发出一个请求来获取所有组件的数据,然后将其传递下去,为每个组件提供初始数据。

我目前的解决方案:

const MyApp = () => {
    const [initialState, setInitialState] = useState();
    useEffect(()=>{getInitialState().then((data)=>{
        setInitialState(data);
    })},[])
    if (!initialState) {
        return <div>Loading...</div>
    }
    return (
        <>
            <ComponentA initialData={initialState.A} />
            <ComponentB initialData={initialState.B} />
            <ComponentC initialData={initialState.C} />        
        </>
    )
}

我当前解决方案的问题:

上述方法有效,但感觉不对。我已经调用了上述initialState,但它不应该是状态。它更像是一个道具,在应用程序的整个生命周期中存储初始数据会令人困惑。诚然,它没有做任何事情,也不会造成任何伤害,但如果它没有被任何东西使用,为什么还要保留它呢?

我什至考虑在渲染应用程序之前获取数据,然后将数据作为道具传递,但是我不会显示任何内容,而是显示加载屏幕,因此这似乎也不是一个好方法。

我的问题:

是否有更好(和/或标准)的方法来实现上述目标? (我想使用钩子而不是类)。也许上面的想法不是一个坏主意,但感觉可能必须有更好的方法来做到这一点,而无需诉诸“全球”应用程序状态。我想让我的状态靠近使用它的相关部分的组件。

【问题讨论】:

  • 如果你使用 redux,redux-persist 是一个不错的选择。它只保存你想要的那些reducer,并且它比异步请求恢复状态更快。
  • 我认为您需要一个状态管理层来保存全局应用程序上下文。 Redux 或 Mobx,或者只是 React Context API 可以帮助您将全局状态保存在一个地方,组件可以在那里找到它们需要的东西。如果您愿意,我可以详细说明。

标签: reactjs react-hooks state


【解决方案1】:

在这里使用 state 没有错。但是,假设getInitialState 应该只被调用一次,我会将它包装在useEffect 钩子中,这样在安装MyApp 时只会获取一次数据。这将防止 getInitialState 在组件重新渲染时被重复调用。

useEffect(() => {
  getInitialState().then((data)=>{
    setInitialState(data);
  });
}, []);

如果您不想使用状态来维护数据,则必须依赖Context API,或者使用某种状态管理库,例如Redux。

【讨论】:

  • 啊,对不起。我没有使用我的实际代码输入问题并且忘记了 useEffect 钩子。是的,这就是我正在做的。我已经更新了这个问题。不过,感谢您对状态的反馈 :)
  • 澄清我在问题中的意思。并不是我不想依赖国家。我只是希望将状态存储在树的更下方,更靠近实际使用状态的位置。
  • 知道了!!在这种情况下,我认为您可能想要进行状态管理。如果你不想使用 Redux,因为它带有过多的样板,你可以使用更轻的东西,比如 MobX(下一个最佳解决方案)或 Recoil(它很干净,但它仍然是实验性的)。
猜你喜欢
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2019-12-21
相关资源
最近更新 更多