日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Vue中的父子組件通訊以及使用sync同步父子組件數據

瀏覽:29日期:2022-09-30 14:09:16
前言

父子組件通訊,可分為兩種情況:

1. 父組件向子組件中傳遞數據2. 子組件向父組件中傳遞數據

一般情況下, 1中情況可通過props解決數據傳遞的問題, 這里就不多贅述了。

子組件向父組件中傳遞數據

主要談談2中情景的實現,有三種方式:

一. 通過props,父組件向子組件中傳遞數據和改變數據的函數,通過在子組件中調用父組件傳過來的函數,達到更新父組件數據(向父組件傳遞數據)的作用(子組件中需要有相應的響應事件)

二. 通過在子組件中觸發一個 自定義事件(vm.$emit),將數據作為vm.$emit方法的參數,回傳給父組件用v-on:[自定義事件]監聽的函數

三.通過ref對子組件做標記,父組件可以通過vm.$refs.[子組件的ref].[子組件的屬性/方法]這種方式直接取得子組件的數據

下面我將一 一展示

一. 通過props從父向子組件傳遞函數,調用函數改變父組件數據

這里就不做代碼展示了

一來是因為相對比較簡單二來是因為這種方式顯然不是Vue中的最佳實踐(在react中倒比較常見) 想要看代碼的話可以看這里:《【Vue】淺談Vue不同場景下組件間的數據交流》http://www.cnblogs.com/penghuwan/p/7286912.html (在兄弟組件的數據交流那一節)

二. 通過自定義事件從子組件向父組件中傳遞數據

我們可以在子組件中通過$emit(event, [...參數])觸發一個自定義的事件,這樣,父組件可以在使用子組件的地方直接用 v-on來監聽子組件觸發的事件, 并且可以在監聽函數中依次取得所有從子組件傳來的參數

例如:在子組件中某個部分寫入:

this.emit(’eventYouDefined’, arg);

然后你就可以在父組件的子組件模板里監聽:// 這里是父組件的Template:

<Son v-on: eventYouDefined = 'functionYours' />

下面是一個實例

父組件

<template> <div id='father'> <div> 我是父組件,我接受到了: {{ text || ’暫無數據’ }} <son v-on:sendData=’getSonText’></son> </div> </div></template> <script>import son from ’./son.vue’export default { data: function () { return { text: ’’ } }, components: { son: son }, methods: { getSonText (text) { this.text = text } }}</script> <style scoped>#father div { padding: 10px; margin: 10px; border: 1px solid grey; overflow: hidden;}</style>

子組件:

<template> <div> <p>我是子組件,我所擁有的數據: {{ text }}</p> <button @click='sendData'> 發送數據 </button> </div></template> <script>export default { data () { return { text: ’來自子組件的數據’ } }, methods: { sendData () { this.$emit(’sendData’, this.text) } }}</script> <!-- Add 'scoped' attribute to limit CSS to this component only --><style scoped> button { float: left }</style>

在點擊子組件中的“發送數據”按鈕前, 父組件還沒有接受到數據(text為空字符串), 則通過 {{ text || ’暫無數據’ }}將顯示默認文本:‘暫無數據’

Vue中的父子組件通訊以及使用sync同步父子組件數據

點擊“發送數據”按鈕后:

Vue中的父子組件通訊以及使用sync同步父子組件數據

因為sendData自定義事件被觸發,通過

this.$emit(’sendData’, this.text) //此處的this指向子組件實例)

子組件的text數據被父組件中:

<son v-on:sendData=’getSonText’></son>

中的getSonText函數作為參數接傳參受到, 從而完成了從子組件向父組件中的傳參過程

三. 通過ref屬性在父組件中直接取得子組件的數據(data)

對于我們上面講的一和二的處理情景來說,有個局限性就是它們都需要以事件機制為基礎(無論是像click那樣的原生事件還是自定義事件),而在事件發生的時候才能調用函數將數據傳遞過來

但如果子組件里沒有類似“按鈕”的東西,因而無法制造原生事件,同時也沒辦法找到一個觸發自定義事件的時機的時候,怎么從子組件向父組件傳遞數據呢??

這個時候, 我們就只能從父組件中“直接取”子組件的數據了,借助ref屬性

ref是我們經常用到的Vue屬性,利用它可以簡單方便地從本組件的template中取得DOM實例,而實際上,如果你在父組件中為子組件設置ref的話, 就可以直接通過vm.$refs.[子組件的ref].[子組件的屬性]去拿到數據啦,例如:

父組件:

<template> <div id='father'> <div> 我是父組件,我接受到了: {{ text || ’暫無數據’ }} <button @click='getSonText()'>接受數據</button> <son ref=’son’></son> </div> </div></template> <script>import son from ’./son.vue’export default { data: function () { return { text: ’’ } }, components: { son: son }, methods: { getSonText () { this.text = this.$refs.son.text } }}</script> <style scoped>#father div { padding: 10px; margin: 10px; border: 1px solid grey; overflow: hidden;}</style>

子組件:

<template> <div> <p>我是子組件,我所擁有的數據: {{ text }}</p> </div></template> <script>export default { data () { return { text: ’來自子組件的數據’ } }}</script> <!-- Add 'scoped' attribute to limit CSS to this component only --><style scoped> button { float: left }</style>

demo:

尚未點擊“接受數據”按鈕前:

Vue中的父子組件通訊以及使用sync同步父子組件數據

點擊接受數據按鈕后:

Vue中的父子組件通訊以及使用sync同步父子組件數據

通過sync實現數據雙向綁定, 從而同步父子組件數據

通過以上三種方式, 我想你應該能解決絕大多數父子組件通信的場景了,但讓我們再仔細考慮一下上面的通信場景,就會發現它們還可能存在的問題:

從子組件向父組件傳遞數據時,父子組件中的數據仍不是每時每刻都同步的

但在某些特殊的需求場景下,我們可能會希望父子組件中的數據時刻保持同步, 這時候你可能會像下面這樣做:

這是父組件中的template:

<son :foo='bar' v-on:update='val => bar = val'></son>

在子組件中, 我們通過props聲明的方式接收foo并使用

props: { foo: [type]}

同時每當子組件中數據改變的時候,通過

this.$emit(’update’, newValue)

把參數newValue傳遞給父組件template中監聽函數中的'val'。然后通過

val => bar = val

這個表達式就實現了bar = newValue. 這個時候,我們發現父組件中的關鍵數據bar被子組件改變(相等)了!

通過數據的雙向綁定, 父(組件)可以修改子的數據, 子也可以修改父的數據

Vue提供了sync修飾符簡化上面的代碼,例如:

<comp :foo.sync='bar'></comp>

會被擴展為:

<comp :foo='bar' @update:foo='val => bar = val'></comp>

然后你需要在子組件中改變父組件數據的時候, 需要觸發以下的自定義事件:

this.$emit('update:foo', newValue)

【注意】你可能覺得這好像和我上面提到的二中的“通過自定義事件(emit)從子組件向父組件中傳遞數據”的那一節的內容似乎重疊了,。

然而并不是, 兩者有著父子組件關系上的不同, 下面我通過一行關鍵的代碼證明它們的區別所在

1.在我們講解sync的這一小節里, 自定義事件發生時候運行的響應表達式是:<son :foo='bar' v-on:update='val => bar = val'></son> 中的 'val => bar = val'

2.在二中的“通過自定義事件從子組件向父組件中傳遞數據” 里,自定義事件發生時候運行的響應表達式是:<Son v-on: eventYouDefined = 'arg => functionYours(arg)' /> 中的 'arg => functionYours(arg)'

對前者, 表達式 val => bar = val意味著強制讓父組件的數據等于子組件傳遞過來的數據, 這個時候,我們發現父子組件的地位是平等的。 父可以改變子(數據), 子也可以改變父(數據)

對后者, 你的functionYours是在父組件中定義的, 在這個函數里, 你可以對從子組件接受來的arg數據做任意的操作或處理, 決定權完全落在父組件中, 也就是: 父可以改變子(數據), 但子不能直接改變父(數據)!, 父中數據的變動只能由它自己決定

下面是一個展示demo:

父組件:

<template> <div id='father'> <div> 我是父組件 <son:wisdom.sync='wisdom':magic.sync='magic':attack.sync='attack':defense.sync='defense'> </son> <p>智力: {{ wisdom }}</p> <p>膜法: {{ magic }}</p> <p>攻擊: {{ attack }}</p> <p>防御: {{ defense }}</p> </div> </div></template> <script>import son from ’./son.vue’export default { data: function () { return { wisdom: 90, magic: 160, attack: 100, defense: 80 } }, components: { son: son }}</script> <style scoped>#father div { padding: 10px; margin: 10px; border: 1px solid grey; overflow: hidden;}</style>

子組件:

<template> <div> <p>我是子組件</p> <p>智力: {{ wisdom }}</p> <p>膜法: {{ magic }}</p> <p>攻擊: {{ attack }}</p> <p>防御: {{ defense }}</p> <button @click='increment(’wisdom’)'>增加智力</button> <button @click='increment(’magic’)'>增加膜法</button> <button @click='increment(’attack’)'>增加攻擊</button> <button @click='increment(’defense’)'>增加防御</button> </div></template> <script>export default { props: { wisdom: Number, magic: Number, attack: Number, defense: Number }, methods: { increment (dataName) { let newValue = this[dataName] + 1 this.$emit(`update:${dataName}`, newValue) } }}</script> <!-- Add 'scoped' attribute to limit CSS to this component only --><style scoped> button { float: left }</style>

點擊前

Vue中的父子組件通訊以及使用sync同步父子組件數據

點擊增加子組件中“增加智力”按鈕的時候, 父組件和子組件中的智力參數同時從90變為91

Vue中的父子組件通訊以及使用sync同步父子組件數據

點擊增加子組件中“增加膜法”按鈕的時候, 父組件和子組件中的智力參數同時從160變為161

Vue中的父子組件通訊以及使用sync同步父子組件數據

數據雙向綁定是把雙刃劍

從好處上看:

1.它實現了父子組件數據的“實時”同步, 在某些數據場景下可能會使用到這一點2.sync提供的語法糖使得雙向綁定的代碼變得很簡單

從壞處上看:

它破環了單向數據流的簡潔性, 這增加了分析數據時的難度

當sync修飾的prop是個對象

我們對上面的例子修改一下, 把數據包裹在一個對象中傳遞下來:

父組件

<template> <div id='father'> <div> 我是父組件 <son :analysisData.sync='analysisData'> </son> <p>智力: {{ analysisData.wisdom }}</p> <p>膜法: {{ analysisData.magic }}</p> <p>攻擊: {{ analysisData.attack }}</p> <p>防御: {{ analysisData.defense }}</p> </div> </div></template> <script>import son from ’./son.vue’export default { data: function () { return { analysisData: {wisdom: 90,magic: 160,attack: 100,defense: 80 } } }, components: { son: son }}</script> <style scoped>#father div { padding: 10px; margin: 10px; border: 1px solid grey; overflow: hidden;}</style>

子組件

<template> <div> <p>我是子組件</p> <p>智力: {{ analysisData.wisdom }}</p> <p>膜法: {{ analysisData.magic }}</p> <p>攻擊: {{ analysisData.attack }}</p> <p>防御: {{ analysisData.defense }}</p> <button @click='increment(’wisdom’)'>增加智力</button> <button @click='increment(’magic’)'>增加膜法</button> <button @click='increment(’attack’)'>增加攻擊</button> <button @click='increment(’defense’)'>增加防御</button> </div></template> <script>export default { props: { analysisData: Object }, methods: { increment (dataName) { let newObj = JSON.parse(JSON.stringify(this.analysisData)) newObj[dataName] += 1 this.$emit(’update:analysisData’, newObj) } }}</script> <!-- Add 'scoped' attribute to limit CSS to this component only --><style scoped> button { float: left }</style>

demo同上

不要通過在子組件中修改引用類型props達到“父子組件數據同步”的需求!

父組件的數據傳遞給子組件, 一般通過props實現, 而在實現“父子組件數據同步”這一需求的時候, 小伙伴們可能會發現一點: 在子組件中修改引用類型的props(如數組和對象)是可行的

1.不僅可以達到同時修改父組件中的數據(因為本來引用的就是同一個數據)2.而且還不會被Vue的檢測機制發現!(不會報錯)

但千萬不要這樣做, 這樣會讓數據流變得更加難以分析,如果你嘗試這樣做, 上面的做法可能會更好一些不要這樣做,糟糕的做法:

父組件:

<template> <div id='father'> <div> 我是父組件 <son :analysisData='analysisData'> </son> <p>智力: {{ analysisData.wisdom }}</p> <p>膜法: {{ analysisData.magic }}</p> <p>攻擊: {{ analysisData.attack }}</p> <p>防御: {{ analysisData.defense }}</p> </div> </div></template> <script>import son from ’./son.vue’export default { data: function () { return { analysisData: {wisdom: 90,magic: 160,attack: 100,defense: 80 } } }, components: { son: son }}</script> <style scoped>#father div { padding: 10px; margin: 10px; border: 1px solid grey; overflow: hidden;}</style>

子組件:

<template> <div> <p>我是子組件</p> <p>智力: {{ analysisData.wisdom }}</p> <p>膜法: {{ analysisData.magic }}</p> <p>攻擊: {{ analysisData.attack }}</p> <p>防御: {{ analysisData.defense }}</p> <button @click='increment (’wisdom’)'>增加智力</button> <button @click='increment (’magic’)'>增加膜法</button> <button @click='increment (’attack’)'>增加攻擊</button> <button @click='increment (’defense’)'>增加防御</button> </div></template> <script>export default { props: { analysisData: Object }, methods: { increment (dataName) { let obj = this.analysisData obj[dataName] += 1 } }}</script> <!-- Add 'scoped' attribute to limit CSS to this component only --><style scoped> button { float: left }</style>

以上就是Vue中的父子組件通訊以及使用sync同步父子組件數據的詳細內容,更多關于Vue的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品国产大片免费观看| 卡一精品卡二卡三网站乱码| www.51av欧美视频| 精品入口麻豆88视频| 国产成人精品三级高清久久91| 国产乱人伦精品一区| 精品一区二区三区视频在线播放 | 亚洲国产影院| 91成人精品视频| 国产日本精品| 老牛国产精品一区的观看方式| 久久久免费人体| 亚洲欧美日本国产| 久久中文字幕二区| 美女毛片一区二区三区四区最新中文字幕亚洲| 99精品美女| 国产aⅴ精品一区二区四区| 国产日韩精品视频一区二区三区| 99精品美女| 欧美午夜网站| 国产精品毛片久久| 黄色在线观看www| 性欧美videohd高精| 男人天堂欧美日韩| 久久不见久久见中文字幕免费| 久久97视频| 国产精品毛片久久| 免费人成在线不卡| 精品久久久久中文字幕小说| 伊人影院久久| 麻豆成人91精品二区三区| 免费视频一区三区| 国产欧美一区二区色老头| 国产精品成久久久久| 欧美日韩激情| 精品一区二区三区免费看| 福利一区二区免费视频| 偷拍亚洲精品| 国产一区清纯| 精品国产亚洲一区二区三区大结局| 亚洲综合精品| 日韩另类视频| 国产精品v一区二区三区| 亚洲少妇自拍| 日韩国产一区| 国产精品调教| 在线综合亚洲| 91精品啪在线观看国产18| 狂野欧美性猛交xxxx| 亚洲一区二区成人| 97精品中文字幕| 日本欧美韩国一区三区| 久久av在线| 久久99伊人| 亚洲中字黄色| 国产精品欧美大片| 亚洲精品乱码| 一二三区精品| 日本在线视频一区二区| 亚洲18在线| 日本天堂一区| 国产精品中文字幕制服诱惑| 国产精品一二| 精品视频一二| 亚洲www啪成人一区二区| 蜜桃成人精品| 日韩电影免费网站| 麻豆精品新av中文字幕| 亚洲福利免费| 蜜桃视频第一区免费观看| 欧美日韩国产在线一区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 中文字幕一区二区三区四区久久| 欧美日韩日本国产亚洲在线| 亚洲国产不卡| 中文字幕av一区二区三区人| 欧美一级一区| 国产欧美日韩精品一区二区三区| 国产欧美日韩| 日韩在线中文| 国产精品亚洲综合久久| 国产欧洲在线| 欧美日韩国产一区二区三区不卡| 国产免费成人| 国产亚洲久久| 亚洲精品国产嫩草在线观看 | 久久中文字幕av一区二区不卡| 91成人精品| 91精品一区| 欧美一区二区性| 日本一区二区中文字幕| 成人午夜在线| 亚洲精品亚洲人成在线观看| 97人人精品| 青青国产91久久久久久| 99久久亚洲精品蜜臀| 日韩高清在线不卡| 日韩国产专区| 国产精品日本一区二区三区在线| av亚洲一区二区三区| 国产福利亚洲| 日韩不卡在线观看日韩不卡视频| 日韩在线观看| 久久99伊人| 99久久激情| 精品欧美日韩精品| 亚洲精品国产日韩| 黄色日韩在线| 999久久久精品国产| 国产精品nxnn| 久久国产乱子精品免费女| 午夜在线视频观看日韩17c| 欧美日韩免费观看视频| 国产激情欧美| 美女尤物国产一区| 日韩在线电影| 免费日韩视频| 日韩制服丝袜先锋影音| 国产福利片在线观看| 91精品国产经典在线观看| 日本色综合中文字幕| 亚洲精品福利| 天堂俺去俺来也www久久婷婷| 国产精品女主播一区二区三区| 亚洲欧美日韩一区在线观看| 欧美日一区二区三区在线观看国产免 | 久久一区二区三区喷水| 荡女精品导航| 韩国久久久久久| 久久国产免费| 免费不卡在线视频| 日韩一区二区三区高清在线观看 | 国产精品字幕| 免费国产自久久久久三四区久久 | 欧美亚洲专区| 午夜久久av | 人人精品人人爱| 日韩精品免费一区二区夜夜嗨 | 国产欧美日韩综合一区在线播放| 日本久久成人网| 麻豆高清免费国产一区| 成人久久久久| 亚洲一区国产一区| 亚州精品视频| 亚洲夜间福利| 免费不卡在线观看| 里番精品3d一二三区| 成人国产精选| 不卡视频在线| 日韩高清二区| 国产日韩欧美一区| 国产黄色精品| 国产精品久久久久av电视剧| 日韩国产专区| 国产欧美一区| 日本欧美不卡| 蜜桃av.网站在线观看| 久久国产成人午夜av影院宅| 国产免费av一区二区三区| 国产成人久久| 日本韩国欧美超级黄在线观看| 精品日产乱码久久久久久仙踪林| 国产欧美一区二区三区精品酒店| 久久精品欧洲| 中文字幕高清在线播放| 99国产精品免费视频观看| 成人在线免费观看网站| 国产主播一区| 一区二区三区四区在线观看国产日韩| 亚洲视频电影在线| 美女国产精品久久久| 99国产精品自拍| 日韩专区在线视频| 久久精品国产久精国产爱| 久久国产欧美| 日韩精品久久久久久久电影99爱 | 久久一区二区中文字幕| 一级欧洲+日本+国产| 免费视频一区二区三区在线观看 | 99综合视频| 天堂中文在线播放| 蜜臀av一区二区三区| 久久av国产紧身裤| 激情婷婷综合| 精品成人18| 蜜桃精品在线| 国产一区二区高清| 红桃视频亚洲| 精品72久久久久中文字幕| 黄页网站一区| 成人国产精品一区二区免费麻豆| 久久av一区| 精品午夜视频| 日韩高清二区| 日韩视频不卡| 精品国产黄a∨片高清在线| 中文字幕av一区二区三区四区| 欧美日韩国产v| 麻豆免费精品视频| 中文字幕免费精品|