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

vue組件中watch props根據(jù)v-if動態(tài)判斷并掛載DOM的問題

 更新時間:2019年05月12日 09:20:46   作者:JS菌  
這篇文章主要介紹了vue組件中watch props根據(jù)v-if動態(tài)判斷并掛載DOM的問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

問題復(fù)現(xiàn):父組件中通過名為 source 的 prop 向子組件 Chart 傳入數(shù)據(jù)

<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 數(shù)據(jù)當(dāng)存在且至少有一條數(shù)據(jù)的時候,創(chuàng)建 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 組件通過接收數(shù)據(jù) watch prop 的變化動態(tài)的調(diào)用 echarts 的 setOptions 方法,最終渲染數(shù)據(jù)。

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 數(shù)據(jù)雖然有了,但 div 還并未掛載,因此 echarts 無法完成初始化

那么想當(dāng)然的我們就會去在 mounted 生命周期函數(shù)中調(diào)用 setOpts 方法:

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

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

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

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

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

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

修改 Chart 組件:

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

我們只需要一個 source 數(shù)據(jù)源,當(dāng) mounted 的時候調(diào)用 setOpts 方法,當(dāng) watch 數(shù)據(jù)變化的時候再次調(diào)用以更新數(shù)據(jù)

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 是否獲取到,一旦獲取到數(shù)據(jù),馬上加載 Chart 組件,這樣就可以避開在組件內(nèi)部調(diào)用 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 組件和站位標(biāo)簽一同封裝成一個 ChartWrapper。

這樣就不會因在組件內(nèi)部調(diào)用 watch 監(jiān)聽 props 的變化動態(tài) v-if 判斷并掛載數(shù)據(jù)到 DOM 上出現(xiàn)的這種問題了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解CocosCreator項目結(jié)構(gòu)機制

    詳解CocosCreator項目結(jié)構(gòu)機制

    這篇文章主要介紹了詳解CocosCreator項目結(jié)構(gòu)機制,只有了解這些機制后,才能更好的進(jìn)行項目開發(fā),避免潛在錯誤,并且快速的除錯
    2021-04-04
  • js+canvas繪制五角星的方法

    js+canvas繪制五角星的方法

    這篇文章主要介紹了js+canvas繪制五角星的方法,涉及JavaScript調(diào)用canvas組件結(jié)合數(shù)學(xué)運算繪制圖形的相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • JavaScript判斷是否手機瀏覽器的五種方法

    JavaScript判斷是否手機瀏覽器的五種方法

    現(xiàn)在手機網(wǎng)站已經(jīng)很普及了,有時候前端網(wǎng)頁需要判斷,用戶使用的是手機瀏覽器還是電腦瀏覽器。這篇文章整理了JavaScript判斷是否手機瀏覽器的五種方法,通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值
    2022-11-11
  • 原生js實現(xiàn)瀑布流效果

    原生js實現(xiàn)瀑布流效果

    這篇文章主要為大家詳細(xì)介紹了原生js實現(xiàn)簡單瀑布流效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • javascript 三種數(shù)組復(fù)制方法的性能對比

    javascript 三種數(shù)組復(fù)制方法的性能對比

    javascript 三種數(shù)組復(fù)制方法的性能對比,對于webkit, 使用concat; 其他瀏覽器, 使用slice.
    2010-01-01
  • Code: write(s,d) 輸出連續(xù)字符串

    Code: write(s,d) 輸出連續(xù)字符串

    Code: write(s,d) 輸出連續(xù)字符串...
    2007-08-08
  • 一個簡單的js漸顯(fadeIn)漸隱(fadeOut)類

    一個簡單的js漸顯(fadeIn)漸隱(fadeOut)類

    最近發(fā)現(xiàn)項目用的表單驗證不好使,干脆一邊參考人家的一邊自己寫了一個。在驗證有錯誤返回提示信息用到漸顯(fadeIn)漸隱(fadeOut)過渡(因為瀏覽器的效率實在太高了,一下就蹦了出來~~);
    2010-06-06
  • JavaScript中關(guān)鍵字 in 的使用方法詳解

    JavaScript中關(guān)鍵字 in 的使用方法詳解

    這篇文章主要介紹了JavaScript中關(guān)鍵字 in 的使用方法詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • 基于leaflet.js實現(xiàn)修改地圖主題樣式的流程分析

    基于leaflet.js實現(xiàn)修改地圖主題樣式的流程分析

    這篇文章主要介紹了基于leaflet.js實現(xiàn)修改地圖主題樣式的流程,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • layui清空,重置表單數(shù)據(jù)的實例

    layui清空,重置表單數(shù)據(jù)的實例

    今天小編就為大家分享一篇layui清空,重置表單數(shù)據(jù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09

最新評論

普格县| 肇庆市| 井陉县| 永清县| 昆明市| 南平市| 白银市| 昌宁县| 秦皇岛市| 柘荣县| 湘乡市| 蒲江县| 柞水县| 稻城县| 黔江区| 西昌市| 林甸县| 雷山县| 罗甸县| 株洲市| 潞城市| 仁寿县| 双流县| 久治县| 兰溪市| 潼南县| 弥勒县| 余姚市| 临西县| 高青县| 偃师市| 湖北省| 富川| 融水| 两当县| 柯坪县| 东兰县| 三穗县| 中卫市| 襄樊市| 五大连池市|