多次执行代码

来源:4-5 【副作用钩子】使用useEffect异步获取数据

慕慕4402846

2022-08-03

import React, { useEffect, useState } from 'react';
import logo from './assets/images/logo.svg';
import robots from './mockdata/robot.json';
import Robot from './components/robot';
import styles from './App.module.css'
import ShoppingCar from './components/ShoppingCar';
import { render } from '@testing-library/react';

interface Props{}
interface State{
  robotGallery:any[];
}
const App:React.FC =(props)=>{
  const [ count,setCount ] = useState<number>(0);
  const [robotGallery,setRobotGallery] = useState<any>([])
  useEffect(()=>{
    document.title=`点击${count}次`
  },[count])
  console.log("123")
  useEffect(()=>{
    fetch("https://jsonplaceholder.typicode.com/users")
    .then(res=>res.json())
    .then(data=>setRobotGallery(data))
  },[])
    return (
      <div className={styles.app}>
      <div className={styles.appHeader}>
        <img src={logo} className={styles.appLogo} alt="" />
        <h1>罗伯特机器人炫酷吊炸天online购机平台名字要长才吊</h1>
      </div>
      <button onClick={()=>{
          setCount(count+1)
        }
      }>
        click
      </button>
      <span>count:{count}</span>
      <ShoppingCar></ShoppingCar>
      <div className={styles.robotList}>
        {robotGallery.map((r:any)=>{
          return <Robot id={r.id} name={r.name} email={r.email}></Robot>
        })}
      </div>
    </div>
    )
}

export default App;

老师您好:我在console.log(“123”)这里打断点,为什么执行了6次呢 ,接口也是在network中显示发起了2次

写回答

1回答

慕粉3726649

2022-08-04

我执行了你的代码,确实有6次。

//img.mukewang.com/szimg/62eb6ed309e772e205990182.jpg

但这其中要看的其实是第一次、第三次和第五次,其他都是react工具跑出来的结果(我的理解)。

至于这真正的三次,一次是因为react strictmode会多执行一次,可以把index.tsx里面strictmode去掉。参考:https://juejin.cn/post/6844904084768587790

另一次是因为setRobotGallery这个副作用的state赋值,每次setState都会渲染一次组件。

1
0

React18 系统精讲 结合TS打造旅游电商平台

React18 精讲 + 结合 TS 实战 + 热门业务开发,获取必备技能

1993 学习 · 1015 问题

查看课程