reactjs - 在孩子的 useEffect 中访问 EventListener 调用的函数内的父状态
问题描述
我有一个看起来像这样的组件:
const [someState,setSomeState] = useState()
const onResize = (data) => {
// do some stuff with someState
}
return <MyContainer onResize={onResize}>
... various children
</MyContainer>
该MyContainer
组件看起来有点像这样:
const MyContainer = ({onResize}) => {
useEffect(() => {
addEventListener((data) => {
onResize(data)
})
return cleanUpListener()
}, [])
// ...
}
我的问题是我的第一个组件内部onResize()
someState
不是最新的。我知道这useEffect()
会创建一个闭包,因此我只能在初始化时访问状态值。我想我可以添加onResize
为 的依赖项useEffect()
,但这似乎不是很好,因为这样我的事件侦听器将被销毁并非常频繁地重新创建。
我正在寻找的是一种在组件挂载时创建单个事件侦听器的干净方法,能够访问其回调中的状态,并在卸载时将其拆解。我已经尝试了很多事情并环顾四周,但没有解决方案似乎很奇怪。我对做出反应还很陌生,所以我希望更有经验的人可以为我指出一种优雅的方式来做这样的事情。
解决方案
我不是 100% 确定你想要什么,但你可以someState
作为道具传递给你的子组件。将其添加为您的依赖项useEffect
,并在需要时将其作为参数传递onResize
。只要你不改变值,它应该没问题。
推荐阅读
- c++ - 整数指针数组的元素是否可以指向整数数组?
- wordpress - 顶部导航菜单在使用 GeneratePress 高级版的移动视图中不可见
- c# - 将实体附加到数据库上下文时实例化枚举器后修改了集合
- python - 递归函数体内未定义的“self”不报告 NameError
- mysql - 使用 MySQL 上的触发器减少库存
- ios - 与 AppStore 相比,通过 MDM 服务器安装的应用程序运行缓慢
- project-reactor - 项目反应堆中的 Flux.create() 与 Flux.push() 有什么区别?
- typescript - 打字稿类型 Never[] 不可分配给对象数组
- laravel - 产品未从购物车中删除
- javascript - Moment js 获取相对时间的问题 - fromNow()