useEffect无限调用问题
1.useEfect()的基本用法
const [test,setTest] = useState(1)
const init=()=>{
setTest(2)
}
useEffect(()=>{
init()
console.log('kkk',test)
},[test])
红色'test'则是监听的数据,这里的监听数据要分为两种,1是基本数据类型,2是对象和数组
2.监听原理基本理解.
简单来说就是当修改后的值不同于修改之前就会执行.test默认为1,setTest()之后变成了2,又会执行init(),但是再次setTest()之后,test还是2,所以只会执行2次.一次默认,一次更改之后.
但是,当每次执行test都变化时将会无限次执行
const [test,setTest] = useState(1)
const init=()=>{
setTest(test+1)
}
useEffect(()=>{
init()
console.log('kkk',test)
},[test])
test每次更改都会和上次不一样,所以他会无限执行
3.监听对象和数组
当你在useEffect中监听对象或数组的时候,它会无条件无限执行.你可以理解为引用数据类型数据在赋值时每次都生成了一个新的数据.所以必定会执行.
故,不要把数组或者对象作为监听对象.
//不能这么写
const [test,setTest] = useState({name:'小明',age:'18'})
const init=()=>{
setTest({name:'小红',age:'16'})
}
useEffect(()=>{
init()
console.log('kkk',test)
},[test])
解决方案:
如果我每次更改的就是对象,那我怎么监听.
1.标记法
同步更新一个可检测的数据,然后监听这个数据.
const [test,setTest] = useState({name:'小明',age:'18'})
const [index,setIndex] = useState(0)
const init=()=>{
setTest({name:'小红',age:'16'})
setIndex(1)
}
useEffect(()=>{
init()
console.log('kkk',test)
},[index])
这要求每个修改都必须要同步修改index,一次都不能少.相当于又引入了一个数据,还得自己全程盯着,流程多的时候可能会乱.不建议使用
2.加判断
假如我知道数据的走向,并且可以准确找到临界点.那我可以通过判断来掐断无限更新的流程
const [test,setTest] = useState(1)
const init=()=>{
setTest(test+1)
}
useEffect(()=>{
if(test!==2){
init()
console.log('kkk',test)
}else{ }
},[test])
3.对象属性监听
通过监听对象属性来判断对象变化,同时符合监听规则,不会无限执行
const [test,setTest] = useState({name:'小明',age:'18'})
const init=()=>{
setTest({name:'小红',age:'16'})
}
useEffect(()=>{
init()
console.log('kkk',test) },[test.name])
4.函数式赋值.
useState()可以通过返回返回值的方式赋值,在这个函数中可以拿到上次更改的state值,并且阻断useState自身
const [test,setTest] = useState(1)
const init=()=>{
setTest((i)=>{
if(i<2){
console.log('???',i) return i+1
}else{
return i
}
})
}
useEffect(()=>{
init()
console.log('kkk',test)
},[test])
5.结合原因从根源上避开这个问题
具体的方案可访问我的另一篇博客:hooks中,useEffect无限调用问题产生的原因
useEffect无限调用问题的更多相关文章
- hooks中,useEffect无限调用问题产生的原因
前言:我在我的另一篇博客中有说道useEffect监听对象或者数组时会导致useEffect无限执行,并给予了解决方案-useEffect无限调用问题 .后来我想从其产生根源去理解并解决这个问题. 原 ...
- Shell脚本无限调用
#! /bin/bash # this shell can run endlessfully echo "i love you ! " sh ./run 通过echo来显示了无限调 ...
- 无限调用函数add(1)(2)(3)......
无限调用函数,并且累计结果 其实这也算一道面试题吧,笔者曾经被提问过,可惜当时没能答上来...
- javascript 函数 add(1)(2)(3)(4)实现无限极累加 —— 一步一步原理解析
问题:我们有一个需求,用js 实现一个无限极累加的函数, 形如 add(1) //=> 1; add(1)(2) //=> 2; add(1)(2)(3) //=> 6; add ...
- ionic上拉加载组件 ion-infinite-scroll自动调用多次的问题
参考文章地址:http://www.cnblogs.com/luleixia/p/6402418.html ionic 一个上拉刷新的组件 ion-infinite-scroll,如果页面未填充满页面 ...
- 使用并发工具实现 RPC 调用流量控制
前言 RPC 服务中,每个服务的容量都是有限的,即资源有限,只能承受住给定的网络请求,所以,在设计 RPC 框架的时候,一定要考虑流量控制这个问题.而 Java 中,实现流量控制有很多中方式,今天说 ...
- python中递归调用
递归一个通俗的解释就是,在函数中调用函数本身:伪代码如下: In [31]: def fun(): ....: fun() # 这个递归没有任何作用,只是为了说明什么是递归 递归(Recursion) ...
- 解决ionic 上拉加载组件 ion-infinite-scroll自动调用多次的问题或禁止第一次加载
ionic 中一个上拉刷新的组件 ion-infinite-scroll,如果页面未填充满页面高度,会自动检测并无限调用多次加载更多的函数: 当然,主要会导致首次调用的时候,会执行几次加载更多的函数: ...
- 解决ionic 上拉加载组件 ion-infinite-scroll自动调用多次的问题
ionic 中一个上拉刷新的组件 ion-infinite-scroll,如果页面未填充满页面高度,会自动检测并无限调用多次加载更多的函数:当然,主要会导致首次调用的时候,会执行几次加载更多的函数: ...
随机推荐
- [cf1486F]Pairs of Paths
以1为根建树,先将所有路径挂在lca上,再分两类讨论: 1.lca相同,此时我们仅关心于lca上不经过第$a$和$b$个儿子路径数,容斥一下,即所有路径-经过$a$的-经过$b$的+经过$a$和$b$ ...
- 阿里云服务器的MySQL连接和vscode远程连接
目录 一.前言 二.使用Navicat等软件连接MySQL 1. 修改服务器系统密码 2. 防火墙选项添加MySQL 3. 使用Navicat连接 三.使用vscode连接服务器 一.前言 双十一的时 ...
- Redis线程模型的前世今生
一.概述 众所周知,Redis是一个高性能的数据存储框架,在高并发的系统设计中,Redis也是一个比较关键的组件,是我们提升系统性能的一大利器.深入去理解Redis高性能的原理显得越发重要,当然Red ...
- CF1542E2 Abnormal Permutation Pairs (hard version)
CF1542E2 Abnormal Permutation Pairs (hard version) good tea. 对于两个排列 \(p,q\),如果 \(p\) 的字典序小于 \(q\),则要 ...
- dart系列之:数学什么的就是小意思,看我dart如何玩转它
目录 简介 dart:math包的构成 math Random 总结 简介 dart也可以进行数学运算,dart为数学爱好者专门创建了一个dart:math包来处理数学方面的各种操作.dart:mat ...
- R合并数据框有重复匹配时只保留第一行
前言 合并数据框有重复匹配时通常会返回所有的匹配,如何只保留匹配的第一行呢?其实这个需求也很常见.如芯片探针ID和基因ID往往多对一,要合并ID对应矩阵和芯片表达矩阵时. 数据例子 data = da ...
- R语言与医学统计图形-【17】ggplot2几何对象之热图
ggplot2绘图系统--heatmap.geom_rect 这里不介绍更常见的pheatmap包. 1.heatmap函数 基础包. data=as.matrix(mtcars) #接受矩阵 hea ...
- 多组学分析及可视化R包
最近打算开始写一个多组学(包括宏基因组/16S/转录组/蛋白组/代谢组)关联分析的R包,避免重复造轮子,在开始之前随便在网上调研了下目前已有的R包工具,部分罗列如下: 1. mixOmics 应该是在 ...
- Linux— 查看系统的位数
[root@zf-test-web01-4 ~]# file /bin/ls #"/bin/ls" is a binary file /bin/ls: ELF ...
- Linux命令行好玩的命令
0.cal 2019 #输出日历并显示今天是哪一天 1.命令"date",显示系统的当前日期和时间: 2.命令"date 040100002016",屏幕显示 ...