4 回答

TA貢獻1921條經驗 獲得超9個贊
將組件 css 更改為顯示隱藏應該只會在視覺上隱藏它,但組件仍應掛載在 DOM 樹上。
也許你的 API 獲取是在每次重新渲染時發生的,而它應該只在組件安裝時發生。

TA貢獻1789條經驗 獲得超10個贊
這正是預期的行為,您可以做的不是使用 CSS 隱藏組件,而是返回并清空 Fragment,如果“isOpen”為真,則阻止 API 調用,如果這些調用來自內部組件
<> </>
如果可能的話

TA貢獻1802條經驗 獲得超5個贊
我最終將不關心 parent 道具的主要內容包裝在PureComponent
.
React 的 PureComponent 對組件的 props 和 state 進行了淺層比較。如果什么都沒有改變,它會阻止組件的重新渲染。如果發生了變化,它會重新渲染組件。

TA貢獻1804條經驗 獲得超7個贊
每次組件觸發狀態更改時,即使子組件不依賴于該狀態,它的子組件也會重新渲染。要解決此問題,您需要將子組件包裝React.memo為功能組件或PureComponent用于類組件。這將檢查道具變化并重新渲染孩子。
這里有一個組件在掛載上獲取數據的示例,并有一個觸發狀態的按鈕click:代碼
import React, { useState, useEffect } from "react";
import "./styles.css";
import MyData from "./MyData";
const fakePromise = () =>
new Promise((resolve) => {
setTimeout(() => {
resolve("data returned");
}, 2000);
});
export default function App() {
const [hidden, setHidden] = useState(false);
const [data, setData] = useState();
useEffect(() => {
const fetchData = async () => {
try {
const data = await fakePromise();
setData(data);
} catch (error) {
throw error;
}
};
fetchData();
}, []);
return (
<div className="App">
<div style={{ display: hidden ? "none" : "block" }}>I am visible</div>
<button onClick={() => setHidden(!hidden)}>Toggle Visiblity</button>
{data && <MyData data={data} />}
</div>
);
}
在示例中,您可以看到MyData組件不依賴隱藏狀態,但如果我們不將其包裝在React.memo.
我的數據.js
import React from "react";
const MyData = ({ data }) => {
console.log("render");
return (
<div>
<h1>{data}</h1>
</div>
);
};
//export default MyData;
export default React.memo(MyData);
注意:React.memo比較當前道具和下一個道具,如果其中一些道具是函數或靜態數據,則array/object每次組件重新渲染時將重新創建這些道具,這將重新渲染孩子,因此您需要使用useCallback或之類的鉤子來記住這些道具useMemo。
謝謝希望這能回答你的問題。
添加回答
舉報