具名插槽、作用域插槽的新寫法

来源:https://www.cnblogs.com/liuyilong/archive/2020/01/19/12215587.html
-Advertisement-
Play Games

插槽 1. 具名插槽 自 2.6.0 起有所更新。已廢棄的使用 attribute 的語法 但是我們有了新的語法,如下: 子組件 childCom: 父組件 app: 效果圖: 註意: 只能添加在 上 2. 作用域插槽 有時讓插槽內容能夠訪問子組件中才有的數據是很有用的。但是由於子組件的作用域在子組 ...


插槽

  1. 具名插槽

    自 2.6.0 起有所更新。已廢棄的使用 slot attribute 的語法

    但是我們有了新的語法,如下:

    子組件 childCom:

    <template id="childCom">
      <div>
        <!-- 具名插槽的針對於組件中不止一個插槽的情況下使用,使用方式,即:給每個插槽指定 name 屬性,在使用的時候需要給標簽設置 slot 屬性,且屬性值為 對應的 name 屬性的屬性值 -->
        <slot name='left'><span>左邊</span></slot> <!--給每個插槽命名,插槽中間是預設內容-->
        <slot name='center'><span>中間</span></slot>
        <slot name='right'><span>右邊</span></slot>
      </div>
    </template>

    父組件 app:

    <div id="app">
      <cpn></cpn>
      <!-- 2.6.0更新後的插槽使用方式發生了變化 -->
      <!-- 區別在於調動的時候是使用 v-slot:具體名稱,而不是定義一個 slot='具體名稱' 這樣的屬性 -->
      <cpn>
       <!-- 註意:2.6.0 之後的這個寫法中,v-slot:具體名稱 只能寫在 template 標簽中,而廢棄的寫法可以寫在某個具體的標簽上面 -->
       <template v-slot:center>  <!-- 指明使用的是哪個插槽 -->
          用戶名:<input type="text">
       </template>
      </cpn>
    </div>

    效果圖:

    註意: v-slot 只能添加在 template

  2. 作用域插槽

    有時讓插槽內容能夠訪問子組件中才有的數據是很有用的。但是由於子組件的作用域在子組件,而父組件的作用域在父組件,這樣一來,父組件就訪問不到子組件的信息了,但是我們又不想用$emit發送事件去傳遞信息,這個時候可以用作用域插槽來實現。註意:你不要以為這又是父傳子的一種方式,因為這種方法僅限於在使用插槽的時候才有用,話不多說,看代碼:

    vm實例:

    <script>
      var vm = new Vue({
        el: '#app',
        data: {},
        methods: {},
        components: {
          cpn: {
            template: '#cpn',
            data() {
              return {
                list: ['coderlyl', 'tom' , 'mack']
              }
            },
          }
        }
      });
    </script>

    子組件 childCom:

    <template id="cpn">
      <div>
        <slot :coderlyl='list'>  
        <!--list是子組件data中的數據,coderlyl是自己命名的變數,前面還有v-bind綁定-->
          <ul>
            <li v-for="(item, index) in list" :key="index">{{item}}</li>
          </ul>
        </slot>
      </div>
    </template>

    父組件 app:

    <div id="app">
      <cpn></cpn>
    
      <cpn>
        <template v-slot='lyl'>  <!--這裡的lyl也是自己命名的-->
          <span>{{lyl.coderlyl.join('--')}}</span>
        </template>
      </cpn>
    </div>

    效果圖:

處理邊界情況

  1. $root 用來訪問根組件

  2. $parent 用來從一個子組件訪問父組件的實例

  3. ref$refs 的用法

    在組件上面使用 ref 這個屬性綁定,屬性值自取,然後就可以通過 $refs.屬性名 這種方式去獲取到指定組件的實例了。

    其實不僅僅是組件能夠使用 ref ,標簽元素也能使用。

  4. 依賴註入

    現在我們有一個需求,如果我們存在多個組件嵌套的,然後現在其中某一個組件想訪問其曾祖父組件的方法,那麼使用上面兩種方式都是不可取的,這個時候官方提供了 provideinject 這兩個屬性來解決這個問題。

    • provide 允許我們指定想要提供給後代組件的數據/方法,且該屬性是一個方法,返回一個對象,鍵名就是我們要傳到後代組件的標誌
    • 然後在任何後代組件里,我們都可以使用 inject 選項來接收指定的我們想要添加在這個實例上的屬性。該屬性是一個數組類型,跟 props 的數組語法類似

    說到這裡,有的人可能會覺得這不就是跟 props 差不多嘛。沒錯,它確實差不多,但是還是有區別的,比如,祖先元素不需要知道哪些後代組件使用它提供的屬性;其次,後代組件也不需要知道被註入的屬性來自哪裡

    代碼如下:

    父組件:

    <div id="app">
      <child-com></child-com>
    </div>
    
    <template id="childCom">
      <div>
        <span>我是子組件</span>
        <grand-com></grand-com>
      </div>
    </template>
    
    <template id="grandCom">
      <div>
        <span>我是孫子組件</span>
        <button @click='btnClick'>孫子組件按鈕</button>
        <h2>{{mess}}</h2>
      </div>
    </template>
    
    <script>
      const vm = new Vue({
        el: '#app',      //  父組件
        methods: {
          sendMessage() {
            return '我發送了信息'
          }
        },
        provide() {  //  註意這裡的 provide屬性
          return {
            sendMess: this.sendMessage()  //  提供給後代了一個方法
          }
        },
        components: {
          childCom: {
            template: '#childCom',   //  子組件
            components: {
              grandCom: {
                template: '#grandCom',   //  孫子組件
                inject: ['sendMess'],    //  註意這裡的 inject屬性
                data() {
                  return {
                    mess: ''
                  }
                },
                methods: {
                  btnClick() {
                    this.mess = this.sendMess //  孫子組件用了這個方法
                  }
                },
              }
            }
          }
        }
      })
    </script>

    效果圖:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們知道linux中一個思想:一切皆文件,那麼在我們安裝完postgresql資料庫後,她長什麼樣呢?本文帶著你一起揭開她的面紗,看看postgresql的文件佈局。 說明:由於安裝測試的版本是10.5這裡可以參考官方文檔:https://www.postgresql.org/docs/10/sto ...
  • 參考:https://www.postgresql.org/docs/current/install-procedure.html 完事開頭難!!!如果想瞭解一門技術,看文檔必不可少,實操更不可少,這篇博文記錄了自己學習postgesql的測試安裝文檔,由於對pg的參數瞭解甚少,目前使用的預設的參數 ...
  • postgresql 作為官方號稱的最先進的開源資料庫,從今天(2020-1-19)起開始系統的學習一下,記錄自己學習的點點滴滴。 ...
  • 一幅畫,一次瞬間的回眸,就在那次畫展上,那個眼神,溫柔的流轉,還是那乾凈的皮鞋,一塵不染,俊朗的眉宇性感的唇,悄悄走近,牽手一段浪漫 [toc] MySQL筆記(二) 13、條件查詢 1.普通條件查詢 語法:SELECT COL_LIST FROM TABLE_NAME [WHERE CONDITI ...
  • 每天給自己一個希望,努力做好自己,不為明天煩惱,不為昨天嘆息。當夢想還在,告訴自己:努力,就總能遇見更好的自己! [toc] MySql筆記(一) 1、創建資料庫以及刪除 1.創建資料庫語法:(命令行視窗操作) ~~~~sql CREATE DATABASE DATABASENAME ~~~~ 示例 ...
  • 關於非同步消息,大家都知道,如下: 這些用起來都是比較複雜的,RabbitMQ先要創建Exchange,在創建Queue,還要將Queue和Exchange通過某種規則綁定起來。發消息之前要指定routing-Key,還要控制頭部信息。 即使你只需要一組消息者。那麼你就要經歷上面繁瑣的過程。 但是Re ...
  • 準備工作 因為在編譯時需要下載許多依賴包,在執行編譯前最好先配置下代理倉庫 編譯flink shaded 因為flink依賴flink shaded工程,基本的依賴項都是在這個工程裡面定義的,所以要先編譯這個工程 1. 下載flink shaded工程 "flink shaded" 1. 在寫文章時 ...
  • 在Vue進行前端開發中,表單的輸入是基礎且常見的功能,本文以一個簡單的小例子,簡述v-model數據綁定的用法,僅供學習分享使用,如有不足,還請指正。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...