最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React中控制子組件顯示隱藏的兩種方式及對(duì)比詳解

 更新時(shí)間:2025年04月22日 09:22:57   作者:JacksonChen  
在 react 中,如果我們想控制子組件的顯示和隱藏一般有兩種方式,一種是父組件維護(hù)子組件顯示隱藏狀態(tài),另一種則是通過(guò) forwardRef 直接設(shè)置子組件的狀態(tài)進(jìn)行維護(hù),這兩種方式各有優(yōu)缺點(diǎn),以及對(duì)于不同的使用場(chǎng)景不同,今天我們就來(lái)簡(jiǎn)單討論下,需要的朋友可以參考下

方式一:子組件觸發(fā)函數(shù)修改父組件狀態(tài)

先來(lái)看一段代碼:

// 父組件
import React, { useState } from 'react';
import Modal from './Modal';

const ParentComponent = () => {
  const [isModalVisible, setIsModalVisible] = useState(false);

  const handleOpenModal = () => {
    setIsModalVisible(true);
  };

  const handleCloseModal = () => {
    setIsModalVisible(false);
  };

  return (
    <div>
    <button onClick={handleOpenModal}>打開(kāi)模態(tài)框</button>
     {isModalVisible && <Modal onClose={handleCloseModal} />}
    </div>
   );
  };

  export default ParentComponent;

  // 子組件
  import React from 'react';

  const Modal = ({ onClose }) => {
    return (
      <div className="modal">
      <p>這是一個(gè)模態(tài)框</p>
      <button onClick={onClose}>關(guān)閉模態(tài)框</button>
      </div>
    );
  };

  export default Modal;

在這段代碼中,父組件來(lái)維護(hù)狀態(tài) isModalVisible,當(dāng)子組件通過(guò)調(diào)用onClose 時(shí)來(lái)設(shè)置 isModalVisible為true/false。從而實(shí)現(xiàn)子組件的顯示或者隱藏。

優(yōu)點(diǎn):

每次重新銷(xiāo)毀組件重建直接通過(guò)isModalVisible && <Modal/> 控制組件掛載/卸載。對(duì)于需要每次展示都重置內(nèi)部狀態(tài)(如表單)的彈窗,這種銷(xiāo)毀重建的方式更符合預(yù)期。

痛點(diǎn):

每次子組件觸發(fā)onClose時(shí),父組件的狀態(tài)(isModalVisible)都會(huì)變化,進(jìn)而導(dǎo)致父組件及其所有子組件重新渲染。即使這個(gè)彈窗的顯隱邏輯完全獨(dú)立于父組件的其他邏輯,父組件仍然會(huì)被迫更新。

如果彈窗的顯隱邏輯完全屬于子組件自身(比如一個(gè)“確認(rèn)刪除”彈窗,點(diǎn)擊按鈕后才觸發(fā)關(guān)閉),那么讓父組件管理這個(gè)狀態(tài)就顯得多余,增加了不必要的代碼復(fù)雜度。

方案二:子組件自治——forwardRef

另一種思路是讓子組件自管理狀態(tài),通過(guò)useImperativeHandle暴露控制方法給父組件,看一段代碼:

// 子組件
const Modal = forwardRef((props, ref) => {
  const [visible, setVisible] = useState(false);

  useImperativeHandle(ref, () => ({
    open: () => setVisible(true),
    close: () => setVisible(false)
  }));

  return visible ? (
    <div className="modal">
      <button onClick={() => setVisible(false)}>關(guān)閉</button>
    </div>
  ) : null;
});

// 父組件
function Parent() {
  const modalRef = useRef();

  return (
    <div>
      <button onClick={() => modalRef.current?.open()}>打開(kāi)彈窗</button>
      <Modal ref={modalRef} />
    </div>
  );
}

優(yōu)點(diǎn):

父組件極簡(jiǎn)主義父組件無(wú)需維護(hù)任何狀態(tài),尤其適合多個(gè)彈窗的場(chǎng)景。調(diào)用modalRef.current.open() 簡(jiǎn)單直接,避免狀態(tài)聲明污染,也可以避免父組件及其所有子組件重新渲染。

痛點(diǎn):

  • 打破組件封裝性父組件對(duì)子組件內(nèi)部方法了如指掌,形成緊耦合。一旦子組件重構(gòu)方法名,所有父組件都需要同步修改。
  • 代碼復(fù)雜度每個(gè)組件都需要包裹forwardRef ,對(duì)于代碼開(kāi)發(fā)不是特別方便。

如何抉擇?

父組件狀態(tài)管理:

  • 彈窗顯隱與父組件狀態(tài)強(qiáng)相關(guān)(如表單提交成功后才展示)
  • 需要嚴(yán)格遵循單向數(shù)據(jù)流,方便狀態(tài)追溯
  • 彈窗內(nèi)部需要每次打開(kāi)重置狀態(tài)

forwardRef方案:

  • 同一彈窗在多個(gè)分散位置觸發(fā)(如頁(yè)面頭部和底部都有觸發(fā)按鈕)
  • 彈窗需要保持內(nèi)部狀態(tài)(如填寫(xiě)了一半的評(píng)論框臨時(shí)關(guān)閉)
  • 父組件層級(jí)過(guò)深,prop drilling成本過(guò)高

總結(jié)

到底是使用父組件維護(hù)還是使用forwardRef, 這取決于具體項(xiàng)目業(yè)務(wù)的需要 , 如果你的項(xiàng)目里彈窗的顯隱邏輯更多是子組件自己的事,而不是父組件的核心邏輯,那么forwardRef可能是更優(yōu)雅的解決方案。反之,如果彈窗的開(kāi)關(guān)直接影響父組件的核心狀態(tài)(如表單提交、數(shù)據(jù)加載),那么父組件管理仍然是更可靠的選擇。

以上就是React中控制子組件顯示隱藏的兩種方式及對(duì)比詳解的詳細(xì)內(nèi)容,更多關(guān)于React控制子組件顯示隱藏的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • react-beautiful-dnd拖拽排序功能的實(shí)現(xiàn)過(guò)程

    react-beautiful-dnd拖拽排序功能的實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了react-beautiful-dnd拖拽排序功能的實(shí)現(xiàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • React Native 圖片查看組件的方法

    React Native 圖片查看組件的方法

    這篇文章主要介紹了React Native 圖片查看組件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Vue?3開(kāi)發(fā)者轉(zhuǎn)型React保姆級(jí)教程(含實(shí)際項(xiàng)目案例)

    Vue?3開(kāi)發(fā)者轉(zhuǎn)型React保姆級(jí)教程(含實(shí)際項(xiàng)目案例)

    從Vue轉(zhuǎn)到React并不難,兩者作為主流前端框架,核心思想(組件化、聲明式編程)一致,但在語(yǔ)法、API設(shè)計(jì)和最佳實(shí)踐上存在差,這篇文章主要介紹了Vue3開(kāi)發(fā)者轉(zhuǎn)型React保姆級(jí)教程的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • React實(shí)現(xiàn)復(fù)雜搜索表單的展開(kāi)收起功能

    React實(shí)現(xiàn)復(fù)雜搜索表單的展開(kāi)收起功能

    本節(jié)對(duì)于需要展開(kāi)收起效果的查詢表單進(jìn)行概述,主要涉及前端樣式知識(shí)。對(duì)React實(shí)現(xiàn)復(fù)雜搜索表單的展開(kāi)-收起功能感興趣的朋友一起看看吧
    2021-09-09
  • React避免子組件無(wú)效刷新的三種解決方案

    React避免子組件無(wú)效刷新的三種解決方案

    這篇文章主要給大家介紹了React三種避免子組件無(wú)效刷新的解決方案,使用React.memo,使用React.useMemo或React.useCallback,將子組件作為children來(lái)傳遞這三種方案,文章通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • react+tsx中使用better-scroll詳解

    react+tsx中使用better-scroll詳解

    這篇文章主要介紹了react+tsx中使用better-scroll,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • 一文搞懂?React?18?中的?useTransition()?與?useDeferredValue()

    一文搞懂?React?18?中的?useTransition()?與?useDeferredValue()

    這篇文章主要介紹了一文搞懂?React?18?中的?useTransition()與useDeferredValue(),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • React頁(yè)面刷新數(shù)據(jù)不丟失的五種方案

    React頁(yè)面刷新數(shù)據(jù)不丟失的五種方案

    前端開(kāi)發(fā)中,相信大家都遇到過(guò)這樣的痛點(diǎn):頁(yè)面一刷新,辛辛苦苦填的表單數(shù)據(jù)沒(méi)了,精心選擇的篩選條件重置了,今天我們就來(lái)深入探討React中數(shù)據(jù)持久化的5大核心方案,從簡(jiǎn)單到復(fù)雜,幫你徹底解決這個(gè)難題,需要的朋友可以參考下
    2025-12-12
  • react16.8.0以上MobX在hook中的使用方法詳解

    react16.8.0以上MobX在hook中的使用方法詳解

    這篇文章主要為大家介紹了react16.8.0以上MobX在hook中的使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • React+Spring實(shí)現(xiàn)跨域問(wèn)題的完美解決方法

    React+Spring實(shí)現(xiàn)跨域問(wèn)題的完美解決方法

    這篇文章主要介紹了React+Spring實(shí)現(xiàn)跨域問(wèn)題的完美解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08

最新評(píng)論

马鞍山市| 仲巴县| 尖扎县| 客服| 上蔡县| 菏泽市| 招远市| 秦安县| 岐山县| 洛隆县| 江永县| 曲靖市| 陆川县| 衡南县| 五家渠市| 凌海市| 东乌珠穆沁旗| 呼和浩特市| 南和县| 南丰县| 观塘区| 青冈县| 漳州市| 东乡| 佳木斯市| 开化县| 基隆市| 来宾市| 普洱| 眉山市| 固阳县| 华池县| 固阳县| 临泉县| 邻水| 邻水| 常德市| 浮梁县| 扶余县| 漾濞| 调兵山市|