React - 即使不依赖父状态,子组件也会重新呈现
React - child component re-renders even if it doesn't rely on the parent state
console.log('Render test')
在我的测试组件中运行了两次。
没有使用测试状态,我只是把它放在那里作为示例。测试组件不依赖于测试状态,但它仍然呈现两次。为什么?
index.js:
import React from "react";
import ReactDOM from "react-dom";
import AppTest from "./AppTest";
ReactDOM.render(<><AppTest /></>, document.getElementById("container"));
AppTest.js:
import Test from "./Test";
import React, {useState, useEffect} from "react";
function AppTest() {
const [tests, setTests] = useState([]);
useEffect(() => {
setTests(['test1', 'test2']);
}, []);
return (
<>
<Test />
</>
);
}
export default AppTest;
Test.js:
import React, {useEffect} from "react";
function Test() {
useEffect(() => {
console.log("Render Test");
});
return (
<h1>Test</h1>
);
}
export default Test;
您可以使用 React.memo 来防止重新渲染,除非道具发生变化 - 这有更多信息 -
useEffect
运行两次,因为它缺少依赖项数组。添加一个空数组表示它没有依赖关系,然后你不会看到多个日志语句:
function Test() {
useEffect(() => {
console.log("Render Test");
}, []);
// ...
}
由于 AppTest 组件的行为,组件 Test 被渲染了两次。 AppTest 中的 useEffect 函数使用 setTests(['test1', 'test2']);
修改组件的状态,因此 AppTest 组件为 re-rendered.
如前所述,您可以使用记忆来避免re-render测试组件:
import React, {useEffect} from "react";
const Test= React.memo(()=> {
useEffect(() => {
console.log("Render Test");
});
return (
<h1>Test</h1>
);
}
export default Test;
console.log('Render test')
在我的测试组件中运行了两次。
没有使用测试状态,我只是把它放在那里作为示例。测试组件不依赖于测试状态,但它仍然呈现两次。为什么?
index.js:
import React from "react";
import ReactDOM from "react-dom";
import AppTest from "./AppTest";
ReactDOM.render(<><AppTest /></>, document.getElementById("container"));
AppTest.js:
import Test from "./Test";
import React, {useState, useEffect} from "react";
function AppTest() {
const [tests, setTests] = useState([]);
useEffect(() => {
setTests(['test1', 'test2']);
}, []);
return (
<>
<Test />
</>
);
}
export default AppTest;
Test.js:
import React, {useEffect} from "react";
function Test() {
useEffect(() => {
console.log("Render Test");
});
return (
<h1>Test</h1>
);
}
export default Test;
您可以使用 React.memo 来防止重新渲染,除非道具发生变化 - 这有更多信息 -
useEffect
运行两次,因为它缺少依赖项数组。添加一个空数组表示它没有依赖关系,然后你不会看到多个日志语句:
function Test() {
useEffect(() => {
console.log("Render Test");
}, []);
// ...
}
由于 AppTest 组件的行为,组件 Test 被渲染了两次。 AppTest 中的 useEffect 函数使用 setTests(['test1', 'test2']);
修改组件的状态,因此 AppTest 组件为 re-rendered.
如前所述,您可以使用记忆来避免re-render测试组件:
import React, {useEffect} from "react";
const Test= React.memo(()=> {
useEffect(() => {
console.log("Render Test");
});
return (
<h1>Test</h1>
);
}
export default Test;