gpt4 book ai didi

reactjs - 当数组未更改时,在每个渲染中都会调用 useEffect 数组依赖项

转载 作者:行者123 更新时间:2023-12-03 13:29:53 27 4
gpt4 key购买 nike

import React, { useState, useEffect } from "react";

export default function App() {
const [columns, setColumns] = useState([
{ name: "a" },
{ name: "b" },
{ name: "c" }
]);
const [isOpen, setIsOpen] = useState(false);

const addName = () => setColumns([...columns, { name: "r" }]);
const toggleOpen = () => setIsOpen(!isOpen);

return (
<>
<List columns={columns} />
<button onClick={toggleOpen}>Toggle</button>
<button onClick={addName}>Add</button>
<p>{isOpen.toString()}</p>
</>
);
}

const List = ({ columns }) => {
const names = columns.map(col => col.name);
useEffect(() => {
console.log("Names is changed to: ", names);
}, [names]);

return <p>{names.join(" ")}</p>;
};
App 组件中的 isOpen 状态更改时,

Names 更改为: 被调用。我希望仅当名称数组更改时才执行 console.log 。我认为在 List 组件中,每次渲染时都会创建一个新数组,因此之前的数组和新数组不相等。

最佳答案

should memoize the component因此它将仅在 props 更改时渲染(或者如果比较函数作为第二个参数传递)。

目前,List 由于其父 App 渲染而呈现。

const List = ({ columns }) => {
const names = columns.map((col) => col.name);
useEffect(() => {
console.log("Names is changed to: ", names);
}, [names]);

return <p>{names.join(" ")}</p>;
};

const MemoList = React.memo(List);

export default function App() {
return (
<>
<MemoList columns={columns} />
</>
);
}

查看工作示例:

Edit polished-pine-j17om

<小时/>

对于类组件,使用React.PureComponent或实现shouldComponentUpdate

关于reactjs - 当数组未更改时,在每个渲染中都会调用 useEffect 数组依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61839154/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com