javascript - 使用 React 钩子如何同时更新 2 个钩子,但在其他钩子中使用一个的 prevState
问题描述
在下面的代码中,当我调用时,我_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
and的顺序SHOW_SEARCH
,因为它似乎SHOW_SEARCH
应该在searchIsVisible
is时显示false
,并且SHOW_ALL
应该在searchIsVisible
is时显示true
,但如果不是这种情况,只需将顺序切换回来。
推荐阅读
- java - 如何在 OptaPlanner 的运行时移除移动生成器?
- google-cloud-platform - 尝试安装 gcloud 命令行工具时出现“没有这样的文件或目录”
- javascript - JQuery 更新后 ng-transclude 不再起作用
- php - 在 Lumen 制作的 web 服务中将图像数据作为 base64 数据发送时出现 403 禁止错误
- javascript - 在vuejs + vuetify中悬停时如何屏蔽长文本并显示全文?
- android - Android 开发:从 onResponse 方法保存到 ArrayList
- matlab - 从图像中裁剪形状的最小尺寸矩形
- java - 为什么 @Transactional 对于具有 EAP 7.2.x 和 7.3.x 的应用程序管理的 EntityManager 会失败,而 7.1.x 却完美无缺?
- amazon-web-services - 使用 Fargate 进行动态舞台路由/多集群设置
- r - R 函数 ecdf