欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ComponentLoader?與動(dòng)態(tài)組件實(shí)例詳解

 更新時(shí)間:2023年05月08日 14:29:41   作者:黃子毅  
這篇文章主要為大家介紹了ComponentLoader?與動(dòng)態(tài)組件實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

組件通過(guò) <Canvas /> 渲染在畫(huà)布上,內(nèi)容完全由組件樹(shù) componentTree 驅(qū)動(dòng),但也有一些情況我們需要把某個(gè)組件實(shí)例渲染到組件樹(shù)之外,比如全屏、置頂?shù)葓?chǎng)景,甚至有些時(shí)候我們要渲染一個(gè)不在組件樹(shù)中的臨時(shí)組件,卻要擁有一系列畫(huà)布能力。

為了讓組件渲染更靈活,我們暴露出 <ComponentLoader> API:

import { createDesigner } from 'designer'
const { Designer, Canvas, ComponentLoader } = createDesigner()
const App = () => {
  return (
    <Designer componentTree={/** ... */}>
      <Canvas />
      {/** 任意位置,甚至 Canvas 的組件實(shí)例內(nèi)使用 ComponentLoader 加載任意組件 */}
      <ComponentLoader />
    </Designer>
  )
}

組件加載器有三種用法:按組件 ID 加載、按組件樹(shù)路徑加載、動(dòng)態(tài)組件,下面分別介紹。

按組件 ID 加載

將組件樹(shù)上的某個(gè)組件渲染到任何地方,即一個(gè)組件實(shí)例渲染到 N 個(gè)地方,實(shí)例級(jí)別信息共享,渲染為 N 份:

<ComponentLoader componentId="input1" />

如上例子,將組件 ID 為 input1 的組件渲染到目標(biāo)位置。

甚至可以在組件內(nèi)套組件,比如我們定義一個(gè)容器組件,內(nèi)置渲染 ID 為 input1 的子組件:

const container: ComponentMeta = {
  componentName: 'container',
  // 組件 props 會(huì)自動(dòng)注入 ComponentLoader
  element: ({ ComponentLoader, children }) => {
    return (
      <div>
        <ComponentLoader componentId="input1" />
        {children}
      </div>
    )
  }
}

當(dāng)該組件 ID 在組件樹(shù)中被移除時(shí),<ComponentLoader componentId="input1" /> 返回 null。

按組件樹(shù)路徑加載

如果組件在組件樹(shù)上沒(méi)有 ID,或者你希望固定渲染某個(gè)位置的組件,而無(wú)論組件樹(shù)如何變化,那么就可以采用按組件樹(shù)路徑的加載模式,將 componentId 替換為 treePath 即可:

<ComponentLoader treePath="children.0" />

如上例子,渲染的是 componentTree 根節(jié)點(diǎn) children.0 位置的子組件,同樣,但組件不存在時(shí)返回 null。

動(dòng)態(tài)組件

如果要渲染一個(gè)不存在于組件樹(shù)的組件實(shí)例,還可以這么用 <ComponentLoader />:

<ComponentLoader standalone componentName="card" />

即添加 standalone 表示它為一個(gè) “孤立” 組件,即不存在于組件樹(shù)的組件,以及 componentName 指定組件名。

之所以不需要指定 componentId,是因?yàn)槊總€(gè) ComponentLoader 此時(shí)都是一個(gè)唯一的實(shí)例,在 designer 內(nèi)部會(huì)自動(dòng)分配一個(gè)固定的組件 ID。

這么設(shè)計(jì)非常靈活,但實(shí)現(xiàn)起來(lái)難度是有一些,主要注意兩點(diǎn):

  • 動(dòng)態(tài)組件不存在于組件樹(shù),但我們之前設(shè)計(jì)在組件元信息的所有功能都要可以響應(yīng),這就要求框架代碼不能依賴組件樹(shù)產(chǎn)生作用,而是將所有組件獨(dú)立存儲(chǔ)計(jì)算,包括組件樹(shù)上的,以及動(dòng)態(tài)組件。
  • 性能,獨(dú)立組件加載器之間的執(zhí)行并無(wú)關(guān)聯(lián),因?yàn)榭蚣鼙旧頌轫憫?yīng)式,為了防止頻繁刷新或頻繁計(jì)算需要設(shè)計(jì)一套自動(dòng)批處理機(jī)制,類似 React 自動(dòng) batch 的實(shí)現(xiàn)。

對(duì)于動(dòng)態(tài)組件,我們還可以傳遞更多參數(shù):

<ComponentLoader standalone componentName="chart" props={{ color: 'red' }}>
  <button>click</button>
</ComponentLoader>

如上例子,我們傳了額外 props 屬性,以及一個(gè)子元素給 chart 組件實(shí)例。

特別的,如果傳遞了 componentId,可以將該動(dòng)態(tài)組件的 ID 固定下來(lái),方便進(jìn)行聯(lián)動(dòng):

<ComponentLoader standalone componentName="chart" componentId="abc" />

但動(dòng)態(tài)組件也有一些限制,如下:

  • 該方式渲染的組件元信息定義的 defaultProps、props 不會(huì)生效,因?yàn)椴淮嬖谟诮M件樹(shù)中。
  • 該組件無(wú)法通過(guò) deleteComponent 刪除,也無(wú)法通過(guò) setProps、setComponent 等修改,因?yàn)殇秩就耆筛附M件控制,而不由組件樹(shù)控制。
  • 不能用 setParent 改變這種組件的位置,因?yàn)槠湮恢迷诖a中被固定了。

總結(jié)

其實(shí) <Canvas /> 根節(jié)點(diǎn)本質(zhì)上等價(jià)于 <ComponentLoader treePath="" />,即從根節(jié)點(diǎn)開(kāi)始渲染一個(gè)組件實(shí)例。

所以提供 ComponentLoader 勢(shì)必會(huì)讓業(yè)務(wù)能力更靈活,在任意位置渲染組件,甚至渲染一個(gè)不存在于組件樹(shù)的動(dòng)態(tài)組件。

討論地址是:精讀《ComponentLoader 與動(dòng)態(tài)組件》· Issue #482 · dt-fe/weekly

以上就是ComponentLoader 與動(dòng)態(tài)組件實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于ComponentLoader 動(dòng)態(tài)組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • RxJS中的Observable和Observer示例詳解

    RxJS中的Observable和Observer示例詳解

    這篇文章主要為大家介紹了RxJS中的Observable和Observer使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 微信小程序 Canvas增強(qiáng)組件實(shí)例詳解及源碼分享

    微信小程序 Canvas增強(qiáng)組件實(shí)例詳解及源碼分享

    這篇文章主要介紹了微信小程序 Canvas增強(qiáng)組件實(shí)例詳解及源碼分享的相關(guān)資料,WeZRender是一個(gè)微信小程序Canvas增強(qiáng)組件,這里詳細(xì)介紹,需要的朋友可以參考下
    2017-01-01
  • 帶你理解JavaScript 原型原型鏈

    帶你理解JavaScript 原型原型鏈

    理解js中原型、原型鏈這個(gè)概念,絕對(duì)是幫助我們更深入學(xué)習(xí)js的必要一步,比如,如果js開(kāi)發(fā)者想理解js繼承,new關(guān)鍵字原理,甚至封裝組件、優(yōu)化代碼,弄明白js中原型、原型鏈更是前提條件。本篇文章,用最簡(jiǎn)潔的文字,清楚明白講解原型鏈相等關(guān)系和原型、原型鏈存在的意義
    2021-09-09
  • WebAssembly使用方法研究

    WebAssembly使用方法研究

    這篇文章主要為大家介紹了WebAssembly使用方法研究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 解析Javascript設(shè)計(jì)模式Revealing?Module?揭示模式單例模式

    解析Javascript設(shè)計(jì)模式Revealing?Module?揭示模式單例模式

    這篇文章主要為大家解析了Javascript設(shè)計(jì)模式Revealing?Module?揭示模式及Singleton單例模式示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • JavaScript的八種數(shù)據(jù)類型

    JavaScript的八種數(shù)據(jù)類型

    這篇文章主要分享的是JavaScript的八種數(shù)據(jù)類型,ES5的時(shí)候,我們大家認(rèn)知的數(shù)據(jù)類型是?6種的,但是ES6?中新增了一種?Symbol,谷歌67版本中還出現(xiàn)了一種?bigInt,是指安全存儲(chǔ)、操作大整數(shù),像下面文章我可沒(méi)就來(lái)看看這八種數(shù)據(jù)類型的詳細(xì)介紹吧
    2022-01-01
  • 微信小程序 (七)數(shù)據(jù)綁定詳細(xì)介紹

    微信小程序 (七)數(shù)據(jù)綁定詳細(xì)介紹

    這篇文章主要介紹了微信小程序數(shù)據(jù)綁定詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • 微信小程序 swiper制作tab切換實(shí)現(xiàn)附源碼

    微信小程序 swiper制作tab切換實(shí)現(xiàn)附源碼

    這篇文章主要介紹了微信小程序 swiper制作tab切換實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 微信小程序 藍(lán)牙的實(shí)現(xiàn)實(shí)例代碼

    微信小程序 藍(lán)牙的實(shí)現(xiàn)實(shí)例代碼

    這篇文章主要介紹了微信小程序 藍(lán)牙的實(shí)現(xiàn)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 網(wǎng)頁(yè)的標(biāo)準(zhǔn),IMG不支持onload標(biāo)簽怎么辦

    網(wǎng)頁(yè)的標(biāo)準(zhǔn),IMG不支持onload標(biāo)簽怎么辦

    網(wǎng)頁(yè)的標(biāo)準(zhǔn),IMG不支持onload標(biāo)簽怎么辦...
    2006-06-06

最新評(píng)論