4 回答

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
將組件 css 更改為顯示隱藏應(yīng)該只會(huì)在視覺上隱藏它,但組件仍應(yīng)掛載在 DOM 樹上。
也許你的 API 獲取是在每次重新渲染時(shí)發(fā)生的,而它應(yīng)該只在組件安裝時(shí)發(fā)生。

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

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
我最終將不關(guān)心 parent 道具的主要內(nèi)容包裝在PureComponent
.
React 的 PureComponent 對(duì)組件的 props 和 state 進(jìn)行了淺層比較。如果什么都沒有改變,它會(huì)阻止組件的重新渲染。如果發(fā)生了變化,它會(huì)重新渲染組件。

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊
每次組件觸發(fā)狀態(tài)更改時(shí),即使子組件不依賴于該狀態(tài),它的子組件也會(huì)重新渲染。要解決此問題,您需要將子組件包裝React.memo為功能組件或PureComponent用于類組件。這將檢查道具變化并重新渲染孩子。
這里有一個(gè)組件在掛載上獲取數(shù)據(jù)的示例,并有一個(gè)觸發(fā)狀態(tài)的按鈕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組件不依賴隱藏狀態(tài),但如果我們不將其包裝在React.memo.
我的數(shù)據(jù).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比較當(dāng)前道具和下一個(gè)道具,如果其中一些道具是函數(shù)或靜態(tài)數(shù)據(jù),則array/object每次組件重新渲染時(shí)將重新創(chuàng)建這些道具,這將重新渲染孩子,因此您需要使用useCallback或之類的鉤子來記住這些道具useMemo。
謝謝希望這能回答你的問題。
添加回答
舉報(bào)