在下面的代码中,当我调用_toggleSearch
时,我同时更新了2个钩子。toggleSearchIsVisible
是一个简单的布尔值,但是,setActiveFilter
挂钩必须以先前的searchIsVisible
状态传递。
传入时如何确定其他状态尚未更新?还是我应该如何重组一切?以前使用setState
可以轻松地通过以前的状态。
const [activeFilter, setActiveFilter] = useState('SHOW_ALL');
const [searchIsVisible, toggleSearchIsVisible] = useState(false);
const _toggleSearch = () => {
setActiveFilter(searchIsVisible ? 'SHOW_SEARCH' : 'SHOW_ALL');
toggleSearchIsVisible(!searchIsVisible);
};
我现在已经走了:
const _toggleSearch = () => {
if (searchIsActive) {
setActiveFilter('SHOW_ALL');
toggleSearchIsActive(false);
} else {
setActiveFilter('SHOW_SEARCH');
toggleSearchIsActive(true);
updateSearchValue('');
}
};
任何其他建议表示赞赏!
最佳答案
尝试使用useEffect
钩子来处理切换searchIsVisible
布尔值的副作用。
这是一个例子:
const _toggleSearch = () => {
toggleSearchIsVisible(!searchIsVisible);
};
useEffect(() => {
setActiveFilter(searchIsVisible ? 'SHOW_ALL' : 'SHOW_SEARCH');
}, [searchIsVisible]);
您可以看到我也将
[searchIsVisible]
传递给useEffect
挂钩以优化性能。这将确保仅在
useEffect
更新时触发searchIsVisible
:https://reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects这是一个演示:https://codesandbox.io/s/l2901jr68l
我希望这有帮助。
注意:
另外,我在条件中切换了
SHOW_ALL
和SHOW_SEARCH
的顺序,因为当SHOW_SEARCH
为searchIsVisible
时似乎应该显示false
,而当SHOW_ALL
为searchIsVisible cc>,但如果不是这种情况,只需将订单切换回去即可。