在vuejs中,封装了highchats的组件,子组件监听不到父组件传入对象的更改。

主要问题就是标题一样。


这是我highchats的封装,test 属性是我用来测试,监听的。

<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);
    }

    // 监听侧边栏的变化
    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>

以下是页面调用

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

我吧highchats 的整个配置对象,定义在了父组件的 data 中,第一次页面加载 的时候,能正常渲染。
但是当我通过方法改变 这个配置对象的 data 时,highchats 中监听不到,请各位指点一下。

在网上看了很多答案,都是创建图表后,拿到该图表的实例,然后通过调用highchats的函数进行更新图表,
而没有看到在组件中,通过监听让highchats 自己进行更新的,这样是不可行吗?

阅读 2.2k
1 个回答
  • 之前也遇到过类似的问题,父组件传给子组件,能渲染,但是在钩子里面却拿不到父组件传的值,导致无法动态更新。
  • 后来用了异步组件

1.这时在子组件的钩子里就能拿到父组件props传过来的值了,页面需要动态更新的参数,computed动态去计算(不推荐watch)
2.watch监听也可以,我一开始是这么解决的,后来觉得1更好点。但是watch不能监听数组里面某个值得变化,需要配合js的splic,push等改变数组操作使用

以上是个人对此的一个解决办法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题