亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

React - 重新渲染道具更改/動態更改 css 而無需重新渲染

React - 重新渲染道具更改/動態更改 css 而無需重新渲染

DIEA 2022-12-22 12:16:33
我需要在顯示/隱藏導航時隱藏 React 應用程序上的頁面內容。為此,我們將一個 prop 傳遞給組件,并像這樣處理樣式化組件中的顯示 css:<PageContent isOpen={isOpen}>const PageContent = styled.div`   display: ${props => (props.isOpen ? 'none' : 'block')}; `;雖然這工作正常,但當 prop 更改時,內頁內容會重新呈現,這是預期的但不是期望的。在這種情況下,頁面內容包括一些從 API 獲取的內容,因此每次打開/關閉導航時,我們都會再次呈現內容并再次從 API 獲取不需要的內容。有沒有辦法動態控制隱藏/顯示主要內容持有者,而無需每次都重新渲染?或者我們應該更多地關注執行獲取而不是更新它的組件?
查看完整描述

4 回答

?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

將組件 css 更改為顯示隱藏應該只會在視覺上隱藏它,但組件仍應掛載在 DOM 樹上。

也許你的 API 獲取是在每次重新渲染時發生的,而它應該只在組件安裝時發生。


查看完整回答
反對 回復 2022-12-22
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

這正是預期的行為,您可以做的不是使用 CSS 隱藏組件,而是返回并清空 Fragment,如果“isOpen”為真,則阻止 API 調用,如果這些調用來自內部組件

 <>
 </>

如果可能的話


查看完整回答
反對 回復 2022-12-22
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

我最終將不關心 parent 道具的主要內容包裝在PureComponent.

React 的 PureComponent 對組件的 props 和 state 進行了淺層比較。如果什么都沒有改變,它會阻止組件的重新渲染。如果發生了變化,它會重新渲染組件。


查看完整回答
反對 回復 2022-12-22
?
三國紛爭

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。


謝謝希望這能回答你的問題。


查看完整回答
反對 回復 2022-12-22
  • 4 回答
  • 0 關注
  • 236 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號