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

Vue如何跨組件傳遞Slot的實(shí)現(xiàn)

 更新時(shí)間:2020年12月14日 10:39:49   作者:紫菜苔同學(xué)  
這篇文章主要介紹了Vue如何跨組件傳遞Slot的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在開(kāi)發(fā)過(guò)程中遇到這樣一個(gè)問(wèn)題,如何跨組件傳遞插槽。因?yàn)樵陂_(kāi)發(fā)類(lèi)似樹(shù)組件的過(guò)程中,插槽需要通過(guò)外部傳遞到樹(shù)的根節(jié)點(diǎn),然后通過(guò)根節(jié)點(diǎn)依次傳遞到各個(gè)葉子節(jié)點(diǎn)。那么如何把根節(jié)點(diǎn)的Slot如傳遞給子組件呢?
我們?cè)陂_(kāi)發(fā)過(guò)程中,希望可以這樣實(shí)現(xiàn)重新定義葉子節(jié)點(diǎn)的結(jié)構(gòu):

<data-tree>
 <template v-slot:node="data">
   <div>{{data.title}} - {{data.text}}</div>
  </template>
</data-tree>

那么如何在組件內(nèi)傳遞Slot就是一個(gè)問(wèn)題。

嵌套傳遞

通過(guò)固定級(jí)別的組件結(jié)構(gòu)里可以通過(guò)直接書(shū)寫(xiě)<v-slot ...>來(lái)傳遞對(duì)應(yīng)的Slot元素,來(lái)實(shí)現(xiàn)一層一層的傳遞。

<data-tree>
 <data-tree-item>
   <template :node="data">
      <slot :data="data"> xxx </slot>
    </template>
  </data-tree-item>
</data-tree>

通過(guò)在外層創(chuàng)建slot可以逐層將slot進(jìn)行傳遞,但是如果過(guò)多的嵌套層次,這樣就顯得很麻煩。

Render

還有一種方案是通過(guò)Render函數(shù)來(lái)進(jìn)行顯示,可以通過(guò)$slots來(lái)訪問(wèn)當(dāng)前組件的slot元素,然后通過(guò)Render函數(shù)創(chuàng)建新組件時(shí),將slot傳遞給下一層。

h('data-tree-item',{
 scopedSlots: {
    node: props => this.$slots.node(props)
  },
})

這樣通過(guò)Render子元素就可以接受到對(duì)應(yīng)的Slot,也實(shí)現(xiàn)了傳遞。

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

還有一種方式是通過(guò)動(dòng)態(tài)組件,也是認(rèn)為比較推薦的實(shí)現(xiàn)方式,不是通過(guò)傳遞Slot,而是通過(guò)子節(jié)點(diǎn)主動(dòng)去獲取根節(jié)點(diǎn)的Slot對(duì)象,然后直接在UI中渲染出來(lái)。

為此我們需要?jiǎng)?chuàng)建一個(gè)組件來(lái)渲染對(duì)應(yīng)的Slot對(duì)象。

首先需要獲取根節(jié)點(diǎn):

const rootComponentName = 'data-tree'
/**
 * 獲取父組件
 */
const getRootComponent = (
  component: ComponentInternalInstance | null
): ComponentInternalInstance | undefined => {
  if (component && component.type.name === rootComponentName) {
    return component
  }

  if (component && component.parent) {
    const parent = component.parent
    return getRootComponent(parent)
  }
}

通過(guò)遞歸我們可以獲取到對(duì)應(yīng)的父節(jié)點(diǎn),這樣我們就可以把Slot作為Data暴露出來(lái)

setup(props) {
    // 獲取根節(jié)點(diǎn)
    const dataTree = getRootComponent(getCurrentInstance())
    const parentSlots = dataTree?.slots
    const nodeTemplate = parentSlots?.node as any
    return {
      nodeTemplate
    }
  }

這時(shí)候我們需要一個(gè)組件來(lái)渲染暴露出來(lái)的Slot:

components: {
    TemplateContainer: {
      functional: true,
      props: {
        template: {
          type: Function
        },
        data: {
          type: Object
        }
      },
      render: (props, ctx) => h('div', [props.template(props.data)])
    }
  }

好了現(xiàn)在該準(zhǔn)備的都準(zhǔn)備好了,可以去實(shí)現(xiàn)UI的顯示了:

 <template-container
          v-if="nodeTemplate"
          :template="nodeTemplate"
          :data="node">
</template-container>
<template v-else>
    {{ node.label }}
</template>

這樣我們就實(shí)現(xiàn)了類(lèi)似下面定義Slot的傳遞,也解決了我們跨組件傳遞Slot的問(wèn)題。

<slot :data="node" name="node">
 {{ node.label }}
</slot>

本文使用的是Vue 3的事例,Vue 2也是相同的概念,在Vue 3中除了使用getRootComponent來(lái)查詢(xún)跟節(jié)點(diǎn),也可以使用Provide/Inject來(lái)將Slot主動(dòng)傳遞給子節(jié)點(diǎn)。

到此這篇關(guān)于Vue如何跨組件傳遞Slot的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Vue 跨組件傳遞Slot內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue樣式綁定的幾種實(shí)現(xiàn)方式

    Vue樣式綁定的幾種實(shí)現(xiàn)方式

    這篇文章主要介紹了Vue樣式綁定的幾種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • clipboard在vue中的使用的方法示例

    clipboard在vue中的使用的方法示例

    這篇文章主要介紹了clipboard在vue中的使用的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Vue路由傳參頁(yè)面刷新后參數(shù)丟失原因和解決辦法

    Vue路由傳參頁(yè)面刷新后參數(shù)丟失原因和解決辦法

    這幾天在開(kāi)發(fā)中遇見(jiàn)的一個(gè)關(guān)于路由傳參后,頁(yè)面刷新數(shù)據(jù)丟失的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Vue路由傳參頁(yè)面刷新后參數(shù)丟失原因和解決辦法,需要的朋友可以參考下
    2022-12-12
  • 解決iView Table組件寬度只變大不變小的問(wèn)題

    解決iView Table組件寬度只變大不變小的問(wèn)題

    這篇文章主要介紹了解決iView Table組件寬度只變大不變小的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • vue-simple-uploader上傳成功之后的response獲取代碼

    vue-simple-uploader上傳成功之后的response獲取代碼

    這篇文章主要介紹了vue-simple-uploader上傳成功之后的response獲取代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧~
    2020-09-09
  • vue的狀態(tài)庫(kù)管理實(shí)現(xiàn)示例

    vue的狀態(tài)庫(kù)管理實(shí)現(xiàn)示例

    Vuex 是 Vue.js 官方推薦的狀態(tài)管理庫(kù)之一,本文主要介紹了vue的狀態(tài)庫(kù)管理實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • Vue2.0如何發(fā)布項(xiàng)目實(shí)戰(zhàn)

    Vue2.0如何發(fā)布項(xiàng)目實(shí)戰(zhàn)

    本篇文章主要介紹了Vue2.0如何發(fā)布項(xiàng)目實(shí)戰(zhàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • vue請(qǐng)求接口并且攜帶token的實(shí)現(xiàn)

    vue請(qǐng)求接口并且攜帶token的實(shí)現(xiàn)

    本文主要介紹了vue請(qǐng)求接口并且攜帶token的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • vue中如何使用lodash的debounce防抖函數(shù)

    vue中如何使用lodash的debounce防抖函數(shù)

    防抖函數(shù) debounce 指的是某個(gè)函數(shù)在某段時(shí)間內(nèi),無(wú)論觸發(fā)了多少次回調(diào),都只執(zhí)行最后一次,在Vue中使用防抖函數(shù)可以避免在頻繁觸發(fā)的事件中重復(fù)執(zhí)行操作,這篇文章主要介紹了vue中使用lodash的debounce防抖函數(shù),需要的朋友可以參考下
    2024-01-01
  • vue封裝組件之上傳圖片組件

    vue封裝組件之上傳圖片組件

    這篇文章主要為大家詳細(xì)介紹了vue封裝組件之上傳圖片組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評(píng)論

磐安县| 徐水县| 虎林市| 海林市| 资源县| 仙桃市| 黑山县| 沈阳市| 青冈县| 原平市| 泰顺县| 修武县| 深圳市| 永平县| 屯昌县| 若羌县| 长寿区| 长岭县| 吴旗县| 南昌县| 奉化市| 且末县| 资源县| 松桃| 循化| 余干县| 会昌县| 杂多县| 长泰县| 巴楚县| 乐东| 公主岭市| 民勤县| 桑日县| 永昌县| 博客| 永和县| 青阳县| 台安县| 大埔区| 高清|