国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Vue組件選項props實例詳解

2019-11-19 15:44:31
字體:
供稿:網(wǎng)友

前面的話

  組件接受的選項大部分與Vue實例一樣,而選項props是組件中非常重要的一個選項。在 Vue 中,父子組件的關(guān)系可以總結(jié)為 props down, events up。父組件通過 props 向下傳遞數(shù)據(jù)給子組件,子組件通過 events 給父組件發(fā)送消息。本文將詳細(xì)介紹Vue組件選項props

靜態(tài)props

  組件實例的作用域是孤立的。這意味著不能 (也不應(yīng)該) 在子組件的模板內(nèi)直接引用父組件的數(shù)據(jù)。要讓子組件使用父組件的數(shù)據(jù),需要通過子組件的 props 選項

  使用Prop傳遞數(shù)據(jù)包括靜態(tài)和動態(tài)兩種形式,下面先介紹靜態(tài)props

  子組件要顯式地用 props 選項聲明它期待獲得的數(shù)據(jù)

var childNode = { template: '<div>{{message}}</div>', props:['message']}

  靜態(tài)Prop通過為子組件在父組件中的占位符添加特性的方式來達(dá)到傳值的目的

<div id="example"> <parent></parent></div><script>var childNode = { template: '<div>{{message}}</div>', props:['message']}var parentNode = { template: ` <div class="parent"> <child message="aaa"></child> <child message="bbb"></child> </div>`, components: { 'child': childNode }};// 創(chuàng)建根實例new Vue({ el: '#example', components: { 'parent': parentNode }})</script>

命名約定

  對于props聲明的屬性來說,在父級HTML模板中,屬性名需要使用中劃線寫法

var parentNode = { template: ` <div class="parent"> <child my-message="aaa"></child> <child my-message="bbb"></child> </div>`, components: { 'child': childNode }};

  子級props屬性聲明時,使用小駝峰或者中劃線寫法都可以;而子級模板使用從父級傳來的變量時,需要使用對應(yīng)的小駝峰寫法

var childNode = { template: '<div>{{myMessage}}</div>', props:['myMessage']}var childNode = { template: '<div>{{myMessage}}</div>', props:['my-message']}

動態(tài)props

  在模板中,要動態(tài)地綁定父組件的數(shù)據(jù)到子模板的 props,與綁定到任何普通的HTML特性相類似,就是用 v-bind。每當(dāng)父組件的數(shù)據(jù)變化時,該變化也會傳導(dǎo)給子組件

var childNode = { template: '<div>{{myMessage}}</div>', props:['myMessage']}var parentNode = { template: ` <div class="parent"> <child :my-message="data1"></child> <child :my-message="data2"></child> </div>`, components: { 'child': childNode }, data(){ return { 'data1':'aaa', 'data2':'bbb' } }};

傳遞數(shù)字

  初學(xué)者常犯的一個錯誤是使用字面量語法傳遞數(shù)值

<!-- 傳遞了一個字符串 "1" --><comp some-prop="1"></comp><div id="example"> <my-parent></my-parent></div><script>var childNode = { template: '<div>{{myMessage}}的類型是{{type}}</div>', props:['myMessage'], computed:{ type(){ return typeof this.myMessage } }}var parentNode = { template: ` <div class="parent"> <my-child my-message="1"></my-child> </div>`, components: { 'myChild': childNode }};// 創(chuàng)建根實例new Vue({ el: '#example', components: { 'MyParent': parentNode }})</script>

  因為它是一個字面 prop,它的值是字符串 "1" 而不是 number。如果想傳遞一個實際的 number,需要使用 v-bind,從而讓它的值被當(dāng)作JS表達(dá)式計算

<!-- 傳遞實際的 number --><comp v-bind:some-prop="1"></comp>var parentNode = { template: ` <div class="parent"> <my-child :my-message="1"></my-child> </div>`, components: { 'myChild': childNode }};

  或者可以使用動態(tài)props,在data屬性中設(shè)置對應(yīng)的數(shù)字1

var parentNode = { template: ` <div class="parent"> <my-child :my-message="data"></my-child> </div>`, components: { 'myChild': childNode }, data(){ return { 'data': 1 } }};

props驗證

  可以為組件的 props 指定驗證規(guī)格。如果傳入的數(shù)據(jù)不符合規(guī)格,Vue會發(fā)出警告。當(dāng)組件給其他人使用時,這很有用

  要指定驗證規(guī)格,需要用對象的形式,而不能用字符串?dāng)?shù)組

Vue.component('example', { props: { // 基礎(chǔ)類型檢測 (`null` 意思是任何類型都可以) propA: Number, // 多種類型 propB: [String, Number], // 必傳且是字符串 propC: { type: String, required: true }, // 數(shù)字,有默認(rèn)值 propD: { type: Number, default: 100 }, // 數(shù)組/對象的默認(rèn)值應(yīng)當(dāng)由一個工廠函數(shù)返回 propE: { type: Object, default: function () { return { message: 'hello' } } }, // 自定義驗證函數(shù) propF: { validator: function (value) { return value > 10 } } }})

  type 可以是下面原生構(gòu)造器

StringNumberBooleanFunctionObjectArraySymbol

  type 也可以是一個自定義構(gòu)造器函數(shù),使用 instanceof 檢測。

  當(dāng) prop 驗證失敗,Vue 會在拋出警告 (如果使用的是開發(fā)版本)。props會在組件實例創(chuàng)建之前進(jìn)行校驗,所以在 default 或 validator 函數(shù)里,諸如 data、computed 或 methods 等實例屬性還無法使用

  下面是一個簡單例子,如果傳入子組件的message不是數(shù)字,則拋出警告

<div id="example"> <parent></parent></div><script>var childNode = { template: '<div>{{message}}</div>', props:{ 'message':Number }}var parentNode = { template: ` <div class="parent"> <child :message="msg"></child> </div>`, components: { 'child': childNode }, data(){ return{ msg: '123' } }};// 創(chuàng)建根實例new Vue({ el: '#example', components: { 'parent': parentNode }})</script>

  傳入數(shù)字123時,則無警告提示。傳入字符串'123'時,結(jié)果如下所示

  將上面代碼中,子組件的內(nèi)容修改如下,可自定義驗證函數(shù),當(dāng)函數(shù)返回為false時,則輸出警告提示

var childNode = { template: '<div>{{message}}</div>', props:{ 'message':{ validator: function (value) { return value > 10 } } }}

  在父組件中傳入msg值為1,由于小于10,則輸出警告提示

var parentNode = { template: ` <div class="parent"> <child :message="msg"></child> </div>`, components: { 'child': childNode }, data(){ return{ msg:1 } }};

單向數(shù)據(jù)流

  prop 是單向綁定的:當(dāng)父組件的屬性變化時,將傳導(dǎo)給子組件,但是不會反過來。這是為了防止子組件無意修改了父組件的狀態(tài)――這會讓應(yīng)用的數(shù)據(jù)流難以理解

  另外,每次父組件更新時,子組件的所有 prop 都會更新為最新值。這意味著不應(yīng)該在子組件內(nèi)部改變 prop。如果這么做了,Vue 會在控制臺給出警告

  下面是一個典型例子

<div id="example"> <parent></parent></div><script>var childNode = { template: ` <div class="child"> <div> <span>子組件數(shù)據(jù)</span> <input v-model="childMsg"> </div> <p>{{childMsg}}</p> </div> `, props:['childMsg']}var parentNode = { template: ` <div class="parent"> <div> <span>父組件數(shù)據(jù)</span> <input v-model="msg"> </div> <p>{{msg}}</p> <child :child-msg="msg"></child> </div> `, components: { 'child': childNode }, data(){ return { 'msg':'match' } }};// 創(chuàng)建根實例new Vue({ el: '#example', components: { 'parent': parentNode }})</script>

  父組件數(shù)據(jù)變化時,子組件數(shù)據(jù)會相應(yīng)變化;而子組件數(shù)據(jù)變化時,父組件數(shù)據(jù)不變,并在控制臺顯示警告

  修改prop中的數(shù)據(jù),通常有以下兩種原因

  1、prop 作為初始值傳入后,子組件想把它當(dāng)作局部數(shù)據(jù)來用

  2、prop 作為初始值傳入,由子組件處理成其它數(shù)據(jù)輸出

  對于這兩種情況,正確的應(yīng)對方式是

  1、定義一個局部變量,并用 prop 的值初始化它

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

  2、定義一個計算屬性,處理 prop 的值并返回

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

  [注意]JS中對象和數(shù)組是引用類型,指向同一個內(nèi)存空間,如果 prop 是一個對象或數(shù)組,在子組件內(nèi)部改變它會影響父組件的狀態(tài)

總結(jié)

以上所述是小編給大家介紹的Vue組件選項props實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對武林網(wǎng)網(wǎng)站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 五常市| 舒城县| 东兴市| 新疆| 雅江县| 咸阳市| 当雄县| 桓仁| 客服| 义乌市| 四子王旗| 沽源县| 湖南省| 黔东| 咸丰县| 西城区| 酉阳| 灌南县| 南平市| 通河县| 清水河县| 博客| 新宁县| 新郑市| 集贤县| 高尔夫| 芜湖市| 女性| 靖安县| 广饶县| 志丹县| 崇信县| 宜丰县| 广宁县| 左云县| 扶沟县| 伊宁市| 彭山县| 凤冈县| 黄山市| 安国市|