91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-03-06 15:49:03 來源:億速云 閱讀:1173 作者:小新 欄目:web開發

小編給大家分享一下vue組件中如何解決watch props根據v-if動態判斷并掛載DOM的問題,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

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

看完了這篇文章,相信你對“vue組件中如何解決watch props根據v-if動態判斷并掛載DOM的問題”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高州市| 仁布县| 弥勒县| 宁城县| 松溪县| 周至县| 民丰县| 繁峙县| 曲水县| 祁东县| 四子王旗| 杂多县| 中方县| 虹口区| 昭苏县| 五莲县| 日喀则市| 延寿县| 罗田县| 凉山| 沂水县| 思南县| 读书| 亳州市| 习水县| 错那县| 平凉市| 东海县| 长汀县| 夏津县| 乳山市| 武川县| 新竹市| 武功县| 布拖县| 内江市| 大余县| 锡林郭勒盟| 无为县| 邯郸市| 武鸣县|