在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 在vuejs中,封裝了highchats的組件,子組件監(jiān)聽不到父組件傳入對象的更

在vuejs中,封裝了highchats的組件,子組件監(jiān)聽不到父組件傳入對象的更改。

主要問題就是標(biāo)題一樣。


這是我highchats的封裝,test 屬性是我用來測試,監(jiān)聽的。

<template>
  <div :class="className" :style="{height:height,width:width}"></div>
</template>

<script>
import Highcharts from "highcharts/highstock";
import HighchartsMore from "highcharts/highcharts-more";
import HighchartsDrilldown from "highcharts/modules/drilldown";
import Highcharts3D from "highcharts/highcharts-3d";
import { debounce } from "@/utils";

HighchartsMore(Highcharts);
HighchartsDrilldown(Highcharts);
Highcharts3D(Highcharts);

export default {
  props: {
    className: {
      type: String,
      default: "chart"
    },
    width: {
      type: String,
      default: "100%"
    },
    height: {
      type: String,
      default: "350px"
    },
    test: {
      type: String,
      default: ''
    },
    autoResize: {
      type: Boolean,
      default: true
    },
    chartData: {
      type: Object
    }
  },
   name: 'highcharts',
  data() {
    return {
      chart: null,
      options: Object
    };
  },
  mounted() {
    this.initChart();
    if (this.autoResize) {
      this.__resizeHanlder = debounce(() => {
        if (this.chart) {
          this.chart.reflow();
        }
      }, 100);
      window.addEventListener("resize", this.__resizeHanlder);
    }

    // 監(jiān)聽側(cè)邊欄的變化
    const sidebarElm = document.getElementsByClassName("sidebar-container")[0];
    sidebarElm.addEventListener("transitionend", this.__resizeHanlder);
  },
  beforeDestroy() {
    if (!this.chart) {
      return;
    }
    if (this.autoResize) {
      window.removeEventListener("resize", this.__resizeHanlder);
    }

    const sidebarElm = document.getElementsByClassName("sidebar-container")[0];
    sidebarElm.removeEventListener("transitionend", this.__resizeHanlder);

    this.chart.destroy();
    this.chart = null;
  },
  watch: {
    chartData: {
      deep: true,
      handler(val) {
        this.setOptions(val);
        console.log(val)
      }
    },
    test:{
      handler(val){
        console.log(val)
      }
    }
  },
  methods: {
    setOptions(expectedData) {
      this.options = expectedData
    },

    initChart() {
      this.setOptions(this.chartData);
      this.chart = new Highcharts.Chart(this.$el, this.options);
    }
  }
};
</script>

以下是頁面調(diào)用

    <Highchats :chart-data="temp_data.Highchats_linedata"></Highchats>

我吧highchats 的整個(gè)配置對象,定義在了父組件的 data 中,第一次頁面加載 的時(shí)候,能正常渲染。
但是當(dāng)我通過方法改變 這個(gè)配置對象的 data 時(shí),highchats 中監(jiān)聽不到,請各位指點(diǎn)一下。

在網(wǎng)上看了很多答案,都是創(chuàng)建圖表后,拿到該圖表的實(shí)例,然后通過調(diào)用highchats的函數(shù)進(jìn)行更新圖表,
而沒有看到在組件中,通過監(jiān)聽讓highchats 自己進(jìn)行更新的,這樣是不可行嗎?

回答
編輯回答
墨染殤
  • 之前也遇到過類似的問題,父組件傳給子組件,能渲染,但是在鉤子里面卻拿不到父組件傳的值,導(dǎo)致無法動(dòng)態(tài)更新。
  • 后來用了異步組件

1.這時(shí)在子組件的鉤子里就能拿到父組件props傳過來的值了,頁面需要?jiǎng)討B(tài)更新的參數(shù),computed動(dòng)態(tài)去計(jì)算(不推薦watch)
2.watch監(jiān)聽也可以,我一開始是這么解決的,后來覺得1更好點(diǎn)。但是watch不能監(jiān)聽數(shù)組里面某個(gè)值得變化,需要配合js的splic,push等改變數(shù)組操作使用

以上是個(gè)人對此的一個(gè)解決辦法

2017年7月11日 16:28