当前位置: 首页 > news >正文

react 子组件调用父组件方法,获取的数据不是最新值

react 子组件调用父组件方法,获取的数据不是最新值

      • 原因
      • 解决方法
          • 方法一、去掉 useCallback, 这样每次父组件触发刷新,就会刷新子组件
          • 方法二、或者通过监听 val,val 值改变来刷新函数
          • 方法三、在父组件中,把 val 作为 key 值,每次 val 变化强制触发更新

出现问题的代码如下:

const Parent: React.FC = () => {const [val, setVal] = useState(0);const onBtnsClick = () => {console.log(val);};return (<div>{val}<button onClick={() => setVal(val => val + 1)}>加一</button><Child onClick={onBtnsClick} /></div>);
};const Child: React.FC<{ onClick: () => void }> = ({ onClick }) => {// useCallback + 防抖const onBtnClick = useCallback(_.debounce(onClick, 1000, { leading: true, trailing: false }),[]);return <button onClick={onBtnClick}>子组件</button>;
};

原因

父组件状态的变更没有引起该子组件中的onBtnClick重新生成,导致方法中的 val 为一开始传入的数值0

解决方法

想办法触发组件刷新,使onBtnsClick 中打印的 val 永远是最新的值

方法一、去掉 useCallback, 这样每次父组件触发刷新,就会刷新子组件
// 如果点击的事件不会导致父组件刷新,从而刷新子组件
const onBtnClick = _.debounce(onClick, 1000, {leading: true,trailing: false,
});

但这种方式只适用于一种情况:点击事件的处理不会导致父组件刷新;
如果父组件刷新,就会导致子组件刷新,从而 debounce 又新建,导致防抖无效。

如果想父组件刷新,子组件不刷新,可以父组件函数onBtnsClickuseCallback包裹,Child组件用memo包裹
完整代码如下:

const Test: React.FC = () => {const [val, setVal] = useState(0);const onBtnsClick = useCallback(() => {console.log(val);setVal(val => val + 2)}, [val]);return (<div>{val}<button onClick={() => setVal(val => val + 1)}>加一</button><div><Child onClick={onBtnsClick} />);
};const Child = memo(({ onClick }) => {const onBtnClick = _.debounce(onClick, 1000, {leading: true,trailing: false,});return <button onClick={onBtnClick}>子组件</button>;
});
方法二、或者通过监听 val,val 值改变来刷新函数
const onBtnClick2 = useCallback(_.debounce(onClick, 1000, { leading: true, trailing: false }),[val]
);
方法三、在父组件中,把 val 作为 key 值,每次 val 变化强制触发更新

这个改动是最小的

<Child key={val} onClick={onBtnsClick} />// 或者
<div key={val}><Child  onClick={onBtnsClick} />
</div>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 用RNN(循环神经网络)预测股票价格
  • 前端技术(六)—— AJAX详解
  • 为什么 2!=false 和 2!=true 返回的都是true
  • Java-IO:浅谈对IO的认识
  • 【大规模语言模型:从理论到实践】Transformer中PositionalEncoder详解
  • java 给list对象根据给定条数进行分组工具类
  • 视频中的噪点怎么去除?
  • ES之三:springboot集成ES
  • JavaScript基础面试题:(第二天)
  • 搞定JavaScript异步原理,深入学习Promise
  • 什么是TypeScript?
  • python测试开发基础---multiprocessing.Pool
  • 机器人笛卡尔空间轨迹规划原理与MATLAB实现
  • OpenXR Monado compositor处理应用layers(cheduled->delivered)
  • 深入掌握 Go 语言中的数值类型与循环技巧
  • 分享一款快速APP功能测试工具
  • 2017 年终总结 —— 在路上
  • css属性的继承、初识值、计算值、当前值、应用值
  • download使用浅析
  • java第三方包学习之lombok
  • Java读取Properties文件的六种方法
  • spark本地环境的搭建到运行第一个spark程序
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 大快搜索数据爬虫技术实例安装教学篇
  • 大型网站性能监测、分析与优化常见问题QA
  • 诡异!React stopPropagation失灵
  • 类orAPI - 收藏集 - 掘金
  • 排序(1):冒泡排序
  • 如何使用 JavaScript 解析 URL
  • 突破自己的技术思维
  • const的用法,特别是用在函数前面与后面的区别
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​数据链路层——流量控制可靠传输机制 ​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • ![CDATA[ ]] 是什么东东
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • ( 10 )MySQL中的外键
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (4)STL算法之比较
  • (poj1.2.1)1970(筛选法模拟)
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (十三)Maven插件解析运行机制
  • (四)Linux Shell编程——输入输出重定向
  • (算法)N皇后问题
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)jQuery 基础
  • (转)ObjectiveC 深浅拷贝学习
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .JPG图片,各种压缩率下的文件尺寸
  • .Net Core与存储过程(一)
  • .net Stream篇(六)