当前位置: 首页 > 知识库问答 >
问题:

react.js - React 页面请求两次的问题 ?

阳德润
2023-05-18

正在学习 React 不懂为什么用了 useEffect 还会发起两次请求,应该怎么解决?

import { Button } from 'antd-mobile'
import data from './request/page'
import { useState, useEffect } from 'react';
function Page() {

    const [list, setList] = useState([])

    useEffect(() => {
        data().then((e) => {
            console.log(e);
        })
    }, [])


    return (
       <div>
           {list.map(e => e )}
       </div>
    )
}

export default Page

image.png

共有2个答案

易奇希
2023-05-18

请把 请求截图发上来

罗法
2023-05-18
  1. 这是 React18 才新增的特性。
  2. 仅在开发模式("development")下,且使用了严格模式("Strict Mode")下会触发。
    生产环境("production")模式下和原来一样,仅执行一次。
  3. 之所以执行两次,是为了模拟立即卸载组件和重新挂载组件。
    为了帮助开发者提前发现重复挂载造成的 Bug 的代码。
    同时,也是为了以后 React的新功能做铺垫。
    未来会给 React 增加一个特性,允许 React 在保留状态的同时,能够做到仅仅对UI部分的添加和删除。
    让开发者能够提前习惯和适应,做到组件的卸载和重新挂载之后, 重复执行 useEffect的时候不会影响应用正常运行。

useEffect 除了在组件渲染的时候执行外,在组件卸载的时候也有相关执行操作。 在组件卸载的时候会执行 useEffect 方法的return语句。


useEffect(() => { window.a = 100; return (window.a = 0); }, []); 

如上代码段,当组件渲染的时候会执行window.a = 100,当组件卸载的时候会执行window.a = 0。
根据你题目中的异步请求可以这样:

useEffect(() => {
  let ignore = false;
  async function startFetching() {
    const json = await fetchTodos(userId);
    // 这里执行是异步的,所以第一次执行到此处的时候组件已经被卸载了
    // 此时的 ignore 已经被 return 里面的方法置为 true 了
    // 所以这里第一次执行的时候不执行 setTodos(json)
    // setTodos 其实是在第二次执行的时候才触发
    if (!ignore) {
      setTodos(json);
    }
  }
  startFetching();

  return () => {
    ignore = true;
  };
}, [userId]);

具体方式参考:

https://juejin.cn/post/7137654077743169573
https://juejin.cn/post/7105652180501135367
等等等.........
 类似资料:
  • 一个简单的页面: app\fetch-demo\page.js 浏览器控制台返回两次同样的结果: 为什么会这样?

  • 在其生命周期的各个阶段截取和修改请求的内容 进程: 主进程​ WebRequest类的实例是通过使用 Session的 webRequest属性来访问。 每个 API 接收一可选的 filter 和 listener,当 API 事件发生的时候使用 listener(details) 调用 listener, details 是一个用来描述请求的对象.将 null作为 listener传递将取消订

  • 问题内容: import scrapy from selenium import webdriver 此解决方案效果很好,但是它对相同的URL两次请求,一个是scrapy Scheduler,另一个是Selenium Web驱动程序。 与没有selenium的苛刻要求相比,完成这项工作将花费两倍的时间。如何避免这种情况? 问题答案: 这是解决这个问题的有用技巧。 *为硒 *创建一个Web服务 ,在

  • 需求如下: 在页面上显示服务器的时间, 每隔十分钟与服务器同步一次,在此期间,前端使用定时器进行递增显示时间,在正常情况下是可以的。但是在页面切换到后台之后,由于浏览器的机制导致定时器执行比预期的慢,页面显示回来的时候,时间已经比预期的慢一点了, 想通过页面切换后,重新加载服务器时间进行更新,但是无效果 最后使用了worker 进行刷新的。

  • 问题内容: 我有一个像这样呈现的React.js组件: 页面上有一些事件会更新,结果是经过渲染,这会将新的prop 发送到组件。 在此组件中,我正在侦听这样的更新: 该控制台行被渲染两次,这使UI两次闪烁,同时调用社交网络。 我总是可以做这样的事情: 但是感觉有点… 是否会出现双重消息?如果是这样,好奇为什么? 如果没有,找到并消除它的最佳方法是什么? 问题答案: 您的组件可能被渲染两次,因为在父

  • 本文向大家介绍关于ajax的多次请求问题,包括了关于ajax的多次请求问题的使用技巧和注意事项,需要的朋友参考一下 我们在用ajax请求数据时,可能会遇到一次点击多次触发的可能。 (比如说:ajax 的 onreadystatechange 事件就会触发多次;这是因为 onreadystatechange 是一个事件句柄。 它的值 (state_Change) 是一个函数的名称,当 XMLHttp