vue中父组件向子组件echarts传值问题


本文摘自PHP中文网,作者jacklove,侵删。

记录echarts踩坑问题

问题:当父组件传值给子组件echarts时,发现子组件获取的props为空,刚开始以为是钩子函数放错了地方,后来发现从mounted和created都不行。当在父组件data定义传递的数据的时候子组件显示正常

原因:后来经过排查,此处省略N字,发现echarts是在渲染的时候就传递数据

解决方案:在父组件定义一个flag,当数据获得的之后再进行子组件的渲染

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

//父组件

   <p class="chart-wrapper">

    <pie-chart v-if="flag" :pie-data="piedata"></pie-chart>

  </p>  ...

  export default {

  name: 'device',

  data() {    return {

      flag:false,

      piedata:{},      ...

  },

  created(){

    this.init()

  },

 methods:{

   init(){  

       axios.get('/static/mock/status/pie.json').then(this.getInfoSucc)

   },

   getInfoSucc(res){

      res = res.data;       if(res.code ==0){

         const values = res.values; 

         this.piedata = values.piedata; 

         this.flag = true

       }

     }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

//子组件<template>

  <p :class="className" :style="{height:height,width:width}"></p></template><script>import echarts from 'echarts'require('echarts/theme/macarons') // echarts themeimport { debounce } from '@/utils'export default {

  props: {

    pieData: {

      type: Object

    },

    msg: {

      type:Number

    },

    className: {

      type: String,      default: 'chart'

    },

    width: {

      type: String,      default: '100%'

    },

    height: {

      type: String,      default: '300px'

    }

  },

  data() {    return {

      chart: null

    }

  },  // watch: {

  //   piedata: {

  //     deep: true,

  //     handler(val) {

  //       console.log(val)

  //       this.setOptions(val)

  //     }

  //   }

  // },

  mounted() {

    console.log("pieData:"+JSON.stringify(this.pieData))    this.initChart()    this.__resizeHanlder = debounce(() => {      if (this.chart) {        this.chart.resize()

      }

    }, 100)

    window.addEventListener('resize', this.__resizeHanlder)

  },

  beforeDestroy() {    if (!this.chart) {      return

    }

    window.removeEventListener('resize', this.__resizeHanlder)    this.chart.dispose()    this.chart = null

  },

  methods: {

    setOptions({ text, arrtype, arrdata } = {}) { 

      this.chart.setOption({

        title: {

          text: text

        },

        tooltip: {

          trigger: 'item',

          formatter: '{a} <br/>{b} : {c} ({d}%)'

        },

        legend: {

          left: 'center',

          bottom: '10',

          data: arrtype

        },

        calculable: true,

        series: [

          {

            name: '',

            type: 'pie',

            roseType: 'radius',

            radius: [15, 95],

            center: ['50%', '42%'],

            data: arrdata,

            animationEasing: 'cubicInOut',

            animationDuration: 2600

          }

        ]

      })

    },

    initChart() {      this.chart = echarts.init(this.$el, 'macarons')      this.setOptions(this.pieData);

    }

  }

}</script>

然后子组件就能正常显示了
这里写图片描述

阅读剩余部分

相关阅读 >>

Vuejs中methods和data属性的使用

如何在Vuejs中绑定html属性?

深入浅析Vuejs中的key值

关于vue使用验证器: veevalidate3

Vuejs适合做什么

Vuejs里利用index对第一项添加class的方法

vue中父组件向子组件echarts传值问题

更多相关阅读请进入《Vuejs》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...