亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue3中內(nèi)置組件Teleport的基本使用與典型案例

 更新時間:2023年04月27日 10:55:25   作者:明天也要努力  
Teleport是一種能夠將我們的模板移動到DOM中Vue app之外的其他位置的技術,下面這篇文章主要給大家介紹了關于Vue3中內(nèi)置組件Teleport的基本使用與典型案例的相關資料,需要的朋友可以參考下

1. 基本概念

1.1 簡單理解

不管是 Vue2 還是 Vue3 中都有內(nèi)置組件的存在,如 component 內(nèi)置組件、transition 內(nèi)置組件等等。內(nèi)置組件就是官方給我們封裝的全局組件,我們直接拿來用就可以了。

在 Vue3 中新增了 Teleport 內(nèi)置組件,先來看下官方文檔是怎么解釋的。

<Teleport> 是一個內(nèi)置組件,它可以將一個組件內(nèi)部的一部分模板“傳送”到該組件的 DOM 結構外層的位置去。

通俗解釋:

teleport 是一個內(nèi)置組件,我們都知道 HTML 是由層級關系的,Vue3 中的組件也是有層級關系的。

假如在父組件中引用了一個子組件,那么渲染成頁面后這個子組件 HTML 也是必然被父組件 HTML 包含的。

但是如果把子組件放置到了 teleport 組件中,那么我們就可以指定該子組件渲染到父組件之外的其它 DOM 節(jié)點下,比如 body 或者其它的 DOM 等等。這就有點類似與“傳送”了。

1.2 典型案例

我們使用 Vue 的 UI 組件庫的時候,經(jīng)常會用到模態(tài)框這個組件。如:使用 Element-plus 的模態(tài)框。

<template>
  <el-button @click="dialogVisible = true">打開彈窗</el-button>
  <el-dialog
    v-model="dialogVisible"
    append-to-body
    title="我是彈窗"
    width="30%">
  </el-dialog>
</template>

<script>
import { ref } from 'vue';
export default {
  setup(){
    const dialogVisible = ref(false);
    return {
      dialogVisible
    }
  } 
}
</script>

上段代碼中在 App.vue 組件里面引用了 Element-plus 的彈窗組件,并且添加了一個 append-to-body 屬性。

可以看到雖然彈窗組件是寫在 App.vue 組件里面的,但是渲染出來的結果卻是彈窗組件屬于 body 節(jié)點,這是因為利用了 Element-plus 中彈窗的 append-to-body 屬性,我們把該屬性去掉再看看什么結果:

可以看到彈窗組件又乖乖的跑到了 App.vue 組件下面。

為何要這樣做?

很簡單,假如有非常多的彈窗,那么如何管理它們的 z-index 呢,也就是同時彈窗時的層級關系,如果每個彈窗都在各自的父組件中,那么我們是沒法控制的,所有有必要把它們都擰出來,放在同一個父元素下面,這樣就可以方便的設置層級關系了。

這和 teleport 組件有什么關系嗎?有很大的關系,上面彈窗的 append-to-body 屬性效果是 Element 給我們做的,要是我們想自己實現(xiàn)這樣的效果,該怎么辦呢?我們就可以使用內(nèi)置組件 teleport 了。

2. 基礎使用

2.1 傳送 DOM 節(jié)點

<template>
  <div class="app">
    App組件
    <Teleport to="body">
      <div>我是被 teleport 包裹的元素</div>
    </Teleport>
  </div>
</template>

從上圖可以看出,Teleport 包裹的元素雖然是屬于 app.vue 組件,但是渲染過后它卻被渲染在了 body 這個 dom 元素下面了。
這都得歸功于 Teleport 得傳送功能,它的用法很簡單,語法代碼如下:

其中 to 就是“傳送”的目的地了,即需要把包裹的內(nèi)容傳送到何處去。

<Teleport to="body">
</Teleport>

to 允許接收值:
期望接收一個 CSS 選擇器字符串或者一個真實的 DOM 節(jié)點。
提示:
<Teleport> 掛載時,傳送的 to 目標必須已經(jīng)存在于 DOM 中。理想情況下,這應該是整個 Vue 應用 DOM 樹外部的一個元素。
如果目標元素也是由 Vue 渲染的,你需要確保在掛載 <Teleport> 之前先掛載該元素。

2.2 傳送組件

< Teleport > 只改變了渲染的 DOM 結構,它不會影響組件間的邏輯關系。

也就是說,如果 < Teleport > 包含了一個組件,那么該組件始終和這個使用了 < teleport > 的組件保持邏輯上的父子關系。傳入的 props 和觸發(fā)的事件也會照常工作。

這也意味著來自父組件的注入也會按預期工作,子組件將在 Vue Devtools 中嵌套在父級組件下面,而不是放在實際內(nèi)容移動到的地方。

// 父組件
<template>
  <div class="app">
    <Teleport to="body">
      <div>被 teleport 包裹的組件-- {{count}}</div>
      <ChildComponent v-model="count"/>
    </Teleport>
  </div>
</template>

<script>
import { ref } from 'vue';
import ChildComponent from '@/components/childComponent';
export default {
  components:{
    ChildComponent
  },
  setup(){
    const count = ref(100);
    return {
      count,
    }
  } 
}
</script>
// 子組件
<template>
  子組件:<input type="text" v-model.number="inputVal" @input="userInput">
</template>

<script>
import { ref, watch } from 'vue';
export default {
  props:{
    modelValue:{
      default:0,
    }
  },
  setup(props,{emit}) {
    const inputVal = ref(null);
    const userInput = () => {
      emit('update:modelValue', inputVal.value)
    };

    watch(props,(newVal,oldVal) => {
      inputVal.value = props.modelValue;
    },{immediate:true})
    return {
      userInput,
      inputVal,
    }
  },
}
</script>

2.3 禁用傳送功能

在某些場景下可能需要視情況禁用 < Teleport >,我們可以通過對 < Teleport > 動態(tài)地傳入一個 disabled prop 來處理這兩種不同情況( disabled 屬性接收一個 Boolean 值,true 代表不允許傳送,false 代表傳送)。

<template>
  <div class="app">
    app組件
    <Teleport to="body" :disabled="true">
      <p>我是被 teleport 包裹的元素</p>
      <p>{{ message }}</p>
    </Teleport>
  </div>
</template>

<script>
import { ref } from 'vue';
export default {
  setup(){
    const message = ref('我是在 App 組件內(nèi)部');
    return {
      message,
    }
  } 
}
</script>

2.4 多個元素傳送給一個節(jié)點

多個 < Teleport > 組件可以將其內(nèi)容掛載在同一個目標元素上,而順序就是簡單的順次追加,后掛載的將排在目標元素下更后面的位置上。

<!-- index.html -->
<body>
  <div id="app"></div>
  <div id="customDom"></div>
</body>
<template>
  app組件
  <Teleport to="#customDom">
    <p>我是被 teleport 包裹的一號元素</p>
  </Teleport>
  <Teleport to="#customDom">
    <p>我是被 teleport 包裹的二號元素</p>
  </Teleport>
</template>

總結

到此這篇關于Vue3中內(nèi)置組件Teleport的基本使用與典型案例的文章就介紹到這了,更多相關Vue3內(nèi)置組件Teleport內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue如何實現(xiàn)點擊選中取消切換

    vue如何實現(xiàn)點擊選中取消切換

    這篇文章主要介紹了vue實現(xiàn)點擊選中取消切換,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue cli升級webapck4總結

    vue cli升級webapck4總結

    這篇文章主要介紹了vue cli升級webapck4的步驟以及需要注意的地方,大家可以跟著操作學習下。
    2018-04-04
  • 基于Vue的延遲加載插件vue-view-lazy

    基于Vue的延遲加載插件vue-view-lazy

    這篇文章主要介紹了基于Vue的延遲加載插件vue-view-lazy,可以使圖片或者其他資源進入可視區(qū)域后加載,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Vue3設置Proxy代理解決跨域問題

    Vue3設置Proxy代理解決跨域問題

    這篇文章主要介紹了Vue3設置Proxy代理解決跨域問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • VSCode使React?Vue代碼調(diào)試變得更爽

    VSCode使React?Vue代碼調(diào)試變得更爽

    這篇文章主要為大家介紹了VSCode使React?Vue代碼調(diào)試變得更爽的使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Vue-Router基礎學習筆記(小結)

    Vue-Router基礎學習筆記(小結)

    這篇文章主要介紹了Vue-Router基礎學習筆記(小結),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Vue如何實現(xiàn)響應式系統(tǒng)

    Vue如何實現(xiàn)響應式系統(tǒng)

    這篇文章給大家整理了關于Vue如何實現(xiàn)響應式系統(tǒng)的相關知識點內(nèi)容,有興趣的朋友可以參考學習下。
    2018-07-07
  • 移動端底部導航固定配合vue-router實現(xiàn)組件切換功能

    移動端底部導航固定配合vue-router實現(xiàn)組件切換功能

    經(jīng)常遇到這樣的需求,移動端中的導航并不是在頂部也不是在底部,而是在最底部且是固定的,當我們點擊該導航項時會切換到對應的組件。這篇文章主要介紹了移動端底部導航固定配合vue-router實現(xiàn)組件切換功能,需要的朋友可以參考下
    2019-06-06
  • vue 面包屑導航組件封裝

    vue 面包屑導航組件封裝

    本文主要介紹了vue 面包屑導航組件封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Monaco?Editor開發(fā)SQL代碼提示編輯器實例詳解

    Monaco?Editor開發(fā)SQL代碼提示編輯器實例詳解

    這篇文章主要為大家介紹了Monaco?Editor開發(fā)SQL編輯器實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08

最新評論