91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue中如何使用Teleport組件

發布時間:2023-04-13 10:10:46 來源:億速云 閱讀:85 作者:iii 欄目:編程語言

這篇文章主要介紹“Vue中如何使用Teleport組件”,在日常操作中,相信很多人在Vue中如何使用Teleport組件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Vue中如何使用Teleport組件”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

01-組件套組件層次結構很深時

比如:現在有兩個組件,父組件,子組件,在后代組件內,添加一個按鈕,彈出一個模態框,讓它在頁面垂直水平居中顯示

如下所示,父組件如下所示App.vue

<template>
    <div class="App">
        我是父組件
        <Child />
    </div>
</template>
<script setup>
    import Child from "./Child.vue"
</script>
<style>
.App {
    width: 400px;
    height: 400px;
    background:red;
}
</style>

如下是Child組件,示例代碼如下所示Child.vue,我們需要在孫(后代)組件,添加一個按鈕,點擊按鈕,彈出一個彈框,水平垂直居中顯示在頁面中央

<template>
    <div class="child">
      <p>我是子組件</p>
        <button @click="isModel=true">打開模態框</button>
        <div class="mask-dialog" v-if="isModel">
             <div class="box">
                  <h3>我是標題</h3>
                  <div>我是彈框內容</div>
                  <div>
                      <button @click="isModel=false">關閉</button>
                  </div>
             </div>
        </div>
    </div>
</template>
<script setup>
import { ref } from "vue";
let isModel = ref(false);
</script>
<style>
.child {
    width: 300px;
    height:300px;
    background:green;
}
/**灰色遮罩層 */
  .mask-dialog {
    width: 100%;
    height:100%;
    position:absolute;
    left:0;
    top:0;
    background:rgba(0,0,0,0.5)
  }
  
  .box {
    width: 200px;
    height:200px;
    position:absolute;
    left:50%;
    top:50%;
    transform:translate(-50%,-50%);
    background:pink;
    text-align:center;
  }
</style>

上面的子組件中有一個button按鈕來觸發打開當前組件的模態框,里面存在著控制彈框的顯示和隱藏的邏輯,當嵌套的組件比較深,復雜時

如果父級元素存在定位,那在控制子元素的位置時,用csstransform或者position:absolute,參照對象的變更,會破壞布局結構,會出現一些css樣式

控制的問題,解決起來會非常的痛苦

那這個Teleport組件就是為了解決這類問題,可以將指定的DOM結構片段,獨立于到組件外面去,不受當前組件布局結構的影響

經過Teleport的修改后

<template>
    <div class="child">
      <p>我是子組件</p>
        <button @click="isModel=true">打開模態框</button>
        <Teleport to="body">
            <div class="mask-dialog" v-if="isModel">
                 <div class="box">
                      <h3>我是標題1</h3>
                      <div>我是彈框內容</div>
                      <div>
                          <button @click="isModel=false">關閉</button>
                      </div>
                 </div>
            </div>
        </Teleport>  
    </div>
</template>
<script setup>
import { ref } from "vue";
let isModel = ref(false);
</script>
<style>
.child {
    width: 300px;
    height:300px;
    background:green;
}
/**灰色遮罩層 */
  .mask-dialog {
    width: 100%;
    height:100%;
    position:absolute;
    left:0;
    top:0;
    background:rgba(0,0,0,0.5)
  }
  
  .box {
    width: 200px;
    height:200px;
    position:absolute;
    left:50%;
    top:50%;
    transform:translate(-50%,-50%);
    background:pink;
    text-align:center;
  }
</style>

<Teleport>接收一個 to prop 來指定傳送的目標。to 的值可以是一個 CSS 選擇器字符串,或id,也可以是一個 DOM 元素對象。這段代碼的作用就是告訴 Vue把以下模板片段傳送到 body 標簽下

<Teleport to="#some-id">html結構代碼</Teleport>
<Teleport to=".some-class">html結構代碼</Teleport>
<Teleport to="body">html結構代碼</Teleport>
<Teleport to="html">html結構代碼</Teleport>

02-Teleport組件

它是Vue官方提供的一個內置組件,它可以將一個組件內部的一部分模板“傳送”到該組件的 DOM 結構外層的位置去 也就是一種能夠將我們的組件html結構移動到指定位置的技術

<teleport to="移動到指定的位置,可以是html,body,或id,class">
   里面是Html結構模板內容
</teleport>

注意

<Teleport> 掛載時,傳送的 to 目標必須已經存在于DOM中。理想情況下,這應該是整個 Vue 應用 DOM 樹外部的一個元素。如果目標元素也是由 Vue 渲染的,你需要確保在掛載 <Teleport> 之前先掛載該元素

這個teleport將指定的模板html,放置到頁面當中指定的位置處,它是有條件的,不是可以任意傳送的

在安裝組件之前,目標元素必須存在,即,目標不能由組件本身呈現,理想情況下應該位于整個Vue組件樹之外。

如下代碼是不行的

<template>
    <div>
        <Teleport to=".content">
            <div>我是頭部的內容</div>
        </Teleport>
         
    </div>
    <div>
        底部內容
        <div></div>
    </div>
</template>
<script setup>
</script>
<style>
h2 {
    color: red;
}
</style>

03-需要知道的

teleport只是改變了渲染的 DOM 結構,它不會影響組件間的邏輯關系。也就是說,如果 <Teleport> 包含了一個組件,那么該組件始終和這個使用了 <teleport> 的組件保持邏輯上的父子關系。傳入的 props 和觸發的事件也會照常工作。

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

位置移動了,提現在結構模板上,但是數據邏輯依舊存在關聯的

04-如何禁用 Teleport

在某些場景下可能需要視情況禁用 <Teleport>。舉例來說,我們想要在桌面端將一個組件當做浮層來渲染,但在移動端則當作行內組件。我們可以通過對 <Teleport> 動態地傳入一個 disabled prop 來處理這兩種不同情況

<Teleport :disabled="isMobile">
  ...
</Teleport>

這里的 isMobile 狀態可以根據 CSS media query 的不同結果動態地更新

05-多個 Teleport 共享目標時

一個可重用的模態框組件可能同時存在多個實例。對于此類場景,多個 <Teleport> 組件可以將其內容掛載在同一個目標元素上,而順序就是簡單的順次追加,后掛載的將排在目標元素下更后面的位置上

比如下面這樣的用例

<Teleport to=".content">
  <div>A</div>
</Teleport>
<Teleport to=".content">
  <div>B</div>
</Teleport>

渲染的結果為

<div class="content">
  <div>A</div>
  <div>B</div>
</div>

到此,關于“Vue中如何使用Teleport組件”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陵水| 玉树县| 芜湖县| 水城县| 云龙县| 若尔盖县| 禄丰县| 临武县| 侯马市| 筠连县| 西乌| 通辽市| 施秉县| 张北县| 潍坊市| 社旗县| 滨州市| 当阳市| 新郑市| 四子王旗| 图们市| 屏南县| 崇仁县| 台前县| 兰西县| 花莲市| 拉萨市| 怀远县| 三都| 景洪市| 梧州市| 厦门市| 庆阳市| 洞头县| 防城港市| 姜堰市| 出国| 桐庐县| 绥德县| 盘山县| 衡阳县|