亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue組件選項props實例詳解

2019-11-19 15:44:31
字體:
來源:轉載
供稿:網友

前面的話

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

靜態props

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

  使用Prop傳遞數據包括靜態和動態兩種形式,下面先介紹靜態props

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

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

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

<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 }};// 創建根實例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屬性聲明時,使用小駝峰或者中劃線寫法都可以;而子級模板使用從父級傳來的變量時,需要使用對應的小駝峰寫法

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

動態props

  在模板中,要動態地綁定父組件的數據到子模板的 props,與綁定到任何普通的HTML特性相類似,就是用 v-bind。每當父組件的數據變化時,該變化也會傳導給子組件

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' } }};

傳遞數字

  初學者常犯的一個錯誤是使用字面量語法傳遞數值

<!-- 傳遞了一個字符串 "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 }};// 創建根實例new Vue({ el: '#example', components: { 'MyParent': parentNode }})</script>

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

<!-- 傳遞實際的 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 }};

  或者可以使用動態props,在data屬性中設置對應的數字1

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

props驗證

  可以為組件的 props 指定驗證規格。如果傳入的數據不符合規格,Vue會發出警告。當組件給其他人使用時,這很有用

  要指定驗證規格,需要用對象的形式,而不能用字符串數組

Vue.component('example', { 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 value > 10 } } }})

  type 可以是下面原生構造器

StringNumberBooleanFunctionObjectArraySymbol

  type 也可以是一個自定義構造器函數,使用 instanceof 檢測。

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

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

<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' } }};// 創建根實例new Vue({ el: '#example', components: { 'parent': parentNode }})</script>

  傳入數字123時,則無警告提示。傳入字符串'123'時,結果如下所示

  將上面代碼中,子組件的內容修改如下,可自定義驗證函數,當函數返回為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 } }};

單向數據流

  prop 是單向綁定的:當父組件的屬性變化時,將傳導給子組件,但是不會反過來。這是為了防止子組件無意修改了父組件的狀態――這會讓應用的數據流難以理解

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

  下面是一個典型例子

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

  父組件數據變化時,子組件數據會相應變化;而子組件數據變化時,父組件數據不變,并在控制臺顯示警告

  修改prop中的數據,通常有以下兩種原因

  1、prop 作為初始值傳入后,子組件想把它當作局部數據來用

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

  對于這兩種情況,正確的應對方式是

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

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

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

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

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91香蕉亚洲精品| 国产一区二区三区三区在线观看| 国产午夜精品视频| 欧美一区二区三区免费观看| 青青在线视频一区二区三区| 欧美成人精品一区二区三区| 亚洲电影成人av99爱色| 欧美激情a在线| 欧美一级高清免费播放| 欧美成人精品激情在线观看| 国产精品视频xxxx| 日韩视频免费在线观看| 8x拔播拔播x8国产精品| 国产成+人+综合+亚洲欧美丁香花| 亚洲免费人成在线视频观看| 亚洲国产成人精品久久久国产成人一区| 国产精品色婷婷视频| 色无极影院亚洲| 欧美精品久久久久久久| 精品欧美国产一区二区三区| 91色视频在线导航| 久久成人这里只有精品| 亚洲综合社区网| 久久中文字幕在线视频| 国产精品高潮在线| 亚洲精品国产综合区久久久久久久| 9.1国产丝袜在线观看| 亚洲最新av在线| 日本一本a高清免费不卡| 在线观看日韩www视频免费| www.99久久热国产日韩欧美.com| 欧美日韩一区免费| 国产精品欧美激情在线播放| 国产精品露脸av在线| 日本韩国欧美精品大片卡二| 亚洲伊人第一页| 欧美亚洲免费电影| 91亚洲精品在线| 亚洲美女在线观看| 97色在线视频| 久久精品国产亚洲精品| 国产精品高清在线| 一区国产精品视频| 欧美精品久久久久久久久| 欧美日本黄视频| 成人免费福利视频| 欧美性生活大片免费观看网址| 国产成人jvid在线播放| 69**夜色精品国产69乱| 午夜精品国产精品大乳美女| 色综合久久久888| 国产精品亚洲美女av网站| 亚洲国产欧美一区二区三区久久| 亚洲国产欧美日韩精品| 亚洲国产高清自拍| 亚洲激情在线观看视频免费| 亚洲性线免费观看视频成熟| 91精品国产成人www| 91久久精品视频| 欧美乱大交xxxxx| 精品国产一区久久久| 精品偷拍一区二区三区在线看| 亚洲性69xxxbbb| 欧美在线观看视频| 亚洲第一页自拍| 在线观看国产精品91| 欧美性黄网官网| 亚洲欧美在线一区二区| 91精品免费看| 日韩在线视频中文字幕| 久久久精品国产网站| 国产一区二区三区日韩欧美| 日韩精品在线第一页| 国a精品视频大全| 日韩va亚洲va欧洲va国产| 日韩在线视频观看正片免费网站| 色樱桃影院亚洲精品影院| 亚洲黄色www网站| 日韩在线免费视频| 国产成人精品网站| 久久精品小视频| 国产精品午夜国产小视频| 欧美精品久久久久久久久| 久久av在线播放| 中文字幕在线看视频国产欧美在线看完整| 日韩在线不卡视频| 日韩动漫免费观看电视剧高清| 日本一区二区三区在线播放| 亚洲福利在线看| 92裸体在线视频网站| 成人中文字幕+乱码+中文字幕| 亚洲欧洲视频在线| 色妞一区二区三区| 亚洲图片制服诱惑| 综合欧美国产视频二区| 国产精品毛片a∨一区二区三区|国| 亚洲精品日韩在线| 久久久久日韩精品久久久男男| 日韩视频中文字幕| 欧美日韩裸体免费视频| 欧美日韩成人在线视频| 国产极品精品在线观看| 国产97免费视| 国产精品视频导航| 69视频在线播放| 国产精品色午夜在线观看| 久久精品欧美视频| 国产欧美日韩91| 久久久久久久久久亚洲| 午夜精品久久久久久久久久久久久| 欧美孕妇与黑人孕交| 韩国视频理论视频久久| 亚洲欧美第一页| 亚洲成人激情小说| 国产在线视频2019最新视频| 欧美尤物巨大精品爽| 97视频在线观看亚洲| www.日本久久久久com.| 国内精品免费午夜毛片| 国产亚洲欧美视频| 在线观看中文字幕亚洲| 日本高清不卡的在线| 欧美激情在线观看视频| 亚洲第一视频在线观看| 欧美在线影院在线视频| 狠狠久久亚洲欧美专区| 日韩成人久久久| 欧美电影免费观看网站| 国产精品一区二区久久久久| 国产一区视频在线播放| 日韩电影免费观看在线| 日韩国产精品亚洲а∨天堂免| 国产午夜精品久久久| 7m第一福利500精品视频| 国产香蕉97碰碰久久人人| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品久久久久影院日本| 日韩va亚洲va欧洲va国产| 欧美野外猛男的大粗鳮| 亚洲欧美一区二区三区情侣bbw| 欧美极品欧美精品欧美视频| 久久综合久久八八| 国产69精品久久久久9| 欧美日韩国产专区| 欧美在线亚洲一区| 久久九九全国免费精品观看| 精品一区二区三区三区| 亚洲福利视频久久| 欧美日韩国产精品一区二区三区四区| 亚洲一区二区久久久久久| 国产欧美精品一区二区三区介绍| 人人做人人澡人人爽欧美| 久久视频在线免费观看| 久久久在线免费观看| 成人观看高清在线观看免费| 久久精品成人欧美大片| 亚洲电影第1页| 国产精品色视频| 日韩欧美在线视频免费观看| 隔壁老王国产在线精品| 影音先锋日韩有码| 国产福利视频一区二区| 久久精品2019中文字幕| 91精品久久久久久久久久久久久久|