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

首頁(yè) > 編程 > JavaScript > 正文

Vue父子組件雙向綁定傳值的實(shí)現(xiàn)方法

2019-11-19 13:22:12
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

父子組件之間的雙向綁定非常簡(jiǎn)單,但是很多人因?yàn)槭菑腣ue 2+開(kāi)始使用的,可能不知道如何雙向綁定,當(dāng)然最簡(jiǎn)單的雙向綁定(單文件中)就是表單元素的 v-model 了,例如 <input type="text" /> 它會(huì)響應(yīng)表單元素的 value 屬性,當(dāng)輸入框文本改變時(shí),會(huì)將 value 值傳給 v-model 所綁定的變量,如果同時(shí)設(shè)置 v-model 和 value , value 屬性無(wú)效。

父子組件的自定義雙向 v-model

當(dāng)若干dom封裝成組件時(shí),在父組件中使用子組件時(shí),卻無(wú)法在子組件標(biāo)簽上使用 v-model ,因?yàn)樽咏M件標(biāo)簽不是表單元素,這個(gè)時(shí)候,我們需要自定義我們想要的 v-model 規(guī)則。

<!-- children.vue --><template> <h1>{{ msg }}</h1></template><script>export default{ model:{  prop:'msg',//這個(gè)字段,是指父組件設(shè)置 v-model 時(shí),將變量值傳給子組件的 msg  event:'parent-event'//這個(gè)字段,是指父組件監(jiān)聽(tīng) parent-event 事件 }, props:{  msg:String //此處必須定義和model的prop相同的props,因?yàn)関-model會(huì)傳值給子組件 }, mounted(){ //這里模擬異步將msg傳到父組件v-model,實(shí)現(xiàn)雙向控制  setTimeout(_=>{   let some = '3秒后出現(xiàn)的某個(gè)值';//子組件自己的某個(gè)值   this.$emit('praent-event',some);   //將這個(gè)值通過(guò) emit 觸發(fā)parent-event,將some傳遞給父組件的v-model綁定的變量  },3000); }}</script><!-- parent.vue --><template> <children v-model="parentMsg"></children></template><script>import children from 'path/to/children.vue';export default{ components:{  children }, data(){  return{   parentMsg:'test'  } }, watch:{  parentMsg(newV,oldV){   console.log(newV,oldV);   //三秒后控制臺(tái)會(huì)輸出   //'3秒后出現(xiàn)的某個(gè)值','test'  } }}</script>

你學(xué)會(huì)組件的自定義 v-model 了嗎 ? 如果是普通的表單元素,同理,監(jiān)聽(tīng)表單的 input 或者 change 事件,實(shí)時(shí)將 value 或者 checked 通過(guò) $emit 傳遞就可以了。

父子組件的自定義多個(gè)雙向值

上述例子,是實(shí)現(xiàn)單個(gè)prop值的雙向綁定,當(dāng)組件的需求需要復(fù)雜的操作,需要多個(gè)雙向值,是如何實(shí)現(xiàn)的呢。這里需要用到以前被vue拋棄,后來(lái)又回歸的 .sync 修飾符。

事實(shí)上,這個(gè)比 v-model 更加簡(jiǎn)單

<!-- children.vue --><template> <h1>{{ msg }}</h1></template><script>export default{ props:{  msg:String }, mounted(){ //這里模擬異步將msg傳到父組件v-model,實(shí)現(xiàn)雙向控制  setTimeout(_=>{   let some = '3秒后出現(xiàn)的某個(gè)值';//子組件自己的某個(gè)值   this.$emit('update:msg',some);   //將這個(gè)值通過(guò) emit   //update為固定字段,通過(guò)冒號(hào)連接雙向綁定的msg,將some傳遞給父組件的v-model綁定的變量  },3000); }}</script><!-- parent.vue --><template> <children :msg.sync="parentMsg"></children> <!-- 此處只需在平時(shí)常用的單向傳值上加上.sync修飾符 --></template><script>import children from 'path/to/children.vue';export default{ components:{  children }, data(){  return{   parentMsg:'test'  } }, watch:{  parentMsg(newV,oldV){   console.log(newV,oldV);   //三秒后控制臺(tái)會(huì)輸出   //'3秒后出現(xiàn)的某個(gè)值','test'  } }}</script>

此處需要注意,雖然加上 .sync 即可雙向綁定,但是還是要依靠子組件 $emit 去觸發(fā) update:prop名 實(shí)現(xiàn)修改父組件的變量值實(shí)現(xiàn)雙向數(shù)據(jù)流,如果直接對(duì)prop的屬性直接賦值,依然會(huì)出現(xiàn)報(bào)錯(cuò)。

事實(shí)上, .sync 修飾符是一個(gè)簡(jiǎn)寫(xiě),它做了一件事情

<template> <children :msg.sync="parentMsg"></children> <!-- 等價(jià)于 --> <children :msg="parentMsg" @updata:msg="parentMsg = $event"></children> <!-- 這里的$event就是子組件$emit傳遞的參數(shù) --></template>

當(dāng)需要把一個(gè)對(duì)象中的屬性全部通過(guò) .sync 傳入雙向數(shù)據(jù)流時(shí),可以再簡(jiǎn)便一下寫(xiě)法

<template> <children :.sync="obj"></children></template><script>export default{ components:{  children }, data(){  return{   obj:{    parentMsg:'test'   }  } }}</script>

當(dāng)使用這種寫(xiě)法時(shí),會(huì)將obj對(duì)象中的所有屬性都通過(guò)獨(dú)立的props傳遞給子組件,并監(jiān)聽(tīng)對(duì)應(yīng)的 update: ,此時(shí)在子組件中也要聲明對(duì)應(yīng)的props。

總結(jié)

以上所述是小編給大家介紹的Vue父子組件雙向綁定傳值的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)武林網(wǎng)網(wǎng)站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长治县| 富平县| 兴宁市| 应城市| 申扎县| 美姑县| 灵宝市| 太仓市| 简阳市| 盘山县| 修文县| 淳安县| 肥城市| 马龙县| 邹平县| 邛崃市| 邵东县| 平南县| 青川县| 昆明市| 象州县| 法库县| 民丰县| 宁陕县| 浙江省| 拉孜县| 襄樊市| 韶关市| 青龙| 宾川县| 彩票| 前郭尔| 漳浦县| 隆子县| 元阳县| 尚志市| 开江县| 闻喜县| 紫云| 芦山县| 连南|