【问题标题】:Navigate with react-router-dom after useEffect-based setState在基于 useEffect 的 setState 之后使用 react-router-dom 导航
【发布时间】:2020-08-13 03:41:00
【问题描述】:

我正在使用react-storage-hooks,它提供了一种使用localStorage 获得全局状态的方法。在内部,调用 setValue 函数似乎要等到使用 useEffect 进行下一次渲染。这是一个问题,因为我想设置这个本地存储值并立即使用react-router-dom 以编程方式导航到不同的页面。

这是一个简化的例子

import React from 'react';
import { useHistory } from 'react-router-dom';
import { useStorageState } from 'react-storage-hooks';

export function Example() {
  const history = useHistory();

  // I'm ignoring writeError as it isn't relevant for this example
  const [value, setValue, writeError] = useStorageState<string>(
    localStorage,
    'test',
    'initial value'
  );

  return (
    <div>
      <p>Current Value: {value}</p>
      <button
        onClick={() => {
          // Set value to a new value 
          // This operation is delayed until the next render with useEffect internally
          setValue('new value');
          // Navigate to a different page after setting the value
          history.push('/');
        }}
      >
        Click Me
      </button>
    </div>
  );
}

我正在考虑有一个额外的 useState 变量,称为 navigateOut,因此我可以在下一次渲染时通过 if (navigateOut) history.push(); 调用简单地调用它,而不是直接调用 history.push(),但这似乎有点混乱。

如果 setValue 有某种基于回调/承诺的 API,这可能会更容易,但情况似乎并非如此。所以我想我的问题是,解决这个问题的惯用/基于钩子的方法是什么?

编辑:我意识到我忘了在我的例子中指定一些东西。我需要区分简单地修改值和修改+导航。如,我应该能够在不重定向的情况下设置值,除非我指定它这样做。

【问题讨论】:

  • 使用带有依赖关系的 useEffect 挂钩来发出副作用,例如导航到另一条路线。
  • 如果你的意思是有一个额外的 useState 变量供 useEffect 导航,这也是我的想法,但我不确定这是否是最好的方法。相反,如果您的意思是我可以使 useEffect 依赖于值并根据值变化进行导航,那么这将行不通,因为我希望能够 setValue 而不必导航出去(请参阅编辑)。
  • 前者。您可以根据需要使用尽可能多的效果来获得所需的功能。依赖项将是“触发”导航的状态值。
  • 好的,这就是我最终做的事情,它奏效了。但是有一个额外的 useState 变量 + useEffect 只是为了导航出去不是很糟糕吗?也许这就是我。
  • 我不这么认为。在基于类的组件中您将拥有几乎相同的内容;一些回调使用新值设置状态并导航触发器,您检查 componentDidUpdate 中的导航触发器以处理副作用?是的,您可以使用setState 回调,但IMO 这是对函数的滥用,并从生命周期函数中删除了逻辑,这会使跟踪组件变得更加困难。也打破了handler的单一职责原则。

标签: reactjs react-router local-storage react-hooks react-router-dom


【解决方案1】:

setValue 确实有你的 cmets 中提到的一种回调,添加一个只有在值更改时触发的使用效果才能解决你的问题

useEffect(() => {
history.push('/');
}, [value]); // This will only listen to changes on value

https://reactjs.org/docs/hooks-effect.html

【讨论】:

  • 抱歉,我的示例可能过于简单化了一点。我已经有了一个 useEffect 挂钩,因为我有多种方法可以修改该值。其中一个重定向到不同的页面(这个问题),但另一个有其他副作用。所以我需要这与简单地修改值不同。如中,我需要将修改与修改+导航区分开来。否则这就是答案! (一旦我得到编辑的答案,我会将此标记为已回答,抱歉)。
猜你喜欢
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
  • 2023-01-26
  • 2020-07-09
  • 1970-01-01
  • 2017-08-22
  • 2018-11-09
  • 2023-01-30
相关资源
最近更新 更多