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

首頁 > 編程 > JavaScript > 正文

Vue2.0實現組件數據的雙向綁定問題

2019-11-19 14:13:53
字體:
來源:轉載
供稿:網友

通過上一節的學習,我們了解到了在Vue的組件中數據傳遞: prop 向下傳遞,事件向上傳遞 。意思是父組件通過 prop 給子組件下發數據,子組件通過事件給父組件發送消息。但Vue中, props 是單向數據綁定,雖然在Vue 1.0版本中,通過 .sync 能實現雙向數據綁定。但 .sync 在幾個版本中被移除,盡管在2.3版本重新引入 .sync 修飾符,可這次引入只是作為一個編譯時的語法糖存在。如果直接使用 .sync 修飾符來做雙向數據綁定,會報警告信息。那么我們如何在組件中實現雙向數據綁定呢?這一節我們就來學習這方面的相關知識。

實現組件雙向數據綁定

在上一節中最后的示例使用的是Vue 1.0版本中的 .sync 實現數據雙向綁定。那我們先來看看拋棄 .sync 修飾符來實現組件雙向數據綁定的工作: 通過Vue提供的機制,繞開直接修改 prop 來實現組件雙向數據綁定 。

其思路大致是這樣:

  • 在數據渲染時使用 prop 渲染數據
  • 將 prop 綁定到子組件自身的數據上,修改數據時修改自身數據來替代 prop
  • watch 子組件自身數據的改變,觸發事件通知父組件更改綁定到 prop 的數據

這樣做的好處是: 父組件數據改變時,不會修改存儲 prop 的子組件數據,只是以子組件數據為媒介,完成對 prop 的雙向修改 。

繼續拿上一節的示例來舉例,只不過接下來的示例,并沒有使用 .sync 來實現雙向數據綁定的效果。

修改的代碼如下:

<div id="app"> <div class="parent">  <h3>父組件Parent數據</h3>  <ul>   <li>    <label>姓名:</label>    <span>{{ name }}</span>    <input type="text" v-model="name" />   </li>   <li>    <label>年齡:</label>    <span>{{ age }}</span>    <input type="number" v-model="age" />   </li>  </ul> </div> <child :my-name="name" :my-age="age" @update:my-name="val => name = val" @update:my-age="val => age = val"></child></div><template id="child"> <div class="child">  <h3>子組件child數據</h3>  <ul>   <li>    <label>姓名</label>    <span>{{ myName }}</span>    <input type="text" v-model="childMyName" />   </li>   <li>    <label>年齡</label>    <span>{{ myAge }}</span>    <input type="number" v-model="childMyAge" />   </li>  </ul> </div></template>

在上面的這個示例中,我們并沒有使用 .sync 修飾符,但在調用子組件的時候使用了 @update :

<child :my-name="name" :my-age="age" @update:my-name="val => name = val" @update:my-age="val => age = val"></child>

子組件中渲染到HTML模板的數據是用的 prop 數據,但監聽 input 是使用的子組件自身定義的數據作為 v-model 。這樣一來就不會直接修改 prop 。簡單來說, 一切 prop 的改變從本質上來說都由父組件完成 。JavaScript的代碼如下:

let parent = new Vue({ el: '#app', data () {  return {   name: 'w3cplus',   age: 7  } }, components: {  'child': {   template: '#child',   props: ['myName', 'myAge'],   data () {    return {     childMyName: this.myName,     childMyAge: this.myAge    }   },   watch: {    childMyName: function (val) {     this.$emit('update:my-name', val)    },    childMyAge: function (val) {     this.$emit('update:my-age', val)    }   }  } }})

最終效果如下:

上面的示例效果,不管是修改父組件的數據還是子組件的數據,都會相互影響:

 

因為子組件中 props 的 myName 和 myAge 不可寫,所以在 data 中創建一個副本 childMyName 和 childMyAge 。初始值為 props 屬性 myName 和 myAge 的值,同時在組件內所有需要調用 props 的地方調用 data 中的 childMyName 和 childMyAge 。

components: { 'child': {  template: '#child',  props: ['myName', 'myAge'],  data () {   return {    childMyName: this.myName,    childMyAge: this.myAge   }  },  ... }}

接下來在子組件中通過 watch 來對 props 屬性的 myName 和 myAge 進行監聽。當 props 修改后對應 data 中的副本 childMyName 和 childMyAge 也要同步數據。

...watch: { childMyName: function (val) {  this.$emit('update:my-name', val) }, childMyAge: function (val) {  this.$emit('update:my-age', val) }}...

接下來要做的事情就是當組件內的 props 屬性發生變化時,需要向組件外(父組件)發送通知,通知組件內屬性變更,然后由外層(父組件)自己來決定是否變更他的數據。

接下來我們按上面的方案來改造上一節示例中的switch按鈕。

至此,實現了組件內部數據與組件外部的數據的雙向綁定,組件內外數據的同步。簡而言之: 組件內部自已變了告訴外部,外部決定要不要變更 。

 

什么樣的 props 適合做雙向綁定

事實上,在Vue中,雙向綁定的 props 是不利于組件間的數據狀態管理,尤其是較為復雜的業務當中,因此在實際項目中應該盡量少用雙向綁定,過于復雜的數據處理,建議使用 Vuex 。但很多時候又避免不了使用雙向綁定。那么什么場景之下使用 props 來做雙向綁定呢?

如果在你的項目中,同時滿足下面的條件時,我們就可以考慮使用 props 來做雙向綁定:

  • 組件內部需要修改 props
  • 組件需要可以由外部在運行時動態控制,而非單純的初始化
  • 組件父部需要讀取組件內的狀態來進行處理

雖然上面的示例展示了我們怎么在Vue 2.0中實現 props 的雙向綁定,但如果項目中有更多這樣的雙向綁定,那么就會讓你做一些重復的事情,而且代碼也很冗余,事情也會變得復雜。為了改變這樣的現象,可以借助Vue的 mixin 來自動化處理 props 的雙向綁定的需求。不過在這節中,我們不會學習這方面的知識,后面我們在學習 mixin 時,可地再回過頭來實現這樣的功能。

在Vue中除了上述介紹的組件通訊之外,還有其他一些方法,在下一節中,咱們將會繼續學習這方面的知識。

總結

以上所述是小編給大家介紹的Vue2.0實現組件數據的雙向綁定問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频在线观看一区二区| 日韩电影中文字幕| 久久久国产精彩视频美女艺术照福利| 欧美电影在线观看完整版| 国产91久久婷婷一区二区| 欧美日韩在线视频一区二区| 国模精品一区二区三区色天香| 秋霞成人午夜鲁丝一区二区三区| 另类少妇人与禽zozz0性伦| 欧美在线观看日本一区| 亚洲精品一区久久久久久| 欧美日韩久久久久| 欧美成人午夜激情在线| 欧美老少配视频| 97视频在线播放| 久久久久久久影院| 亚洲国产精品小视频| 亚洲精品久久久久中文字幕二区| 精品视频久久久久久久| 亚洲精品久久久久中文字幕欢迎你| 亚洲一区免费网站| 亚洲国产精品嫩草影院久久| 国产午夜精品免费一区二区三区| 91系列在线观看| 国产91色在线| 亚洲三级免费看| 日韩资源在线观看| 亚洲一区制服诱惑| 日韩精品在线影院| 亚洲男人天堂网| 97超级碰在线看视频免费在线看| 国产精品欧美在线| 高清一区二区三区四区五区| 欧美一区二区三区四区在线| 日韩精品一区二区三区第95| 91国偷自产一区二区三区的观看方式| 欧美伦理91i| 国产精品欧美激情| 国产激情久久久| 日韩在线免费av| 性欧美xxxx视频在线观看| xvideos成人免费中文版| 亚洲第五色综合网| 亚洲第一精品夜夜躁人人躁| 久久久欧美精品| 一区二区三区国产视频| 成人深夜直播免费观看| 欧美电影免费观看高清完整| 亚洲精品日韩在线| 久久久国产一区二区| 亚洲欧美三级伦理| 日韩欧美在线看| 久久精品视频在线播放| 日韩亚洲综合在线| 青草成人免费视频| 日韩电视剧免费观看网站| 国产日韩在线一区| 91国语精品自产拍在线观看性色| 欧美国产精品va在线观看| 日韩黄色在线免费观看| 日本午夜精品理论片a级appf发布| 亚洲嫩模很污视频| 成人天堂噜噜噜| 成人免费淫片aa视频免费| 欧美成人精品一区二区| 在线视频欧美性高潮| 久久综合伊人77777蜜臀| 亚洲天堂av在线免费| 午夜精品一区二区三区视频免费看| 欧美孕妇与黑人孕交| 色综合久久中文字幕综合网小说| 国产综合在线看| 欧美成人亚洲成人日韩成人| 国内伊人久久久久久网站视频| 亚洲国产精品嫩草影院久久| 国产欧美亚洲精品| 国产精品视频免费在线| 国产精品国产三级国产专播精品人| 国产精品久久97| 国产精品18久久久久久首页狼| 中文字幕日韩综合av| 欧美成人激情在线| 国产大片精品免费永久看nba| 国产成人精品在线| 欧美成人一区在线| 一区二区三区天堂av| 欧美www在线| 精品偷拍各种wc美女嘘嘘| 欧美激情视频免费观看| 91精品国产网站| 欧美黄色三级网站| 亚洲a成v人在线观看| 欧美综合在线第二页| 亚洲成人1234| 成人免费看吃奶视频网站| 欧美理论电影在线观看| 欧美成人网在线| 国产精品一区二区性色av| 疯狂欧美牲乱大交777| 欧美激情高清视频| 国产亚洲精品久久久久久牛牛| 亚洲国产日韩一区| 91探花福利精品国产自产在线| 日韩大片免费观看视频播放| 国产精品91免费在线| 91精品国产成人| 欧美日韩免费在线观看| 国产欧美一区二区三区久久| 国产精品久久久久久久久久久久久| 欧美另类69精品久久久久9999| 国语自产精品视频在线看| 高清欧美性猛交xxxx| 成人精品久久一区二区三区| 日韩电影中文 亚洲精品乱码| 成人精品一区二区三区电影黑人| 亚洲欧美三级在线| 日韩在线视频国产| 久久久久中文字幕2018| 久久成人免费视频| 久久久久久久国产| 欧美日韩国产黄| 亚洲美女免费精品视频在线观看| 国产美女被下药99| www.欧美视频| 国产成人精品免高潮在线观看| 欧美成人久久久| 亚洲成人av中文字幕| 91久久久久久| 亚洲香蕉成人av网站在线观看| 久久中国妇女中文字幕| 成人精品久久久| 国产精品美女免费看| 日本精品性网站在线观看| 日本国产欧美一区二区三区| 日韩精品在线免费| 欧美亚洲伦理www| 国产一区二区三区在线| 综合网中文字幕| 欧美日韩在线视频一区二区| 95av在线视频| 国内精品一区二区三区| 91成人福利在线| 亚洲片在线观看| 伦理中文字幕亚洲| 成人xvideos免费视频| 久热精品视频在线免费观看| 高清欧美性猛交xxxx| 亚洲四色影视在线观看| 中文字幕日韩精品有码视频| 久久99热这里只有精品国产| 亚洲精品日韩丝袜精品| 性色av一区二区三区免费| 亚洲欧美精品一区| 国产精品va在线播放我和闺蜜| 中文字幕亚洲欧美在线| 黄色成人在线播放| 久久久精品久久久久| 日韩精品视频免费专区在线播放| 欧美激情网站在线观看| 国产精品偷伦一区二区| 欧美日韩免费看| 久久手机精品视频| 久久亚洲影音av资源网| 精品视频一区在线视频|