最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue組件中props與data的結(jié)合使用方式

 更新時(shí)間:2022年10月18日 10:58:35   作者:左直拳  
這篇文章主要介紹了vue組件中props與data的結(jié)合使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

組件中props與data的結(jié)合使用

如前所述(vue組件屬性(props)及私有數(shù)據(jù)data),vue組件中,props是組件公有屬性,對(duì)外;data是組件的私有數(shù)據(jù),對(duì)內(nèi)。正因?yàn)閜rops對(duì)外,由外部賦值,因此在組件內(nèi)部,是只讀的,即組件內(nèi)部不適宜去改變這些元素的值。當(dāng)然,改也可以改,但運(yùn)行時(shí)刻會(huì)有告警。

正如我們寫一個(gè)函數(shù),對(duì)于傳入的參數(shù),我們一般是只讀對(duì)待的,極少會(huì)去修改它的值一樣。當(dāng)然,這只是一種編碼約定,你硬是要改,也無(wú)話可說(shuō),改了就改了。

同時(shí),props是在開發(fā)時(shí),預(yù)先設(shè)置好,傳給組件的。在運(yùn)行過(guò)程中,這些設(shè)置是一錘子買賣,以后就不起作用了。假如我們想調(diào)用該組件的一個(gè)方法,而該方法又依賴于props,問(wèn)題就出來(lái)了:props是舊的。

這個(gè)時(shí)候,組件開發(fā)過(guò)程中,應(yīng)該將props與data相結(jié)合。在組件內(nèi)部,應(yīng)該依賴于data,而data的初始值來(lái)自于props:

組件

export default {
? props: {
? ? id: { default: 0 }
? },
? data () {
? ? return {
? ? ? myId: this.id //用props的id初始化
? ? }
? },
? methods: {
? ? pop (id) { // 供外部調(diào)用
? ? ? this.myId = id
? ? ? alert(this.id)
? ? ? alert(this.myId)
? ? }
? }
}

調(diào)用組件:

<template>
? <div>
? ?? ?<!-- 將變量id的值賦給組件的id屬性,一錘子買賣 -->
? ? <Pop ref="popWin" :id="id" />
? </div>
</template>
<script>
import Pop from './_pop.vue'
export default {
? components: {
? ? Pop
? },
? data () {
? ? return {
? ? ? id: 0
? ? }
? },
? methods: {
? ? showDetail (id) {//頁(yè)面的id也是由外部傳進(jìn)來(lái)的,事先不可能知道
? ? ? this.id = id //保存了id,但影響不了組件Pop
? ? ? this.$refs.popWin.pop(id) // 調(diào)用Pop組件的方法,并傳遞id
? ? }
? }
}
</script>

2021.07.22補(bǔ)充:

還有另一種機(jī)制,就是子組件監(jiān)控props里的屬性,當(dāng)該屬性變化時(shí),就觸發(fā),處理相應(yīng)的邏輯。

流程是這樣:父組件或頁(yè)面,將通過(guò)變量傳值給子組件的props,子組件監(jiān)控props。如果父組件在運(yùn)行過(guò)程中,想動(dòng)態(tài)更改這個(gè)屬性,那就更改自己的變量。由于有監(jiān)控(watch)機(jī)制存在,子組件被觸發(fā)。

父組件或頁(yè)面

<template>
? ?<div><Report ref="report1" :id="myId"/></div>
</template>
<script>
import Report from './_report.vue'
export default {
? components: {
? ? Report
? },
? data () {
? ? return {
? ? ? myId: 0,
? ? }
? },
? methods: {
? ? init (id) {
? ? ? this.myId = id //改變id值
? ? }
? }
}
</script>

組件_report.vue:

<template>
?? ?<div>我是子組件,名曰謝康樂(lè),一箭射雙鶴</div>
</template>
<script>
export default{
? watch: {
? ? id (val) {
? ? ? alert('id變了,我是不是應(yīng)該做點(diǎn)什么?')
? ? }
? }
}
</script>

2021.07.23補(bǔ)充:

監(jiān)視比父組件調(diào)用子組件方法控制更為合理,耦合程度更低。你值得擁有。

子組件中data從props中動(dòng)態(tài)更新數(shù)據(jù)

考慮這樣一種情況,Vue 的父組件根據(jù)網(wǎng)絡(luò)請(qǐng)求獲取到數(shù)據(jù)后,動(dòng)態(tài)更新到子組件的 props 上,

// 父組件
<template>
? <div class="parent">
? ? <chart :info='info'/>
? </div>
</template>
// 子組件
<template>
  <div class="child">
    <ul>
      <!-- 此處 info 來(lái)自 props -->
      <li v-for="i in info" :key='i'>{{i}}</li>
    </ul>
  </div>
</template>
<script>
export default {
  props:['info'],
  data () {},
}
</script>

走到這一步,都很順利,子組件能響應(yīng)父組件的數(shù)據(jù),進(jìn)行動(dòng)態(tài)更新。

但是,

實(shí)際項(xiàng)目中,往往要對(duì)子組件上接收到的數(shù)據(jù)進(jìn)行操作處理,然后才能通過(guò) data 渲染到頁(yè)面上,這時(shí)就會(huì)發(fā)現(xiàn),父組件上的數(shù)據(jù)變化,子組件不再能響應(yīng)并及時(shí)更新了。

在子組件上把數(shù)據(jù)直接渲染到模型上即可。

// 子組件
<template>
  <div class="child">
    <ul>
      <!-- 此處 list 來(lái)自 data -->
      <li v-for="i in list" :key='i'>{{i}}</li>
    </ul>
  </div>
</template>
<script>
export default {
  props:['info'],
  data () {
    return {
      list:[],
    }
  },
  mounted(){
    this.list = this.info.map(i => '0_'+i)
  },
}
</script>

原因很簡(jiǎn)單,從 props 的 info 傳遞給 data 的 list ,只有一次操作,就是在 mounted 中,往后即使 props 的 info 發(fā)生了變化,data 也接收不到。

問(wèn)題在于數(shù)據(jù)在傳遞過(guò)程中不能及時(shí)關(guān)聯(lián),針對(duì)這一點(diǎn),可以用 watch 來(lái)進(jìn)行跟蹤,如下即可

// 子組件
<template>
  <div class="child">
    <ul>
      <!-- 此處list 來(lái)自 data -->
      <li v-for="i in list" :key='i'>{{i}}</li>
    </ul>
  </div>
</template>
<script>
export default {
  props:['info'],
  data () {
    return {
      list:[],
    }
  },
  mounted(){
    // this.list = this.info.map(i => '0_'+i)
  },
  watch: {
    info() {
      this.list = this.info.map(i => '0_'+i)
    }
  }
}
</script>

后記:

以上操作其實(shí)也是走了一些彎路,對(duì)于這種 通過(guò)對(duì) props 數(shù)據(jù)操作再賦值給 子組件 data ,導(dǎo)致子組件 data 不能根據(jù) 父組件傳值變化而及時(shí)更新數(shù)據(jù)的情況。直接用計(jì)算屬性  computed  : list 

// 子組件
<template>
  <div class="child">
    <ul>
      <!-- 此處comp 來(lái)自 computed -->
      <li v-for="i in comp" :key='i'>{{i}}</li>
    </ul>
  </div>
</template>
<script>
export default {
  props:['info'],
  computed: {
    comp (){
      return this.info.map(i => '0_'+i)
    }
  },
}
</script>

如上即可

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue實(shí)現(xiàn)導(dǎo)航收縮框

    vue實(shí)現(xiàn)導(dǎo)航收縮框

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)導(dǎo)航收縮框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vue.js實(shí)現(xiàn)一個(gè)漂亮、靈活、可復(fù)用的提示組件示例

    Vue.js實(shí)現(xiàn)一個(gè)漂亮、靈活、可復(fù)用的提示組件示例

    這篇文章主要介紹了Vue.js實(shí)現(xiàn)一個(gè)漂亮、靈活、可復(fù)用的提示組件示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Vue 按鈕居中、按鈕居左、按鈕居右的實(shí)現(xiàn)代碼

    Vue 按鈕居中、按鈕居左、按鈕居右的實(shí)現(xiàn)代碼

    在 Vue 中,如果需要將按鈕居中顯示,可以使用 CSS 中的 `text-align: center` 屬性來(lái)實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹Vue 按鈕居中、按鈕居左、按鈕居右的實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧
    2023-10-10
  • Vue精簡(jiǎn)版風(fēng)格指南(推薦)

    Vue精簡(jiǎn)版風(fēng)格指南(推薦)

    這篇文章主要介紹了Vue精簡(jiǎn)版風(fēng)格指南的相關(guān)資料,包括組件名稱,指令及特征,需要的朋友可以參考下
    2018-01-01
  • vue+elementui實(shí)現(xiàn)點(diǎn)擊table中的單元格觸發(fā)事件--彈框

    vue+elementui實(shí)現(xiàn)點(diǎn)擊table中的單元格觸發(fā)事件--彈框

    這篇文章主要介紹了vue+elementui實(shí)現(xiàn)點(diǎn)擊table中的單元格觸發(fā)事件--彈框,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • vue.js的狀態(tài)管理vuex中store的使用詳解

    vue.js的狀態(tài)管理vuex中store的使用詳解

    今天小編就為大家分享一篇vue.js的狀態(tài)管理vuex中store的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • Vuex 命名空間 namespaced的使用

    Vuex 命名空間 namespaced的使用

    本文主要介紹了Vuex 命名空間 namespaced的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • vue監(jiān)聽(tīng)scroll的坑的解決方法

    vue監(jiān)聽(tīng)scroll的坑的解決方法

    這篇文章主要介紹了vue監(jiān)聽(tīng)scroll的坑的解決方法,現(xiàn)在分享給大家,也給大家做個(gè)參考,希望給有同樣經(jīng)歷的人幫助
    2017-09-09
  • 詳解vue為什么要求組件模板只能有一個(gè)根元素

    詳解vue為什么要求組件模板只能有一個(gè)根元素

    這篇文章主要介紹了vue為什么要求組件模板只能有一個(gè)根元素,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • vue使用JSON編輯器:vue-json-editor詳解

    vue使用JSON編輯器:vue-json-editor詳解

    文章介紹了如何在Vue項(xiàng)目中使用JSON編輯器插件`vue-json-editor`,包括安裝、引入、注冊(cè)和使用示例,通過(guò)這些步驟,用戶可以在Vue應(yīng)用中輕松實(shí)現(xiàn)JSON數(shù)據(jù)的編輯功能,文章最后呼吁大家支持腳本之家
    2025-01-01

最新評(píng)論

十堰市| 临城县| 招远市| 孟连| 罗田县| 宜兰市| 元阳县| 犍为县| 金乡县| 武平县| 金昌市| 五寨县| 新沂市| 青神县| 临江市| 乌拉特后旗| 永胜县| 垫江县| 玉龙| 巴林左旗| 富源县| 屏东市| 布拖县| 长宁县| 大港区| 庐江县| 满城县| 应城市| 青海省| 临江市| 宝应县| 抚顺市| 柏乡县| 曲周县| 米脂县| 阿拉善右旗| 光山县| 邻水| 铜山县| 九台市| 江都市|