Prop驗證、inheritAttrs、$attrs的用法和坑

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

Prop 1. Prop驗證 javascript Vue.component('my component', { props: { // 基礎的類型檢查 ( 和 會通過任何類型驗證) propA: Number, // 多個可能的類型 propB: [String, Number], // 必填的 ...


Prop

  1. Prop驗證

    Vue.component('my-component', {
      props: {
        // 基礎的類型檢查 (`null` 和 `undefined` 會通過任何類型驗證)
        propA: Number,
        // 多個可能的類型
        propB: [String, Number],
        // 必填的字元串
        propC: {
          type: String,
          required: true
        },
        // 帶有預設值的數字
        propD: {
          type: Number,
          default: 100
        },
        // 帶有預設值的對象
        propE: {
          type: Object,
          // 對象或數組預設值必須從一個工廠函數獲取
          default: function () {
            return { message: 'hello' }
          }
        },
        // 自定義驗證函數
        propF: {
          validator: function (value) {
            // 這個值必須匹配下列字元串中的一個
            return ['success', 'warning', 'danger'].indexOf(value) !== -1
          }
        }
      }
    })
    • prop 會在一個組件實例創建之前進行驗證
  2. 非 Prop 的 Attribute

    • 如果一個父組件向其子組件傳遞一個屬性,但是子組件沒有使用props接收它,那麼這個屬性就會被添加到子組件的根元素上去,即:在子組件使用 this.$attrs 就能獲取到傳入的屬性對應的值

    • <div id="app">
          <child-com :name='name' :age='age' :sex='sex'></child-com>
        </div>
      
        <script>
          const vm = new Vue({
            el: '#app', //  父組件
            data: {
              name: 'lyl',
              age: 20,
              sex: '男'
            },
            components: {
              childCom: { //  子組件
                template: `
                  <div>
                    <span> {{name}} </span>
                    <grand-com v-bind='$attrs'></grand-com>  <!-- 註意看這裡,你會發現這裡的 v-bind後面直接跟上的不是一個屬性而是等號 -->
                    <!-- 這樣一來我們就把 子組件中沒有用到的屬性(除class和style以外)全部傳到了孫子組件 -->
                  </div>
                `,
                props: ['name'],  //  這裡沒有將 age 和 sex 在 props 中接收
                created() {
                  console.log(this.$attrs)  //  控制台列印:{age:20,sex:男}
                },
                components: {
                  grandCom: { //  孫子組件
                    template: `
                      <div>
                        <span>{{$attrs.age}}</span>
                        <span>{{$attrs.sex}}</span>
                      </div>
                    `,
                  }
                }
              }
            }
          })
      </script>
    • inheritAttrs 屬性的用法

    • <div id="app">
          <child-com :name='name' :age='age' :sex='sex'></child-com>
        </div>
      
        <script>
          const vm = new Vue({
            el: '#app', //  父組件
            data: {
              name: 'lyl',
              age: 20,
              sex: '男'
            },
            components: {
              childCom: { //  子組件
                template: `
                  <div>
                    <span> {{name}} </span>
                  </div>
                `,
                props: ['name'],  //  這裡沒有將 age 和 sex 在 props 中接收
                created() {
                  console.log(this.$attrs)  //  控制台列印:{age:20,sex:男}
                }
              }
            }
          })
        </script>
    • 你就會發現,這裡的div標簽上面被綁定了age、sex這樣的屬性,這就是官方文檔說的非Prop的屬性會被添加被綁定組件的根元素上 ,就如上圖所示,但是往往你是不想這樣做的,那麼就可以使用 inheritAttrs 屬性了

      用法:在子組件的模板對象中添加 inheritAttrs: false 即可讓這種情況禁止掉

      <div id="app">
          <child-com :name='name' :age='age' :sex='sex'></child-com>
        </div>
      
        <script>
          const vm = new Vue({
            el: '#app', //  父組件
            data: {
              name: 'lyl',
              age: 20,
              sex: '男'
            },
            components: {
              childCom: { //  子組件
                inheritAttrs: false,  //  父組件傳入的name、age、sex屬性中除子組件props接收的屬性name外,其他屬性預設會被瀏覽器渲染成html屬性,但是設置該屬性之後則不會被瀏覽器這樣渲染
                template: `
                  <div>
                    <span> {{name}} </span>
                  </div>
                `,
                props: ['name'],  //  這裡沒有將 age 和 sex 在 props 中接收
                created() {
                  console.log(this.$attrs)  //  控制台列印:{age:20,sex:男}
                }
              }
            }
          })
        </script>


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

-Advertisement-
Play Games
更多相關文章
  • 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數據綁定的用法,僅供學習分享使用,如有不足,還請指正。 ...
  • 插槽 1. 具名插槽 自 2.6.0 起有所更新。已廢棄的使用 attribute 的語法 但是我們有了新的語法,如下: 子組件 childCom: 父組件 app: 效果圖: 註意: 只能添加在 上 2. 作用域插槽 有時讓插槽內容能夠訪問子組件中才有的數據是很有用的。但是由於子組件的作用域在子組 ...
  • 自定義組件 1. 自定義組件的v model 首先我們先說一下在自定義組件中使用v model的必要條件 在自定義的組件中要有input(這裡我們先不討論單選覆選框) 在自定義組件的模板對象中要有props屬性,且裡面要含有一個value 在自定義組件的input標簽上要綁定value屬性值為pro ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...