vue里使用echarts 关于请求数据之后,父子组件传值,视图未更新问题

先上代码,代码段里面有解释,方便解决自己日后忘记及萌新入门之用

//这是父组件
<template>
<div>
 <echarts-pie
            //echarts-pie为引入注册的驼峰式命名
            ecname="总风险指数"  
            :ecnumber="Number(this.getIllnessByIdCardScore.sumRisk)">
            //ecname和:ecnumber为想要传递给echarts子组件的值
</echarts-pie>
</div>
</template>

<script>
import EchartsPie from "@/components/EchartsPie.vue";
//引入
</script>

export default {
components: {
    EchartsPie,
//注册echarts组件
  },
 data() {
    return {
   getIllnessByIdCardScore: {sumRisk:20},
//上文this.getIllnessByIdCardScore.risk实际为通过后端请求过来的赋值
 }
}

 

下文为子组件echarts,本文的用法仅限于vue

<template>
  <div ref="mychart" style="width: 384px; height: 389px">
  //此处为给echarts规定了画布的大小
  //如果一个页面有多个echarts建议使用此方法通过ref
</div>

</template>
 
<script>
export default {
  props: {
    ecname: {
      type: String,
      // 指定默认值
      default: "未传值",
    },
    ecnumber: {
      // 指定默认值
      default: 0,
    },
  },
  data() {
    return {
//此处的ff为下文画布函数中的data数据,通过定义在这里方便监听
      ff: [
        {
          value: this._props.ecnumber ? this._props.ecnumber : 0,
          name: this._props.ecname,
        },
        { value: 100, name: "" },
      ],
    };
  },

  mounted() {
    this.drawLine();
    // console.log(this);
    // console.log(this._props.eccolor)

    // console.log(this)
  },
//本次的是一个对比饼状图后端返回一个值,通过自定义函数计算出相对的值
  computed: {
    ecjian() {
//返回值为给对比值赋值
      return (this.ff[1].value = 100 - this._props.ecnumber);
    },
  },
//开始监听
//因为开启了深度监听所以需要在handler函数中
//handler函数为固定的萌新记住就好
  watch: {
//ecnumber是监听的对象
    ecnumber: {
      handler(newVal, oldVal) {//newVal为新传入数据,oldVal为当前数据或上一次
//此处给监听的对象加一个条件,防止空值进入
        if (newVal !== undefined) {
          this.ff[0].value = newVal;//当新值传入给echarts赋值
          this.ecjian;//执行上文的计数函数,因为计算函数不能赋值给data,所以要在这里执行,让计算属性里面的逻辑结构执行
          this.drawLine();//这是执行画布函数,结合上文的逻辑就是执行到这里让echarts重新绘制
        }
      },
      deep: true,//深度监听开启
    },
  },

  methods: {
    drawLine() {
      // 基于准备好的dom,初始化echarts实例
      let myChart = this.$echarts.init(this.$refs.mychart);//这里用初始化使用refs创建echarts与上文一样为了一个页面绘制多个echarts图表,此图为饼状图
      myChart.clear();//这里很重要,想要echarts再次绘制必须要有这个,作用是为了清空上一次的画布,如果不清空不能再次绘制而且会报错,真的很重要这里不能遗漏!!!!!!!!
      // 绘制图表
      myChart.setOption(
        {
          tooltip: {
            trigger: "item",
            show: false, // 关闭鼠标移上去后显示浮框信息
          },
          legend: {
            top: "0%",
            show: false,
            left: "center",
          },
          title: {
            // 图形标题(如果想要换行则使用ES6 `` 模板字符串)
            // 例如: `示例
            //   这里的文字会变为第二行(因为会保留格式)
            //  `
            text: this.ff[0].value,
            left: "center", //对齐方式居中
            top: "55%", //距离顶部
            textStyle: {
              //文字配置
              color: "#FF6C61", //文字颜色
              fontSize: 20, //字号
              align: "center", //对齐方式
            },
          },
          series: [
            {
              // name: "Access From",
              type: "pie",
              radius: ["40%", "70%"],
              avoidLabelOverlap: false,
              label: {
                // show: false,
                position: "center",
                fontSize: "20",
              },
              emphasis: {
                label: {
                  show: true,
                  // fontSize: "20",
                  fontWeight: "bold",
                },
              },
              labelLine: {
                show: false,
              },
              itemStyle: {
                //图形样式设置
                normal: {
                  //第一种,这种就是在已知有多少数据项的情况下定义
                  color: function (params) {
                    //自定义饼图各板块颜色
                    var ec1color = "#F86359";
                    var colorList = [ec1color, "#EEEEEE"];//这里两个颜色可以按照需求添加多个颜色,进行颜色的自定义,个人需求只有两个数据所以只放了两个颜色
                    return colorList[params.dataIndex];
                  },
                },
              },
              data: this.ff,//这里是上文data里面定义的数据
            },
          ],
        },
        true
      );
    },
  },
};
</script>

查询前效果图

查询后效果图

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue是一种流行的JavaScript框架,用于构建用户界面。在Vue中,父子组件之间传递数据是一种常见的需求。以下是一种常用的方法来实现父子组件之间的数据传递: 1. Props(属性):父组件可以通过props属性向子组件传递数据。在父组件中,通过在子组件标签上绑定属性的方式传递数据。在子组件中,可以通过props选项接收并使用这些数据。 父组件: ```html <template> <div> <child-component :message="parentMessage"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentMessage: 'Hello from parent component' }; } } </script> ``` 子组件: ```html <template> <div> <p>{{ message }}</p> </div> </template> <script> export default { props: ['message'] } </script> ``` 2. $emit(自定义事件):子组件可以通过$emit方法触发自定义事件,并将需要传递的数据作为参数传递给父组件。在父组件中,通过在子组件标签上监听自定义事件的方式接收数据。 父组件: ```html <template> <div> <child-component @child-event="handleChildEvent"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, methods: { handleChildEvent(data) { console.log(data); // 在这处理子组件传递的数据 } } } </script> ``` 子组件: ```html <template> <div> <button @click="emitEvent">触发事件</button> </div> </template> <script> export default { methods: { emitEvent() { this.$emit('child-event', 'Hello from child component'); // 触发自定义事件,并传递数据给父组件 } } } </script> ``` 以上是Vue中实现父子组件之间传递数据的两种常用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值