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

React中傳遞組件的三種方式小結(jié)

 更新時(shí)間:2023年07月27日 09:01:51   作者:viewer_w  
通過(guò)傳遞組件,我們可以將復(fù)雜組件內(nèi)部的一部分 UI 交由外部組件來(lái)控制渲染,這也是控制反轉(zhuǎn)(Inversion of Control)的一種體現(xiàn),在 React 中,我們可以通過(guò)三種方式來(lái)傳遞組件,本文就來(lái)給大家述說(shuō)這三種方式,需要的朋友可以參考下

React 中傳遞組件的三種方式

1. React Element as Prop (即我們通常所說(shuō)的組合)

這種方式是最常見的一種方式,我們可以將一個(gè) React Element 作為另一個(gè)組件的 prop,然后在內(nèi)部通過(guò)props.children來(lái)渲染這個(gè) React Element。這種方式的好處是簡(jiǎn)單易用,但是缺點(diǎn)也很明顯,那就是我們不方便對(duì)傳遞進(jìn)來(lái)的 React Element 進(jìn)行控制,比如我們很難對(duì)其 props 進(jìn)行控制。

假如我們?cè)O(shè)計(jì)一個(gè) Button 組件,Button 內(nèi)部的 Icon 區(qū)域交由外部來(lái)控制,那么我們可以這樣設(shè)計(jì):

// App.js
const App = () => <Button icon={<Icon />}>按鈕</Button>;
// Button.js
function Button(props) {
  return (
    <button>
      {props.icon}
      {props.children}
    </button>
  );
}

如果按鈕 Icon 的顏色要受到 APP 內(nèi)的 state 控制,我們很容易實(shí)現(xiàn)這樣的功能:

// App.js
const App = () => {
  const [color, setColor] = useState("red");
  return (
    <Button
      icon={<Icon color={color} />}
      onClick={() => setColor(color === "red" ? "blue" : "red")}
    >
      按鈕
    </Button>
  );
};

可見,這種方式下,傳遞的組件 Icon 很容易獲取外部環(huán)境 APP 組件的 state。但是如果 Icon 想獲取 Button 組件的內(nèi)部 state ,那么就不太容易了,因?yàn)?Button 組件無(wú)法控制 Icon 組件的 props。那么有沒(méi)有一種方式可以讓 Icon 組件獲取到 Button 組件的內(nèi)部 state 呢?答案是肯定的,那就是下面要介紹的第二種方式。

2. Component Function as Prop(傳遞組件函數(shù))

這種方式,我們傳遞的是組件的函數(shù),而不是組件本身。這樣一來(lái),我們就可以在組件內(nèi)部控制傳遞進(jìn)來(lái)的組件的 props 了。我們可以通過(guò)這種方式來(lái)實(shí)現(xiàn)上面的需求:

// App.js
import Icon from "./Icon";
const App = () => {
  return <Button icon={Icon}>按鈕</Button>;
};
// Button.js
function Button(props) {
  const Icon = props.icon; // 這里的 Icon 就是一個(gè)組件函數(shù),注意Icon的首字母要大寫
  const [color, setColor] = useState("red");
  return (
    <button>
      <Icon color={color} />
      {props.children}
    </button>
  );
}

可見,這種組件傳遞方式,我們可以在 Button 組件內(nèi)部控制 Icon 組件的 props,這樣 Icon 組件就可以獲取到 Button 組件的內(nèi)部 state 了。但是,這種方式也有缺點(diǎn),那就是 Icon 不能獲取外部環(huán)境(APP)的 state 了。那么有沒(méi)有一種方式可以讓 Icon 組件既能獲取到 Button 組件的內(nèi)部 state,又能獲取到外部環(huán)境(APP)的 state 呢?答案是肯定的,那就是下面要介紹的第三種方式。

3. Render Function as Prop(即 render props 渲染屬性)

這種方式,我們傳遞的是一個(gè)函數(shù),通過(guò)函數(shù)的參數(shù),我們可以獲取 Button 組件的內(nèi)部狀態(tài)。因?yàn)楹瘮?shù)是在外部環(huán)境(APP) 內(nèi)聲明的,所以也很容易獲得外部狀態(tài)。我們可以通過(guò)這種方式來(lái)實(shí)現(xiàn)上面的需求:

// App.js
import Icon from "./Icon";
const App = () => {
  const [size, setSize] = useState(16);
  return (
    <Button renderIcon={(color) => <Icon color={color} size={size} />}>
      按鈕
    </Button>
  );
};
// Button.js
function Button(props) {
  const [color, setColor] = useState("red");
  return (
    <button>
      {props.renderIcon(color)}
      {props.children}
    </button>
  );
}

總結(jié)

  • 看完上面的分析,你可能會(huì)認(rèn)為 render props 是最好的傳遞組件的方式,但是其實(shí)不然,render props 也有缺點(diǎn):a.組件層級(jí)不清晰,可讀性差;b.re-render 問(wèn)題。所以,我們?cè)趯?shí)際開發(fā)中,應(yīng)該根據(jù)實(shí)際情況來(lái)選擇傳遞組件的方式:

如果傳遞的組件只需要獲取外部環(huán)境的 state,那么我們可以使用 React Element as Prop 的方式;

如果傳遞的組件需要獲取宿主組件的 state,那么我們可以使用 Component Function as Prop 的方式;

如果傳遞的組件需要獲取宿主組件的 state,同時(shí)也需要獲取外部環(huán)境的 state,那么我們可以使用 Render Function as Prop 的方式。

  • 其實(shí) React Element as Prop 的方式可以通過(guò) React.cloneElement() 來(lái)獲取宿主組件的內(nèi)部狀態(tài)。Componet Function as Prop 的方式可以通過(guò)高階組件(HOC)的方式來(lái)注入外部狀態(tài)。所以三種組件傳遞方式都可以做到內(nèi)外部狀態(tài)的獲取,只不過(guò)那樣的代碼不夠優(yōu)雅。

  • 對(duì)于 Button 組件來(lái)說(shuō),第一種方式 props.icon 是一個(gè) object, 后面兩種方式 props.icon 都是 function ,可能有些人會(huì)搞不懂他們的區(qū)別,其實(shí)區(qū)別在于 Button 內(nèi)部消費(fèi) props.icon 的方式不同,一種是當(dāng)成函數(shù)來(lái)調(diào)用執(zhí)行,一種是當(dāng)做函數(shù)組件來(lái)聲明。

以上就是React中傳遞組件的三種方式小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于React傳遞組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React Native 啟動(dòng)流程詳細(xì)解析

    React Native 啟動(dòng)流程詳細(xì)解析

    這篇文章主要介紹了React Native 啟動(dòng)流程簡(jiǎn)析,文以 react-native-cli 創(chuàng)建的示例工程(安卓部分)為例,給大家分析 React Native 的啟動(dòng)流程,需要的朋友可以參考下
    2021-08-08
  • react 可拖拽進(jìn)度條的實(shí)現(xiàn)

    react 可拖拽進(jìn)度條的實(shí)現(xiàn)

    本文主要介紹了react 可拖拽進(jìn)度條的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • React Native 中實(shí)現(xiàn)確認(rèn)碼組件示例詳解

    React Native 中實(shí)現(xiàn)確認(rèn)碼組件示例詳解

    這篇文章主要為大家介紹了React Native中實(shí)現(xiàn)確認(rèn)碼組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Electron+React進(jìn)行通信的方法

    Electron+React進(jìn)行通信的方法

    electron其實(shí)是一個(gè)桌面應(yīng)用程序,不是一個(gè)標(biāo)準(zhǔn)的前端web程序,所有沒(méi)有什么請(qǐng)求的發(fā)生,控制臺(tái)network看不到請(qǐng)求,而是只能通過(guò)console.log去打印查看,而且通信協(xié)議使用的不是http而是gRPC協(xié)議,這篇文章主要介紹了Electron+React如何進(jìn)行通信,需要的朋友可以參考下
    2022-06-06
  • ahooks整體架構(gòu)及React工具庫(kù)源碼解讀

    ahooks整體架構(gòu)及React工具庫(kù)源碼解讀

    這篇文章主要為大家介紹了ahooks整體架構(gòu)及React工具庫(kù)的源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 阿里低代碼框架lowcode-engine自定義設(shè)置器詳解

    阿里低代碼框架lowcode-engine自定義設(shè)置器詳解

    這篇文章主要為大家介紹了阿里低代碼框架lowcode-engine自定義設(shè)置器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • React為 Vue 引入容器組件和展示組件的教程詳解

    React為 Vue 引入容器組件和展示組件的教程詳解

    這篇文章主要介紹了React為 Vue 引入容器組件和展示組件的教程詳解,文中很詳細(xì)的給大家介紹了使用容器組件的原因,需要的朋友可以參考下
    2018-05-05
  • React+Redux實(shí)現(xiàn)簡(jiǎn)單的待辦事項(xiàng)列表ToDoList

    React+Redux實(shí)現(xiàn)簡(jiǎn)單的待辦事項(xiàng)列表ToDoList

    這篇文章主要為大家詳細(xì)介紹了React+Redux實(shí)現(xiàn)簡(jiǎn)單的待辦事項(xiàng)列表ToDoList,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • react 頁(yè)面加載完成后自動(dòng)執(zhí)行標(biāo)簽的點(diǎn)擊事件的兩種操作方法

    react 頁(yè)面加載完成后自動(dòng)執(zhí)行標(biāo)簽的點(diǎn)擊事件的兩種操作方法

    這篇文章主要介紹了react 頁(yè)面加載完成后自動(dòng)執(zhí)行標(biāo)簽的點(diǎn)擊事件,本文給大家分享兩種操作方法結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • React組件的生命周期深入理解分析

    React組件的生命周期深入理解分析

    組件的生命周期就是React的工作過(guò)程,就好比人有生老病死,自然界有日月更替,每個(gè)組件在網(wǎng)頁(yè)中也會(huì)有被創(chuàng)建、更新和刪除,如同有生命的機(jī)體一樣
    2022-12-12

最新評(píng)論

九江县| 松江区| 城固县| 西和县| 电白县| 祁东县| 宜丰县| 衡水市| 湟源县| 仪陇县| 来凤县| 延庆县| 奇台县| 壤塘县| 通山县| 平罗县| 华蓥市| 武穴市| 滕州市| 房产| 平舆县| 玛沁县| 通化县| 舞钢市| 甘洛县| 玉树县| 肃宁县| 海淀区| 连南| 苗栗县| 海晏县| 龙里县| 兴义市| 甘肃省| 长阳| 五指山市| 道孚县| 武陟县| 通化县| 镇雄县| 吉林市|