react hook:useEffect不更新数据 踩坑

iframe 内嵌页面,通过监听message事件进行通讯,刚上手hook,对语法不熟练踩了个大坑,记录下来给自己提个醒,
问题代码如下:

	...
  const form = useMemo(() => {
    console.log('formValue',formValue)
    const pattern = pageType == 'detail' ? 'readOnly':'editable'
    return createForm({...formValue,pattern })
  }, [formValue]);
  
  const messageFun = (event) => {
    console.log('form', form);
  }
  
  // 初始化监听事件
  useEffect(() => {
    console.log('addEventListener  初始化')
    window.addEventListener('message', messageFun);
    return () => {
      window.removeEventListener('message',messageFun);
    }
  },[]);

useEffect用来触发监听,然后别的函数会修改formValue,触发form重新初始化,但是在messageFun 函数中打印form始终是旧form,怎么都找不到原因。甚至怀疑是react+addEventListener 有什么阴谋诡计。
最后再官网的useEffect描述中发现了问题:在这里插入图片描述
useEffect的依赖项如果没有对应变量,就不会在内部引用时使用上一次的旧变量。最后在依赖项中添加了依赖解决

  // 初始化监听事件
  useEffect(() => {
    console.log('addEventListener  初始化')
    window.addEventListener('message', messageFun);
    return () => {
      window.removeEventListener('message',messageFun);
    }
  },[form]); // 这里加了依赖

虽然解决了,但是其实有些费解的,messageFun是函数作用域不是应该在整个函数组件么,怎么还是用了老变量?

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值