React中useState的setState方法请求了好多次

news/2024/7/15 19:16:36 标签: react.js, 前端, typescript

1、问题描述

        最近在写react的时候碰到了一个很奇怪的问题。

 

         可以看到那个getXXX()的方法一直不断的被调用,网页一直请求,根本停不下来了。

2、产生原因

        要弄明白这个原因,首先要先了解一下react生命周期。

        react是组件式的编程,一个react项目启动以后,先是会加载好网页的DOM结构

         所谓的DOM结构,其实就是常见的一些web标签,比如<html>、<body>这些。就是绘制一个网页的基本框架。

         网页的DOM结构加载完以后,再去渲染react组件到页面上去(Mounting挂载阶段,把组件插入真实DOM)。调用了setState(useState的setState)后,就到了第二个Updating更新重新渲染(render)阶段。setState请求了好多次就是发生在Updating更新阶段。

        因为我是想在第一次打开这个页面的时候,就从后端请求数据,并把返回的数据渲染到页面上去,根据代码是顺序执行的,代码从上往下顺序执行,执行到getXXX()这个方法的时候,会请求后端以及渲染数据。但问题就出现在这里,getXXX()方法会被不断的调用!因为每次setState()的时候都会重新render一次页面(异步过程),于是整个页面的代码又会从头到尾执行一次。相当于每次render都会顺序把getXXX()里面的代码都顺序执行一下,每次render都又加了新的setState,然后无限嵌套,递归的这种......

3、解决方法

        注:因为不方便直接贴公司的代码,这里我就用自己写的Demo了。

3.1、使用useEffect函数

        在listAllPeople()方法外面再加一层方法getData(),在useEffect里面调用getData(),并把useEffect的第二个参数为[ ],表示只在第一次render的时候调用一下。

const getData=()=>{
        //get请求无参数
        listAllPeople().then((response) => {
            const result = response.data;
            console.log(response);
            console.log(result);
            setpeopleDTOList(result.PeopleDTOList);
            console.log(peopleDTOList)
        });
};

useEffect(() => {
    getData();
}, []);

         然后你会发现,useEffect()调用了两次getData()方法,这是由于严格模式下为了确保请求响应成功,所以特地多执行了一次useEffect。当然如果你不想请求两次的话,也可以取消严格模式。找到入口页面的<React.StrictNode>并删除就退出严格模式了。

         退出严格模式后,useEffect就只执行了一次了。

4、总结

        无

5、参考资料

React useEffect 两个参数你用对了吗 - 掘金

react 严格模式(控制台调用两次问题)_使用react.strictmode,接口调用两次_轻狂的书生的博客-CSDN博客

使用 Effect Hook – React (reactjs.org)

Hook 简介 – React (reactjs.org)

react 严格模式(控制台调用两次问题)_使用react.strictmode,接口调用两次_轻狂的书生的博客-CSDN博客 react关闭严格模式-掘金 (juejin.cn)

react 严格模式(控制台调用两次问题)_使用react.strictmode,接口调用两次_轻狂的书生的博客-CSDN博客

防止 React 触发 useEffect 两次 - 知乎 (zhihu.com)

useEffect – React

深入详解React生命周期 - 掘金 (juejin.cn)

React 组件生命周期 | 菜鸟教程 (runoob.com)

HTML DOM 教程 | 菜鸟教程 (runoob.com)


http://www.niftyadmin.cn/n/1066064.html

相关文章

【动态规划】抄近路

问题 W: 【动态规划】抄近路 时间限制: 1 Sec 内存限制: 64 MB提交: 13 解决: 8[提交][状态][讨论版]题目描述 “最近不知道怎么回事&#xff0c;感觉我们这个城市变成了一个神奇的地方&#xff0c;有时在路上走着走着人就消失了&#xff01;走着走着突然又有人出现了&#x…

VUE实现选中后变色并且效果不消失

开始用的css伪类li:active,发现点击之后确实会变色&#xff1b;但是只有鼠标点下去那一瞬间会变色&#xff0c;当鼠标点完之后&#xff0c;效果就消失了。发现只用css还是不行 实现代码 <div class"topic-list-box-top"><ul class"tag-list">…

[转]左连接和右连接的区别

本文转自&#xff1a;http://blog.163.com/hweibin126126/blog/static/170442469201122264519119/ Left Join / Right Join /inner join相关关于左连接和右连接总结性的一句话&#xff1a;左连接 where只影向右表&#xff0c;右连接where只影响左表。左连接&#xff1a;Left Jo…

PHP之输出控制 ob_start(),ob_get_contents(),ob_end_clean()

1.常用函数 ob_start();#打开输出缓冲区 ob_get_contents();#获取缓冲区内容 ob_get_length();#获取缓冲区内容长度 ob_clean();#清除之前的所有输出内容 ob_end_clean();#清除缓冲区内容并且关闭缓冲区&#xff0c;和ob_clean()差不多吧&#xff0c;不太了解真正的区别&#x…

js获取当前日期yyyymmdd

function getNowDate() {var date new Date();var sign1 "-";var sign2 ":";var year date.getFullYear() // 年var month date.getMonth() 1; // 月var day date.getDate(); // 日var hour date.getHours(); // 时var minutes date.getMinutes(…

DOS 功能调用指令

常用的dos功能调用&#xff1a; 指令格式作用举例键盘输入一个字符并显示(1号功能) INT 21H 按下任何键&#xff0c;将其对应字符的ASCII码送入AL中&#xff0c;并在屏幕上显示该字符。如果按下的是Ctrl&#xff0b;Break组合键&#xff0c;则终止程序执行。1号功能调用无须入口…

控制li 默认第一个是点击样式,点击其它li 又变回普通样式

实现&#xff1a;第一个li我默认它是被点击后的样式&#xff0c;当我点击另一个的li后,点击的那个li为点击后的样式&#xff0c;第一个li和其它未被点击的li一样为普通的样式。 Vue 1.遍历出来&#xff0c; 在click中赋值 遍历出来的mx。 2.class进行决定是否显示&#xff0…

WebViewJavaScriptBridge的原理解析

理解WebViewJavaScriptBridge原理 前提条件都是需要bridge在OC实例化&#xff0c;然后二者的互调才可以进行下去 _bridge [WebViewJavascriptBridge bridgeForWebView:webView]; 实例化的原理是&#xff1a;JSBridge里面有UIWebview和JSBridgeBase的实例&#xff0c;然后分别成…