防止由子组件对父组件数组的更新引起的无限重新渲染
P粉197639753
P粉197639753 2024-02-26 10:26:24
[React讨论组]

在学生(儿童)组件中

  • 当变量的值发生变化时,useEffect 挂钩将通过 handleStudentsChange(父组件提供的函数)更新父数组。

在学生(家长)组件中

  • 呈现学生(子级)组件列表
  • 为了防止无限循环,handleStudentsChange 函数使用 useCallback 挂钩定义。然而,它似乎不起作用。

问题/疑问

  • 一旦发生更改,handleStudentsChange 就会无限运行
  • 这是为什么呢?以及如何修复它?
  • 注意:我不需要 onSubmit 按钮

请参阅此处的代码: 我是 CodeSandBox 链接

Student.tsx(儿童)

import React, { useState, useEffect, useRef } from "react";
import TextField from "@mui/material/TextField";

interface student {
  firstName: string;
  lastName: string;
  grade: number;
}

interface studentProps {
  id: number;
  firstName: string;
  lastName: string;
  grade: number;
  handleStudentsChange: (index: number, student: student) => void;
}

function Student(props: studentProps) {
  const [firstName, setFirstName] = useState(props.firstName);
  const [lastName, setLastName] = useState(props.lastName);
  const [grade, setGrade] = useState(props.grade);

  useEffect(() => {
    handleStudentsChange(id, {
      firstName: firstName,
      lastName: lastName,
      grade: grade
    });
  }, [firstName, lastName, grade, props]);

  return (
    <>
       setFirstName(event.target.value)}
        value={firstName}
      />
       setLastName(event.target.value)}
        value={lastName}
      />
       setGrade(+event.target.value)}
        value={grade}
      />
    
  );

Students.tsx(父级)

import React, { useState, useCallback } from "react";
import Student from "./Student";

interface student {
  firstName: string;
  lastName: string;
  grade: number;
}

export default function Students() {
  const [students, setStudents] = useState([
    { firstName: "Justin", lastName: "Bieber", grade: 100 },
    { firstName: "Robert", lastName: "Oppenhiemer", grade: 100 }
  ]);

  const handleStudentsChange = useCallback(
    (index: number, updatedStudent: student) => {
      // console.log(index) //I only want this to rerender when the value change however it turn into an infinity loop
      setStudents((prevStudents) => {
        const updatedStudents = [...prevStudents];
        updatedStudents[index] = updatedStudent;
        return updatedStudents;
      });
    },
    []
  );

  return (
    <>
      {students.map((student, index) => {
        return (
          
              handleStudentsChange(index, newStudent)
            }
          />
        );
      })}
    
  );
}

如上面的代码所示,我尝试在学生(儿童)组件上使用 React.memo ,并在 handleStudentsChange 上使用 useCallback ,希望能够防止无限循环。然而,无限循环仍在继续。

P粉197639753
P粉197639753

全部回复(0)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号