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

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 11:36:05
字體:
來源:轉載
供稿:網友

問題復現:父組件中通過名為 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 上出現的這種問題了。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲精品久久久久久| 成人激情视频免费在线| 精品人伦一区二区三区蜜桃网站| 欧美片一区二区三区| 97在线视频一区| 欧美做爰性生交视频| 粉嫩av一区二区三区免费野| 欧美日韩中文字幕在线| 国产欧美日韩中文字幕| 岛国av一区二区在线在线观看| 亚洲成色999久久网站| 亚洲第一精品福利| 久久人体大胆视频| 久久久国产一区二区| 5252色成人免费视频| 欧美视频免费在线| 精品国产福利在线| 午夜精品久久17c| 欧美日韩国产第一页| 国产在线a不卡| 欧美性xxxxhd| 亚洲欧洲一区二区三区在线观看| 播播国产欧美激情| 国产精品999999| 91夜夜揉人人捏人人添红杏| 国产婷婷色综合av蜜臀av| 中文欧美在线视频| 中文字幕亚洲欧美在线| 国产一区二区三区免费视频| 亚洲乱码一区二区| 久久成人精品视频| 中日韩美女免费视频网站在线观看| 欧美激情视频播放| 欧美交受高潮1| 一本大道香蕉久在线播放29| 国产精品精品视频一区二区三区| 不卡在线观看电视剧完整版| 亚洲第一福利网站| 久久久久国产视频| 国产成人一区二区在线| 久久在线观看视频| 日韩黄色在线免费观看| 粉嫩av一区二区三区免费野| 欧美亚洲第一区| 国产精品女视频| 欧美一区二区视频97| 久久福利视频导航| 国产欧美日韩专区发布| 日韩av色综合| 欧美精品免费播放| 欧美亚洲在线视频| 日韩国产欧美区| 亚洲黄色免费三级| 亚洲天堂av网| 国产99视频精品免视看7| 人人爽久久涩噜噜噜网站| 久久精品99久久久香蕉| 性欧美长视频免费观看不卡| 国产精品91视频| 成人免费网站在线| 日韩av一区二区在线| 26uuu另类亚洲欧美日本老年| 国产综合久久久久| 91爱视频在线| 91精品在线观看视频| 成人自拍性视频| 日韩最新中文字幕电影免费看| 超碰精品一区二区三区乱码| 性欧美xxxx视频在线观看| 97久久精品国产| 精品亚洲男同gayvideo网站| 日本久久久a级免费| 亚洲中国色老太| 欧美成人精品在线视频| 国产精品黄视频| 色婷婷av一区二区三区在线观看| 国内精品模特av私拍在线观看| 久久国产精品久久精品| www.日韩系列| 亚洲综合自拍一区| 日韩av免费在线看| 福利一区视频在线观看| 亚洲欧美制服另类日韩| 国产丝袜一区二区| 国产精品久久久久久久av电影| 国产91成人在在线播放| 91精品国产高清自在线看超| 国产视频999| 伦伦影院午夜日韩欧美限制| 久久国产精品久久久久| 国产欧美精品一区二区三区-老狼| 精品国产一区二区在线| 亚洲成人av在线播放| 欧美日韩中文在线观看| 亚洲精品wwwww| 91免费的视频在线播放| 国产精品91久久久| 久久全球大尺度高清视频| 久久久久久久久久久网站| 美女黄色丝袜一区| 国产精品www| 91免费人成网站在线观看18| 色老头一区二区三区在线观看| 国产精品扒开腿做| 欧洲成人性视频| 亚洲美女喷白浆| 91免费精品国偷自产在线| 国产精品入口日韩视频大尺度| 91国内揄拍国内精品对白| 欧美在线影院在线视频| 国产主播精品在线| 538国产精品一区二区免费视频| 国产一区二区三区网站| 国产精品一区二区性色av| 欧美日韩福利电影| 国产精自产拍久久久久久蜜| 狠狠色香婷婷久久亚洲精品| 成人激情视频网| 欧美极品少妇xxxxx| 91精品在线观看视频| 久久久亚洲网站| 日韩欧美国产网站| 国产在线观看一区二区三区| 欧美亚洲视频一区二区| 欧美日韩激情网| 91在线色戒在线| 亚洲国产精品久久久久秋霞不卡| 亚洲午夜激情免费视频| 国产欧美一区二区三区在线看| 91精品国产成人| 欧美日韩成人免费| 亚洲成色777777在线观看影院| 日韩欧美国产一区二区| 亚洲国产成人精品女人久久久| 伊人一区二区三区久久精品| 国产一区二区三区免费视频| 91精品国产高清自在线看超| 日韩专区在线播放| 国产精品色婷婷视频| 亚洲开心激情网| 久久在线免费观看视频| 久久久久久久久久久亚洲| 欧美精品在线免费观看| 欧美电影在线观看高清| 国产一区二区在线播放| 日韩欧美大尺度| 亚洲精品综合精品自拍| 久久久久久高潮国产精品视| 欧美激情精品久久久| 亚洲欧洲一区二区三区在线观看| 国产精品丝袜久久久久久高清| 国产成人精品久久久| 最近免费中文字幕视频2019| 日韩欧美亚洲范冰冰与中字| 亚洲日本成人女熟在线观看| 日韩av一区二区在线观看| 粗暴蹂躏中文一区二区三区| 国产精品久久久久影院日本| 欧美成人免费全部观看天天性色| 精品爽片免费看久久| 亚洲欧美一区二区三区久久| 欧美成人免费观看| 欧美日韩国产激情| 最近2019中文字幕第三页视频|