为什么这会违反Hooks规则?
在我的例子中:
const getTopicId = useSelector((state) => state.topics.selectTopic.topicId) !== "" ? useSelector((state) => state.topics.selectTopic.topicId) : JSON.parse(localStorage.getItem("topic")).topicId;
我没有在useSelector中放置条件,我尝试说如果useSelector()有数据,就使用它,如果没有,就使用localStorage数据。
接受EsLint解决方案是:把useSelector放在一个变量里面,然后放在三进制里面......但是我不明白为什么。
const getTopicSelector = useSelector((state) => state.topics.selectTopic.topicId);
const getTopicId = useSelector((state) => state.topics.selectTopic.topicId) !== "" ? getTopicSelector : JSON.parse(localStorage.getItem("topic")).topicId
谢谢你的解释。
2条答案
按热度按时间8wtpewkr1#
您的代码有时调用
useSelector
一次,有时调用两次。如果你把
然后将三进制重写为
if..else
,您可以清楚地看到:有时你调用一个钩子一次,有时两次。这违反了钩子的规则,从长远来看会使React崩溃。
在您的情况下,您可以将其改写为非常简单的内容:
突然间,你只叫了一次钩子--而且你没有条件地这样做。
您也可以使用三元,并将逻辑放在一个钩子调用中:
所有这些替代方案都很好--唯一重要的是:不要在条件内调用
useSelector
(三元组只是编写if...else
的一种简短方法)。React不允许这样做,如果你这样做,它迟早会崩溃在你身上。
iszxjhcz2#
useSelector返回与从本地存储发送的任何值都不兼容的特定类型
处理这种情况的最佳方法是添加单独的useMemo变量