reactjs - 如何在不重新渲染的情况下访问 redux 连接 mapStateToProps
问题描述
当用户在输入之外单击时,我正在尝试使用mousedown
事件来关闭自动完成功能。
代码:
// listen to mouse clicking outside of autocomplete or input
useEffect(() => {
document.addEventListener("mousedown", handleClickOutsideAutocomplete);
return () => {
document.removeEventListener("mousedown", handleClickOutsideAutocomplete);
};
}, []);
const handleClickOutsideAutocomplete = (e) => {
console.log("props:", props);
const { current: wrap } = wrapperRef;
if (wrap && !wrap.contains(e.target)) {
setisOpen(false);
}
};
此代码按预期运行。但是,当我尝试访问通过 react-redux 传递props
的事件时,它们都是空的。然而,从父组件传递的道具是存在的。我已经确认在初始渲染时 react-redux道具如预期的那样存在。mousedown
connect
connect
我认为该mousedown
事件可能与它有关,因此我测试connect
props
了使用超时访问 react-redux,如下所示:
useEffect(() => {
const timer = setTimeout(() => {
console.log("The connect props are all null", props);
}, 5000);
return () => clearTimeout(timer);
}, []);
这里的 react-reduxconnect
props
也是空的。
是否可以connect
props
在初始渲染后访问,即超时或mousedown
事件?
解决方案
问题是你没有handleClickOutsideAutocomplete
在钩子的依赖数组中添加函数,useEffect
并且由于闭包,事件处理函数看不到 props 的更新值。
解决方案
handleClickOutsideAutocomplete
在钩子的依赖数组中添加useEffect
并包裹handleClickOutsideAutocomplete
在useCallback
钩子中以避免useEffect
每次重新渲染组件时都运行钩子。也不要忘记在useCallback
钩子的依赖数组中列出所需的依赖项。
useEffect(() => {
...
}, [handleClickOutsideAutocomplete]);
const handleClickOutsideAutocomplete = useCallback((e) => {
...
}, [props]);
React 建议将exhaustive-deps rule
其用作其eslint-plugin-react-hooks
软件包的一部分。每当您省略或错误地指定依赖项时,它都会发出警告,并建议修复。
推荐阅读
- python - 使用 pyinstaller 制作的控制台应用程序立即关闭
- c# - 除非定义了新的侦听器或管道,否则不会在 EventListener 中使用 Dotnet EventCounter
- java - 在 RBT 树上遇到问题并在 Node 类上使用方法
- python - 仅为前 4 个分隔符拆分 csv 文件,然后将其余部分删除为该行
- python - 如何计算边缘的均值和标准偏差(OpenCV 中的 Canny 边缘检测)
- bash - 如何计算用户提出的拉取请求数量?
- java - 解组重新运行重复的空值
- c - 有没有办法让用户在 C 中选择用于文件处理的驱动器号?
- svelte - Rollup 不会从 Svelte 编译 HTML
- viewmodel - 如何在 TornadoFX 中正确地将 ViewModel 传递给另一个组件?