热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用方法避免出现深度下降警告的效果

我一直遇到exhaustive-dep规则抱怨的情况。在下面的简单代码中,我想在props.

我一直遇到exhaustive-dep规则抱怨的情况。在下面的简单代码中,我想在props.id值更改时重置该值:

const TestCompOnent= props => {
const [value,setvalue] = useState(props.value);
useEffect(() => {
setvalue(props.value);
},[props.id]);
const saveValue = () => {
props.save(value);
}
return setvalue(e.target.value)} OnBlur={saveValue} />;
};

但是,棉绒规则希望我也将props.value添加到依赖项中。如果这样做,它将有效地破坏组件,因为效果将在每次更改输入时运行,从而重置状态。

是否存在实现此行为的“正确”方法?


编写组件的方式是半受控,半非受控样式,这很难做到。我建议您完全控制或完全不受控制。

“受控”组件是仅对给定道具起作用的组件。它从其属性中获取值并将其转发到输入,而没有任何状态。输入更改时,它将调用onChange属性。当输入模糊时,它将调用onBlur属性。所有业务逻辑都由父组件处理。

另一个选项是不受控制的组件,通常是您拥有的组件。父母会传入一个初始值的道具。我建议将其命名为initialValue,因此很显然这将仅被检查一次。之后,一切都由子组件管理。这意味着您的useEffect完全消失了:

const TestCompOnent= props = {
const [value,setValue] = useState(props.initialValue);
const saveValue = () => {
props.save(value);
}
return setValue(e.target.value)} OnBlur={saveValue} />;
}

那您该如何重置呢?用key。父组件可以使用标准的react密钥来告诉react它应该卸载旧组件并安装新组件:

const ParentCompOnent= props = {
// some code...
return
}

只要id不变,TestComponent就会从传入的initialValue开始做它的事情。当id改变时,TestComponent会卸载并在其位置装载一个新的,它将以initialValue开头已经给出了。


推荐阅读
  • Vue生产环境调试的方法步骤
    开发环境下Vue会提供很多警告来帮你对付常见的错误与陷阱,而在生产环境下,这些警告语句却没有用,反而会增加应用的体积,下面这篇文章主要给大家介绍了关于Vue生产环境调试的方法步骤, ... [详细]
  • MaximumXORofTwoNumbersinanArrayGivenanon-emptyarrayofnumbers,a0,a1,a2,…,an-1,where0≤ai ... [详细]
  • 上次我们总结了React代码构建后的webpack模块组织关系,今天来介绍一下Babel编译JSX生成目标代码的一些规则,并且写一个简单的解析器,模拟整个生成的过程。我们还是拿最简 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • FroggerTimeLimit:1000MSMemoryLimit:65536KTotalSubmissions:32257Accepted:10396DescriptionFr ... [详细]
  • 22.Container With Most Water(能装最多水的容器)
    thecontainercontainsthemos ... [详细]
  • spotify engineering culture part 1
    原文,因为原视频说的太快太长,又没有字幕,于是借助youtube,把原文听&打出来了。中文版日后有时间再翻译。oneofthebigsucceessfactorshereatSpo ... [详细]
  • C#按值复制数组我有一个类型化的数组MyType[]types;我想制作这个数组的独立副本。我试过这个MyType[]types2newMyType[types.Length];t ... [详细]
  • 编译原理c语言词法分析器,用C语言实现一个真正的词法分析器
    词法分析,是编译器的第一个模块,也是最简单的模块。最简单,指的是相对于编译器这种大型程序而言,与一般的代码相比还是有点复杂的 ... [详细]
  • #includestdafx.h#includeiostream#includesstream#includemap#includestring ... [详细]
  • 只能输入数字的TextBox
    只能接受数字1usingSystem;2usingSystem.Text;3usingSystem.Web;4usingSystem.Web.UI;5usingSystem.Web ... [详细]
  • 1、获取类身上的成员变量--class_copyIvarListif([badgeViewChildisKindOfClass:NSClassFromString(_UIBadg ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
author-avatar
埃菲尔的天空有什么
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有