偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Vue父子組件狀態(tài)同步的最佳方式

開(kāi)發(fā)
平時(shí)我們?cè)谑褂肰ue開(kāi)發(fā)的時(shí)候,可能會(huì)遇到需要父組件與子組件某個(gè)狀態(tài)需要同步的情況,通常這個(gè)是因?yàn)槲覀兎庋b組件的時(shí)候有一個(gè)相同的狀態(tài)外面要用,里面也要用,今天我們就來(lái)看看怎么優(yōu)雅的解決這個(gè)問(wèn)題吧!

 一般來(lái)說(shuō)我們實(shí)現(xiàn)這個(gè)功能,只需要父組件通過(guò) props 傳遞給子組件就好了,但是理想很豐滿(mǎn),現(xiàn)實(shí)很骨感,如果我們直接在子組件更改傳進(jìn)來(lái)的 props ,不出意外瀏覽器會(huì)給你一坨大紅色的報(bào)錯(cuò),因?yàn)樵赩ue中我們的數(shù)據(jù)流動(dòng)是自上而下的,而子組件直接更改父組件傳來(lái)的 props 則是自下而上的數(shù)據(jù)流動(dòng),這是Vue不允許的。

所以通常我們的解決辦法是,父組件通過(guò) props 傳入狀態(tài)給子組件,子組件通過(guò) props 來(lái)初始化另外一個(gè)內(nèi)部的狀態(tài),子組件每次更改狀態(tài)之后都通知父組件,然后由父組件來(lái)更改自己的狀態(tài),其實(shí)就是 props on emit 的應(yīng)用,接下來(lái)我們來(lái)上代碼。

父組件 Father.vue

 

  1. <template> 
  2.  <div class="father"
  3.         <h1>父組件維護(hù)的狀態(tài):{{food}}</h1> 
  4.         <son :food="food" @update:food="f => food = f"></son> 
  5.     </div> 
  6. </template> 

子組件 Son.vue

 

  1. <template> 
  2.  <div class="son"
  3.         <h2>子組件中維護(hù)的狀態(tài):{{innerFood}}</h2> 
  4.         <button @click="innerFood = '100斤牛肉'">點(diǎn)擊更改子組件狀態(tài)</button> 
  5.     </div> 
  6. </template> 
  7. <script> 
  8.  export default { 
  9.         data () { 
  10.           return { 
  11.               innerFood: this.food 
  12.           }   
  13.         }, 
  14.         props: { 
  15.             food: String 
  16.         }, 
  17.         watch: { 
  18.             innerFood (nv) { 
  19.                 this.$emit("update:food",nv) 
  20.             } 
  21.         } 
  22.     } 
  23. </script> 

可以看到我們上述的寫(xiě)法,其實(shí)是維護(hù)了父子組件中的不同的兩個(gè)狀態(tài),我們做的工作只是將這兩個(gè)狀態(tài)同步了,這種寫(xiě)法沒(méi)有任何問(wèn)題,其實(shí)對(duì)于子組件的部分我們也可以通過(guò) computed 來(lái)實(shí)現(xiàn),下面我們來(lái)看一看另一種子組件內(nèi)維護(hù)同步狀態(tài)的方法:

子組件 Son.vue 的另一種寫(xiě)法

 

  1. <template> 
  2.  <div class="son"
  3.         <h2>子組件中維護(hù)的狀態(tài):{{innerFood}}</h2> 
  4.         <button @click="innerFood = '100斤牛肉'">點(diǎn)擊更改子組件狀態(tài)</button> 
  5.     </div> 
  6. </template> 
  7. <script> 
  8.  export default { 
  9.         props: { 
  10.             food: String 
  11.         }, 
  12.         computed: { 
  13.             innerFood: { 
  14.                 get () { 
  15.                     return this.food 
  16.                 }, 
  17.                 set (nv) { 
  18.                     this.$emit("update:food",nv) 
  19.                 } 
  20.             } 
  21.         } 
  22.     } 
  23. </script> 

好了,兩種寫(xiě)法我們都已經(jīng)演示完畢,現(xiàn)在我們來(lái)優(yōu)化一下父組件中的寫(xiě)法。

父組件中可以看到我們之前在上面綁定了一個(gè) update:food 事件,并且使用箭頭函數(shù)做了一個(gè)賦值,其實(shí)這里我們可以稍微優(yōu)化一下,不要箭頭函數(shù)直接賦值,因?yàn)槲覀冇|發(fā)的是自定義事件,而我們觸發(fā)的時(shí)候給的第一個(gè)參數(shù)就是新值,我們可以直接通過(guò) $event 拿到這個(gè)值,所以可以寫(xiě)成如下形式:

優(yōu)化后的父組件

 

  1. <template> 
  2.  <div class="father"
  3.         <h1>父組件維護(hù)的狀態(tài):{{food}}</h1> 
  4.         <son :food="food" @update:food="food = $event"></son> 
  5.     </div> 
  6. </template> 

到這里你以為就結(jié)束了?其實(shí)我們還可以更近一步,只要滿(mǎn)足我們以上的事件命名方式,我們實(shí)際上可以使用 sync 修飾符代替事件的綁定,也就是我們不用寫(xiě)事件綁定了,但是子組件內(nèi)部的事件觸發(fā)依然不能少,最終優(yōu)化的結(jié)果如下:

 

  1. <template> 
  2.  <div class="father"
  3.         <h1>父組件維護(hù)的狀態(tài):{{food}}</h1> 
  4.         <son :food.sync="food"></son> 
  5.     </div> 
  6. </template> 

到此我們就真的完成了父子組件的同步,當(dāng)然在子組件中維護(hù)一個(gè)狀態(tài)不一定是必須的,如果我們只用父組件傳給我們的 props 做展示,而子組件沒(méi)有對(duì)這個(gè) props 直接更改的行為,那么我們就不用在子組件創(chuàng)建另外一個(gè)狀態(tài),我們子組件想改他的時(shí)候只需要在合適的時(shí)機(jī)提交合適的事件即可,但是有一種情況我們不得不在子組件中創(chuàng)建另一個(gè)狀態(tài),就是我們父組件傳入的狀態(tài)在子組件中用于 v-model 這種雙向數(shù)據(jù)綁定的功能時(shí),由于 v-model 會(huì)自動(dòng)更改值所以直接填入從父組件接受的 props 就不合適了。

 

 

責(zé)任編輯:姜華 來(lái)源: 晨曦大前端
相關(guān)推薦

2021-09-15 08:09:43

前端技術(shù)編程

2019-05-29 14:23:53

Vue.js組件通信

2023-04-18 09:17:40

父子組件Vue

2021-09-13 09:20:20

前端框架VUE

2024-01-09 08:34:56

Vue3.js組件通信

2022-07-27 08:40:06

父子組件VUE3

2020-04-08 18:29:20

Vue組件屬性

2022-05-06 08:47:10

Vue 3組件前端

2023-03-30 11:50:34

2017-02-28 21:57:05

React組件

2024-10-15 07:42:09

Vue動(dòng)態(tài)加載

2019-04-10 08:24:06

vue組件通信

2019-08-14 10:00:08

vue組件通信前端

2015-11-03 08:12:44

2009-12-15 14:42:56

OSPF路由協(xié)議

2025-02-17 01:00:00

.NET性能服務(wù)器

2015-06-25 09:43:07

2019-05-15 08:00:00

vue組件間通信前端

2022-03-11 12:31:04

Vue3組件前端

2015-09-01 10:15:16

公有云應(yīng)用遷移
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)