Vue Prop

        本博客記錄了小編在學習Vue過程中的體會與感悟,簡單來說就是小編的學習筆記,學習地址主要爲Vue的官網,官網地址爲:《Vue官方文檔》。相關學習筆記會記錄在我的博客專欄《前端Vue》中,歡迎大家關注~


一、Prop的大小寫

       HTML 中的特性名是大小寫不敏感的,所以瀏覽器會把所有大寫字符解釋爲小寫字符。這意味着當使用 DOM 中的模板時,camelCase (駝峯命名法) 的 prop 名需要使用其等價的 kebab-case (短橫線分隔命名) 命名:

Vue.component('blog-post', {
  // 在 JavaScript 中是 camelCase 的
  props: ['postTitle'],
  template: '<h3>{{ postTitle }}</h3>'
})
<!-- 在 HTML 中是 kebab-case 的 -->
<blog-post post-title="hello!"></blog-post>

二、Prop類型

props: {
  title: String,
  likes: Number,
  isPublished: Boolean,
  commentIds: Array,
  author: Object,
  callback: Function,
  contactsPromise: Promise // or any other constructor
}

三、傳遞靜態或動態的Prop

       可以像下列代碼一樣給prop傳一個靜態的值:

<blog-post title="My journey with Vue"></blog-post>

      prop也可以通過v-bind動態賦值:

<!-- 動態賦予一個變量的值 -->
<blog-post v-bind:title="post.title"></blog-post>

<!-- 動態賦予一個複雜表達式的值 -->
<blog-post
  v-bind:title="post.title + ' by ' + post.author.name"
></blog-post>

       上述示例中,傳給prop的值都是字符串類型的,事實上,任何類型的值都可以傳給prop。

1、傳入一個數字

<!-- 即便 `42` 是靜態的,我們仍然需要 `v-bind` 來告訴 Vue -->
<!-- 這是一個 JavaScript 表達式而不是一個字符串。-->
<blog-post v-bind:likes="42"></blog-post>

<!-- 用一個變量進行動態賦值。-->
<blog-post v-bind:likes="post.likes"></blog-post>

2、傳入一個布爾值

<!-- 包含該 prop 沒有值的情況在內,都意味着 `true`。-->
<blog-post is-published></blog-post>

<!-- 即便 `false` 是靜態的,我們仍然需要 `v-bind` 來告訴 Vue -->
<!-- 這是一個 JavaScript 表達式而不是一個字符串。-->
<blog-post v-bind:is-published="false"></blog-post>

<!-- 用一個變量進行動態賦值。-->
<blog-post v-bind:is-published="post.isPublished"></blog-post>

3、傳入一個數組

<!-- 即便數組是靜態的,我們仍然需要 `v-bind` 來告訴 Vue -->
<!-- 這是一個 JavaScript 表達式而不是一個字符串。-->
<blog-post v-bind:comment-ids="[234, 266, 273]"></blog-post>

<!-- 用一個變量進行動態賦值。-->
<blog-post v-bind:comment-ids="post.commentIds"></blog-post>

4、傳入一個對象

<!-- 即便對象是靜態的,我們仍然需要 `v-bind` 來告訴 Vue -->
<!-- 這是一個 JavaScript 表達式而不是一個字符串。-->
<blog-post
  v-bind:author="{
    name: 'Veronica',
    company: 'Veridian Dynamics'
  }"
></blog-post>

<!-- 用一個變量進行動態賦值。-->
<blog-post v-bind:author="post.author"></blog-post>

5、傳入一個對象的所有屬性

       如果想要將一個對象的所有屬性都作爲 prop 傳入,可以使用不帶參數的 v-bind (取代 v-bind:prop-name)。例如,對於一個給定的對象 post:

post: {
  id: 1,
  title: 'My Journey with Vue'
}

       於是,

<blog-post v-bind="post"></blog-post>

       等價於

<blog-post
  v-bind:id="post.id"
  v-bind:title="post.title"
></blog-post>

四、單項數據流

       所有的 prop 都使得其父子 prop 之間形成了一個單向下行綁定:父級 prop 的更新會向下流動到子組件中,但是反過來則不行。這樣會防止從子組件意外改變父級組件的狀態,從而導致應用的數據流向難以理解。每次父級組件發生更新時,子組件中所有的 prop 都將會刷新爲最新的值。這意味着不應該在一個子組件內部改變 prop。如果這樣做了,Vue 會在瀏覽器的控制檯中發出警告。這裏有兩種試圖改變Prop的情形:

       1、這個 prop 用來傳遞一個初始值;這個子組件接下來希望將其作爲一個本地的 prop 數據來使用。在這種情況下,最好定義一個本地的 data 屬性並將這個 prop 用作其初始值:

props: ['initialCounter'],
data: function () {
  return {
    counter: this.initialCounter
  }
}

       2、這個 prop 以一種原始的值傳入且需要進行轉換。在這種情況下,最好使用這個 prop 的值來定義一個計算屬性:

props: ['size'],
computed: {
  normalizedSize: function () {
    return this.size.trim().toLowerCase()
  }
}

五、Prop驗證

       我們可以爲組件的 prop 指定驗證要求,例如知道的這些類型。如果有一個需求沒有被滿足,則 Vue 會在瀏覽器控制檯中發出警告。這在開發一個會被別人用到的組件時尤其有幫助。爲了定製 prop 的驗證方式,可以爲 props 中的值提供一個帶有驗證需求的對象,而不是一個字符串數組。例如:

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驗證失敗的時候,瀏覽器控制檯會發出一個警告。

1、類型檢查

       type 可以是下列原生構造函數中的一個:

String
Number
Boolean
Array
Object
Date
Function
Symbol

       額外的,type 還可以是一個自定義的構造函數,並且通過 instanceof 來進行檢查確認。例如,給定下列現成的構造函數:

function Person (firstName, lastName) {
  this.firstName = firstName
  this.lastName = lastName
}

       可以使用:

Vue.component('blog-post', {
  props: {
    author: Person
  }
})

       來驗證 author prop 的值是否是通過 new Person 創建的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章