【发布时间】: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