Vue組件prop屬性


Vue組件prop屬性

Prop

  • prop 大小寫
Vue.component('blog-post', {
  // 在 JavaScript 中是 camelCase 的
  props: ['postTitle'],
  template: '<h3>{{ postTitle }}</h3>' }) <!-- 在 HTML 中是 kebab-case 的 --> <blog-post post-title="hello!"></blog-post> 
  • 單項數據流

所有的 prop 都使得其父子 prop 之間形成了一個單向下行綁定:父級 prop 的更新會向下流動到子組件中,但是反過來則不行。
每次父級組件發生更新時,子組件中所有的 prop 都將會刷新為最新的值。這意味着你不應該在一個子組件內部改變 prop。

<!-- 測試單向數據流 --> <h1>{{msg}}</h1> <test-single-data-flow :msg="msg"></test-single-data-flow> Vue.component('test-single-data-flow', { props: ['msg'], data() { return { } }, // 每個組件必須只有一個根元素 template: `<span><input type="text" v-model="msg"/></span>` }) var app = new Vue({ el: "#app", data: { msg: 'Single_Data_Flow' } }) 
 
單項數據流不允許修改.png

在組件中修改 prop 傳遞過來的數據 Vue 會發出警告,所以有兩種常見的用法去修改 prop 傳遞過來的值

  • 本地定義屬性,並將 prop 作為初始值
data() { return { msg_data: this.msg } } 
  • prop 傳入之后需要進行轉換,這種情況使用 computed 來定義
computed:{ msg_computed(){ return this.msg + " Computed" } } 
  • prop 驗證
<test-prop-validate :prop-a="1" :prop-b="2" :prop-c="'3'" :prop-f="'success'"></test-prop-validate> Vue.component('test-prop-validate', { props: { // 基礎的類型檢查 (`null` 匹配任何類型) 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 } } }, data() { return { } }, template: ` <div> {{propD}}{{propE}} </div> ` }) 
  • type 可以是下列原生構造函數中的一個:

    • String
    • Number
    • Boolean
    • Array
    • Object
    • Date
    • Function
    • Symbol
  • 非 prop 特性

非 prop 特性,組件可以接受任意的特性,而這些特性會被添加到這個組件的根元素上

<style> .colorRed { color: red; } .defineSize { font-size: 20px; } </style> <!-- 非prop屬性 --> <test-not-prop class="colorRed" my-self-define></test-not-prop> Vue.component('test-not-prop', { data() { return { } }, template: `<div style="font-weight:bold;" class="defineSize">Test Not Prop</div>` }) <!-- 渲染為 --> <div class="defineSize colorRed" my-self-define="" style="font-weight: bold;">Test Not Prop</div> 
非Prop屬性渲染.png

對於絕大多數特性來說,從外部提供給組件的值會替換掉組件內部設置好的值。所以如果傳入 type="text" 就會替換掉 type="date" 並把它破壞!慶幸的是,class 和 style 特性會稍微智能一些,即兩邊的值會被合並起來,從而得到最終的值:defineSize colorRed。

總結

  • prop 數據單項傳遞,父影響子,子不影響父
  • 不能在組件中直接修改 prop 傳遞過來的值,Vue 會給出警告
  • prop 驗證時,會在實例創建之前進行驗證,所以實例的屬性 (如 data、computed 等) 在 default 或 validator 函數中是不可用的
  • 非 prop 特性,組件可以接受任意的特性,而這些特性會被添加到這個組件的根元素上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM