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

首頁 > 開發 > JS > 正文

vue組件中watch props根據v-if動態判斷并掛載DOM的問題

2024-05-06 16:50:47
字體:
來源:轉載
供稿:網友

問題復現:父組件中通過名為 source 的 prop 向子組件 Chart 傳入數據

<Chart :source="chartData"></Chart>
import Chart from '../components/Chart'export default { name: 'Home', components: { Chart }, data () {  return {   chartData: []  } }, mounted () {  setTimeout(() => {   this.chartData = [    [89.3, 58212, 'Matcha Latte'],    [57.1, 78254, 'Milk Tea'],    [74.4, 41032, 'Cheese Cocoa'],    [50.1, 12755, 'Cheese Brownie'],    [89.7, 20145, 'Matcha Cocoa'],    [68.1, 79146, 'Tea'],    [19.6, 91852, 'Orange Juice'],    [10.6, 101852, 'Lemon Juice'],    [32.7, 20112, 'Walnut Brownie']   ]  }, 2000) }}

子組件接收 source 數據當存在且至少有一條數據的時候,創建 id 為 main 的 div,用以初始化 echarts 實例

<div v-if="source && source.length" id="main" ref="main" style="width: 600px;height: 400px;"></div><div vi-else>none</div>

Chart 組件通過接收數據 watch prop 的變化動態的調用 echarts 的 setOptions 方法,最終渲染數據。

export default { // ... watch: {  source (newVal, oldVal) {   this.setOpts()  } }, props: ['source'], methods: {  setOpts () {   let myChart = this.$echarts.init(this.$refs.main)   myChart.setOption({    dataset: {     // ...     source: this.source    },    // ...   })  } }}

如果直接這么寫必定報錯:

Error in callback for watcher "source": "TypeError: Cannot read property 'getAttribute' of undefined"

在代碼中增加一行代碼:

watch: {  source (newVal, oldVal) {   console.log(newVal, this.$refs.main) // [Array ...] undefined   this.setOpts()  } },

啟示 source 數據雖然有了,但 div 還并未掛載,因此 echarts 無法完成初始化

那么想當然的我們就會去在 mounted 生命周期函數中調用 setOpts 方法:

mounted () {  console.log(this.source, this.$refs.main) // [] undefined  this.setOpts() },

這樣也是錯的,因為模板語法中使用了 v-if,那么當 source 并未滿足條件的時候,div 當然也不會掛載。因此 div 仍然無法訪問到。

Error in mounted hook: "TypeError: Cannot read property 'getAttribute' of undefined"

解決辦法是要么去掉 v-if 要么換另一種寫法

有時我們需要在沒有數據的情況下增加一個占位標簽用來展示一些額外的提醒信息,如“暫未獲取到數據”等。那么去掉 v-if 肯定不行。

既然如此我們保留 v-if 但寫法有所改變:

修改 Chart 組件:

<template> <div>  <div id="main" ref="main" style="width: 600px;height: 400px;"></div> </div></template>

我們只需要一個 source 數據源,當 mounted 的時候調用 setOpts 方法,當 watch 數據變化的時候再次調用以更新數據

export default { name: 'Chart', props: ['source'], mounted () {  this.setOpts() }, watch: {  source () {   this.setOpts()  } }, methods: {  setOpts () {   let myChart = this.$echarts.init(this.$refs.main)   myChart.setOption({    dataset: {     dimensions: ['score', 'amount', 'product'],     source: this.source    },    xAxis: { type: 'category' },    yAxis: {},    series: [     {      type: 'bar',      encode: {       x: 'product',       y: 'amount'      }     }    ]   })  } }}

v-if 的判斷我們把他移出去了我們判斷 chartData 是否獲取到,一旦獲取到數據,馬上加載 Chart 組件,這樣就可以避開在組件內部調用 v-if 帶來的問題:

<template> <div>  <Chart :source="chartData" v-if="flag"></Chart>  <div v-else>none</div> </div></template>import Chart from '../components/Chart'export default { name: 'Home', components: { Chart }, data () {  return {   chartData: [],   flag: false  } }, methods: {  getData () {   setTimeout(() => {    this.chartData = [     [89.3, 58212, 'Matcha Latte'],     [57.1, 78254, 'Milk Tea'],     [74.4, 41032, 'Cheese Cocoa'],     [50.1, 12755, 'Cheese Brownie'],     [89.7, 20145, 'Matcha Cocoa'],     [68.1, 79146, 'Tea'],     [19.6, 91852, 'Orange Juice'],     [10.6, 101852, 'Lemon Juice'],     [32.7, 20112, 'Walnut Brownie']    ]    this.flag = true   }, 2000)  } }, mounted () {  this.getData() }}

另外還可將 Chart 組件和站位標簽一同封裝成一個 ChartWrapper。

這樣就不會因在組件內部調用 watch 監聽 props 的變化動態 v-if 判斷并掛載數據到 DOM 上出現的這種問題了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品99久久久久| 欧美成人三级视频网站| 538国产精品视频一区二区| 亚洲男人天堂九九视频| 色综合天天综合网国产成人网| 毛片精品免费在线观看| 日韩成人小视频| 一本色道久久88精品综合| 国产成人免费91av在线| 清纯唯美亚洲激情| 一区二区三区日韩在线| 久久久久久久国产精品| 亚洲欧美制服综合另类| 91中文精品字幕在线视频| 久久久噜噜噜久久中文字免| 91精品视频一区| 国产精品黄视频| 这里只有精品丝袜| 91高清视频在线免费观看| 日韩av免费看| 久久久伊人日本| 国产精品一区二区三区久久| 久久精品中文字幕电影| 97在线观看视频| 国产欧美日韩精品在线观看| 91chinesevideo永久地址| 日韩av日韩在线观看| 日韩中文字幕久久| 日韩av在线精品| 久久久久久久久久久人体| 国产日韩av在线播放| 国产精品高潮呻吟久久av无限| 一区二区三区回区在观看免费视频| 日韩中文视频免费在线观看| 欧美多人爱爱视频网站| 一道本无吗dⅴd在线播放一区| 亚洲欧美日韩综合| 91免费欧美精品| 日韩av综合网站| 日韩精品极品视频免费观看| 亚洲aⅴ男人的天堂在线观看| 91久久久久久国产精品| 国产成人激情小视频| 91在线观看免费高清完整版在线观看| 成人亚洲激情网| 国产精品极品尤物在线观看| 久久久亚洲福利精品午夜| 91久久国产婷婷一区二区| 亚洲国产精品电影在线观看| 成人在线视频网站| 国产成人av在线播放| 日韩福利视频在线观看| 亚洲一区二区三区视频播放| 欧美另类99xxxxx| 日本不卡高字幕在线2019| 久久久www成人免费精品| 亚洲精品福利免费在线观看| 97国产在线视频| 欧美亚洲国产视频| 中文字幕精品一区二区精品| 欧美激情中文字幕在线| 久久久999精品免费| 久久手机免费视频| 色老头一区二区三区在线观看| 欧美一区二区三区精品电影| 久久99国产综合精品女同| 欧美激情一级欧美精品| 欧美大片在线看| 91精品久久久久久久久久久久久久| 亚洲欧美一区二区精品久久久| 亚洲激情在线观看| 欧美精品激情在线| 亚洲精品丝袜日韩| 亚洲视频一区二区三区| 欧美激情啊啊啊| 亚洲国产女人aaa毛片在线| 亚洲精品久久久久中文字幕欢迎你| 日韩欧美一区二区三区| 欧美激情亚洲一区| 久热爱精品视频线路一| 最好看的2019的中文字幕视频| 国产激情久久久| 久久久免费电影| 日韩中文娱乐网| 亚洲最大av网| 亚洲成人久久网| 夜色77av精品影院| 成人黄色中文字幕| 国语自产精品视频在线看抢先版图片| 国产视频999| 正在播放欧美视频| 午夜精品www| 欧美老女人xx| 亚洲综合第一页| 欧美一级视频免费在线观看| 精品福利视频导航| 一区二区在线视频播放| 久久久久久久久久久免费精品| 欧美国产日韩xxxxx| xxx成人少妇69| 欧美性视频精品| 久久69精品久久久久久国产越南| 岛国视频午夜一区免费在线观看| 欧美日韩国产一中文字不卡| 精品国产一区二区三区久久狼5月| 亚洲男人av在线| 亚洲欧洲免费视频| 亚洲精品美女久久久| 亚洲影院色无极综合| 日韩在线视频观看| 日韩精品视频免费在线观看| 97免费中文视频在线观看| 欧美成人免费全部| 国产91热爆ts人妖在线| 欧美日韩一区二区免费在线观看| 国产精品一区二区三区久久| 欧美猛交ⅹxxx乱大交视频| 日韩精品电影网| 91情侣偷在线精品国产| 国产精品香蕉av| 亚洲精品一区在线观看香蕉| 8050国产精品久久久久久| 欧美乱妇40p| 日韩精品福利在线| 欧美性高潮在线| 欧美视频在线看| 国产精品美女久久久免费| 狠狠久久五月精品中文字幕| 久久99国产精品自在自在app| 国产精品无码专区在线观看| xxav国产精品美女主播| 亚洲国产97在线精品一区| 91精品久久久久久久久久久久久| 久久久久国色av免费观看性色| 国产精品主播视频| 91国产精品91| xvideos亚洲| 美女久久久久久久| 亚洲色在线视频| 日韩电影中文字幕在线观看| 色视频www在线播放国产成人| 2019中文字幕免费视频| 在线免费看av不卡| 欧美黑人国产人伦爽爽爽| 国产精品三级美女白浆呻吟| 久久久中文字幕| 91情侣偷在线精品国产| 亚洲激情视频网站| 欧美日韩免费观看中文| 国产精品99免视看9| 亚洲第一综合天堂另类专| 在线视频亚洲欧美| 深夜福利91大全| 色青青草原桃花久久综合| 日韩福利视频在线观看| 亚洲精品美女在线观看| 亚洲精品美女久久| 色综合久久久久久中文网| 国产精品99久久久久久人| 成人激情视频网| 国产精品一香蕉国产线看观看| 欧美在线视频观看| 国产一区二区在线免费| 国产精品99久久99久久久二8|