摘要:數(shù)據(jù)下發(fā)組件實(shí)例的作用域是相互獨(dú)立的,父子組件之間無(wú)法進(jìn)行數(shù)據(jù)的共享。父組件通過(guò)下發(fā)數(shù)據(jù),將父組件屬性和子組件特性綁定在一起,在第一文本框輸入值改變的內(nèi)容,子組件的會(huì)跟隨變化,顯示在第二個(gè)文本框中。
數(shù)據(jù)下發(fā)
組件實(shí)例的作用域是相互獨(dú)立的,父、子組件之間無(wú)法進(jìn)行數(shù)據(jù)的共享。
如果想在子組件模板中使用父組件的數(shù)據(jù),可以通過(guò)Prop將父組件的數(shù)據(jù)下發(fā)到子組件。子組件用props選項(xiàng)聲明它預(yù)期的數(shù)據(jù)。
為了傳遞數(shù)據(jù),父組件必須先在子組件自定義標(biāo)簽的特性上綁定數(shù)據(jù),綁定的值分兩種情況解析:
字面量 prop="value"
表達(dá)式(動(dòng)態(tài)綁定) v-bind:prop="expression"
表達(dá)式特例 v-bind="Object"
new Vue({ el: "#app-1", data: { parentMsg: "root"s dynamic data", parentObj: { text:"hello vue!", isShow: true }, }, components: { "component-1": { props: ["expectMsg","expectDynamicMsg","expectObj","text","isShow"], template: "" }{{expectMsg}}
{{expectDynamicMsg}}
{{expectObj.text}}
{{text}}
這里分別作了幾種綁定的示例:
把字符串"static data"綁定到子組件的props的expectMsg上
把父組件屬性parentMsg動(dòng)態(tài)綁定到子組件的expectDynamicMsg特性上
把父組件中的一個(gè)對(duì)象parentObj動(dòng)態(tài)綁定到子組件的expectObj特性上
把父組件中的parentObj對(duì)象的屬性text、isShow綁定到子組件的text和isShow特性上
注意:要下發(fā)一個(gè)數(shù)字給子組件不能使用字面量綁定,字面量下發(fā)的都是字符串。因此需要?jiǎng)討B(tài)綁定
Prop驗(yàn)證
當(dāng)要對(duì)下發(fā)數(shù)據(jù)做驗(yàn)證或在無(wú)數(shù)據(jù)時(shí)設(shè)置默認(rèn)值,子組件選項(xiàng)props就需要使用一個(gè)對(duì)象替換數(shù)組。
簡(jiǎn)單的情況:
props:{ someProp:String }
下發(fā)數(shù)據(jù)必須是一個(gè)字符串
復(fù)雜點(diǎn)可以設(shè)置默認(rèn)值與驗(yàn)證器,如:
new Vue({ el: "#app-2", data:{ message:{ title:"prop驗(yàn)證", text:"父組件數(shù)據(jù)" } }, components: { "component-2": { props: { propObj:{ type:Object, //下發(fā)對(duì)象的title屬性必須是個(gè)字符串 validator:function(value){ return typeof value.title === "string" }, //下發(fā)數(shù)據(jù)為一個(gè)數(shù)組或?qū)ο螅O(shè)置的默認(rèn)值必須由一個(gè)函數(shù)返回 default:function(){ return {title:"prop驗(yàn)證",text:"數(shù)組/對(duì)象的默認(rèn)值應(yīng)當(dāng)由一個(gè)工廠函數(shù)返回"} } } }, template: "" } } }){{propObj.title}}
{{propObj.text}}
type屬性也可以是一個(gè)函數(shù),使用instanceof驗(yàn)證。驗(yàn)證在子組件實(shí)例創(chuàng)建之前進(jìn)行,因此驗(yàn)證里的任何函數(shù)都無(wú)法使用子組件實(shí)例屬性。
更多類型驗(yàn)證 Prop驗(yàn)證
Prop的單向綁定和雙向綁定下發(fā)數(shù)據(jù)實(shí)際上就是完成一個(gè)數(shù)據(jù)綁定的過(guò)程,把組件間的特定數(shù)據(jù)綁定在一起,默認(rèn)情況下為單向綁定,子組件的數(shù)據(jù)對(duì)于父組件是透明的,而父組件的數(shù)據(jù)變化則會(huì)引發(fā)子組件數(shù)據(jù)的變化。
new Vue({ el: "#app-3", data: { content: "please input..." }, components: { "component-3": { props:["txt"], template:"" } } })
父組件通過(guò)Prop下發(fā)數(shù)據(jù),將父組件屬性content和子組件特性txt綁定在一起,在第一文本框輸入值改變content的內(nèi)容,子組件的txt會(huì)跟隨變化,顯示在第二個(gè)文本框中。
如果在子模板第二個(gè)文本框輸入,修改txt的值時(shí),父組件控制的第一個(gè)文本框內(nèi)容不會(huì)改變。
并在控制臺(tái)給出警告,說(shuō)不要修改props選項(xiàng)中的值,作為代替,可以讓prop的值賦予data或者computed屬性使用。因此可以像下面這樣用data替代prop作為一個(gè)局部變量。
"component-3": { props:["txt"], template:"", data:function(){ return {txtData:this.txt} } }
若只考慮輸出不考慮輸入,也可以使用計(jì)算屬性替代
"component-3": { props: ["txt"], template: "", computed: { txtComputed:function() { return this.txt } } }非Prop特性
組件的作者卻并不總能預(yù)見到組件被使用的場(chǎng)景。所以,組件可以接收任意傳入的特性,這些特性都會(huì)被添加到組件的根元素上,而不需要定義響應(yīng)的props。
var vm = new Vue({ el: "#app-4", components: { "component-4": { template: "" } } });
渲染結(jié)果
其中data-title、class就是非Prop特性。
因?yàn)闆](méi)有在組件中定義props,因此也無(wú)法去引用它們,作用目前不明顯。
從渲染結(jié)果還可以發(fā)現(xiàn),class特性的值由子組件模板和父模板定義的特性合并而成,對(duì)于class和style是這樣合并結(jié)果。但對(duì)于多數(shù)組件來(lái)說(shuō),傳遞給組件的值會(huì)覆蓋組件本身設(shè)定的值。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/51986.html
摘要:數(shù)據(jù)下發(fā)組件實(shí)例的作用域是相互獨(dú)立的,父子組件之間無(wú)法進(jìn)行數(shù)據(jù)的共享。父組件通過(guò)下發(fā)數(shù)據(jù),將父組件屬性和子組件特性綁定在一起,在第一文本框輸入值改變的內(nèi)容,子組件的會(huì)跟隨變化,顯示在第二個(gè)文本框中。 數(shù)據(jù)下發(fā) 組件實(shí)例的作用域是相互獨(dú)立的,父、子組件之間無(wú)法進(jìn)行數(shù)據(jù)的共享。如果想在子組件模板中使用父組件的數(shù)據(jù),可以通過(guò)Prop將父組件的數(shù)據(jù)下發(fā)到子組件。子組件用props選項(xiàng)聲明它預(yù)期...
摘要:自定義事件自定義事件有能力使子組件事件觸發(fā)父組件中的動(dòng)作。它所做的只是報(bào)告自己的內(nèi)部事件,因?yàn)楦附M件可能會(huì)關(guān)心這些事件。只是這里父組件上的事件功效沒(méi)有雙向綁定中事件那么強(qiáng)大。 自定義事件 自定義事件有能力使子組件事件觸發(fā)父組件中的動(dòng)作。那么父組件如何監(jiān)聽事件呢?可以使用指令v-on:event-name=callback監(jiān)聽。而子組件又是如何觸發(fā)事件的呢? 很簡(jiǎn)單,調(diào)用this.$em...
摘要:自定義事件自定義事件有能力使子組件事件觸發(fā)父組件中的動(dòng)作。它所做的只是報(bào)告自己的內(nèi)部事件,因?yàn)楦附M件可能會(huì)關(guān)心這些事件。只是這里父組件上的事件功效沒(méi)有雙向綁定中事件那么強(qiáng)大。 自定義事件 自定義事件有能力使子組件事件觸發(fā)父組件中的動(dòng)作。那么父組件如何監(jiān)聽事件呢?可以使用指令v-on:event-name=callback監(jiān)聽。而子組件又是如何觸發(fā)事件的呢? 很簡(jiǎn)單,調(diào)用this.$em...
摘要:在較高層面上,組件是自定義元素,的編譯器為它添加特殊功能。這時(shí)可以把特性直接添加到組件上不需要事先定義添加屬性之后,它會(huì)被自動(dòng)添加到的根元素上。下面是一個(gè)例子在本例中,子組件已經(jīng)和它外部完全解耦了。 Vue組件 什么是組件? 組件 (Component) 是 Vue.js 最強(qiáng)大的功能之一。組件可以擴(kuò)展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的...
摘要:組件聲明組件分為全局的和局部的。父組件通過(guò)給子組件下發(fā)數(shù)據(jù),子組件通過(guò)事件給父組件發(fā)送消息。以下實(shí)例中子組件已經(jīng)和它外部完全解耦了。 1.vue 組件-聲明 組件分為全局的和局部的。 全局聲明 Vue.component(tagName, options) ** 引用組件 // 注冊(cè) Vue.comp...
閱讀 3832·2021-09-29 09:34
閱讀 3778·2021-09-27 13:34
閱讀 572·2021-09-24 09:47
閱讀 3040·2019-08-30 15:53
閱讀 1814·2019-08-26 13:54
閱讀 2090·2019-08-26 13:43
閱讀 541·2019-08-23 14:47
閱讀 1747·2019-08-23 14:28