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无限调用问题的更多相关文章

  1. hooks中,useEffect无限调用问题产生的原因

    前言:我在我的另一篇博客中有说道useEffect监听对象或者数组时会导致useEffect无限执行,并给予了解决方案-useEffect无限调用问题 .后来我想从其产生根源去理解并解决这个问题. 原 ...

  2. Shell脚本无限调用

    #! /bin/bash # this shell can run endlessfully echo "i love you ! " sh ./run 通过echo来显示了无限调 ...

  3. 无限调用函数add(1)(2)(3)......

    无限调用函数,并且累计结果 其实这也算一道面试题吧,笔者曾经被提问过,可惜当时没能答上来...

  4. javascript 函数 add(1)(2)(3)(4)实现无限极累加 —— 一步一步原理解析

    问题:我们有一个需求,用js 实现一个无限极累加的函数, 形如 add(1) //=> 1; add(1)(2)  //=> 2; add(1)(2)(3) //=>  6; add ...

  5. ionic上拉加载组件 ion-infinite-scroll自动调用多次的问题

    参考文章地址:http://www.cnblogs.com/luleixia/p/6402418.html ionic 一个上拉刷新的组件 ion-infinite-scroll,如果页面未填充满页面 ...

  6. 使用并发工具实现 RPC 调用流量控制

    前言 RPC 服务中,每个服务的容量都是有限的,即资源有限,只能承受住给定的网络请求,所以,在设计 RPC 框架的时候,一定要考虑流量控制这个问题.而 Java 中,实现流量控制有很多中方式,今天说 ...

  7. python中递归调用

    递归一个通俗的解释就是,在函数中调用函数本身:伪代码如下: In [31]: def fun(): ....: fun() # 这个递归没有任何作用,只是为了说明什么是递归 递归(Recursion) ...

  8. 解决ionic 上拉加载组件 ion-infinite-scroll自动调用多次的问题或禁止第一次加载

    ionic 中一个上拉刷新的组件 ion-infinite-scroll,如果页面未填充满页面高度,会自动检测并无限调用多次加载更多的函数: 当然,主要会导致首次调用的时候,会执行几次加载更多的函数: ...

  9. 解决ionic 上拉加载组件 ion-infinite-scroll自动调用多次的问题

    ionic 中一个上拉刷新的组件 ion-infinite-scroll,如果页面未填充满页面高度,会自动检测并无限调用多次加载更多的函数:当然,主要会导致首次调用的时候,会执行几次加载更多的函数: ...

随机推荐

  1. [atARC114F]Permutation Division

    由于是排列,即任意两个数字都各不相同,因此字典序最大的$q_{i}$就是将每一段的第一个数从大到小排序 接下来,考虑第一个元素,也就是每一段开头的最大值,分类讨论: 1.当$p_{1}\le k$时, ...

  2. 数字逻辑实践2->Verilog编写规范

    来源:数字逻辑与Verilog设计实验课讲解,个人做的笔记与整理. 00 规范的重要性 良好的编程风格有利于减少消耗的硬件资源,提高设计的工作频率 . 提高系统的可移植性和可维护性. 程序的格式化能体 ...

  3. android测试之monkey测试

    1.首先安装SDK包 2.配置环境变量 3.打开CMD命令窗口,查看是否安装成功 命令:adb version 4.要做monkey测试的安卓包名,获取方式如下(必须启动要获取报名的app) 1.ad ...

  4. 前端---梳理 http 知识体系 2

    为什么要有HTTPS HTTP 天生具有明文的特点,整个传输过程完全透明,任何人都能够在链路中截获.修改或者伪造请求 / 响应报文,数据不具有安全性.仅凭HTTP 自身是无法解决的,需要引入新的HTT ...

  5. SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 基本流程讲解(2)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们继续分析上一节提到的 WebHandler,经过将请求封装成 ServerWebExc ...

  6. java 后台通过IO流把文件传到前端并下载

    我的业务需求是两个不同的web程序放在不同的服务器上,web程序A要访问到web程序B上传上来的文件,所以用到了这一个IO读取文件的接口 JAVA代码(排版有点问题  已经尽力补救了(:3_ヽ)_) ...

  7. 【.NET 6】使用.NET 6开发minimal api以及依赖注入的实现、VS2022热重载和自动反编译功能的演示

    前言: .net 6 LTS版本发布已经有若干天了.此处做一个关于使用.net 6 开发精简版webapi(minimal api)的入门教程,以及VS2022 上面的两个强大的新技能(热重载.代码自 ...

  8. 洛谷 P6222 - 「P6156 简单题」加强版(莫比乌斯反演)

    原版传送门 & 加强版传送门 题意: \(T\) 组数据,求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n(i+j)^k\mu^2(\gcd(i,j))\g ...

  9. Python基础之变量与常量

    目录 1. 变量 1.1 变量的定义和组成 1.2 变量名的命名规则 1.3 变量名的两种风格 2. 常量 3. 变量内存管理 3.1 变量的存储 3.2 垃圾回收机制 3.2.1 引用计数 3.3 ...

  10. Docker镜像相关操作

    批量导入镜像 ll *.tgz|awk '{print $NF}'|sed -r 's#(.*)#docker load -i \1#' |bash 批量打tag docker images | se ...