vue+echarts,终于明白了vue的一些组件的事儿

  • 需求:

一个页面内,分页显示多个统计图表,要求用vue的组件,来进行绘制图表

  • 难题:

一是我们用的是jquery+html5+js+echarts+vue,就是直接页面引用vue.min.js的方式,一开始以为会不行,但是最后发现结果是可以的hiahiahia~。

二是我们统计图的重绘很奇怪,因为涉及到父子组件的数据变化,然后例如说,一般流程是这样的:打开页面,加载父组件,父组件调用ajax请求查询的分页结果数据,然后对页面的子组件进行绘制,传递对应的数据到子组件进行自行绘统计图。但是点击分页的查询时,发现实际上数据变化了,但是图表并没有重新绘制。后来才知道是子组件(统计图组件)里面需要加上watch的方法去监测数据变化后触发重绘的动作。

 

 

  • 贴代码

【html的页面代码】

    1、引入vue

	<script src="/plugins/vue.js"></script>

    2、父子组件嵌套

<div class="div-main" id="wrapper">
    <linechart v-for="(arrayItem, index) in wrapperVueArray"
									   :key="arrayItem.id"
									   :propoption="arrayItem.option"
									   :propitemid="arrayItem.id" >
						</linechart>
</div>

 

【父组件代码】

/*
 * 父组件代码
 */
var wrapperVue = new Vue({
    el: "#wrapper",
    data: {
        model: {
            total: "", //总数量
            size: "3", //每页显示条目个数不传默认20
            page: "1", //当前页码
        },
        wrapperVueArray: [],
    },
    created: function () {
        var self = this;
        self.getList();
    },
    methods: {
        //页码切换执行方法
        pageFn: function (val) {
            this.model.page = val;
        },
        //搜索
        goSearch: function () {
            var self = this;
            self.model.page = 1;
            self.getList();
        },
        getList: function () {
            var self = this;
            var queryUrl = '...';//ajax的Url
            var queryData = {
                //...ajax的post参数
            };
            var queryObj = JSON.stringify(queryData);
            ComPageOpt.util.queryAjax(queryUrl, queryObj, '', '', '', '', function (data) {
                self.wrapperVueArray = data.data;//设置图表绘制的数据数组(data是符合echart对应的option参数的结构)
                self.model.total = data.data.total_size;//分页组件的总条数,分页组件自动分页
            });
        }
    }
})

【子组件代码】

/**
 *子组件代码
*/
Vue.component('linechart', {
    data() {
        return {//子组件内部数据
            itemid: this.propitemid,
            option: this.propoption,
            mychart : null
        }
    },
    props: {//子组件可以被页面html的dom元素暴露出来的属性
        propitemid: String,
        propoption: {//因为这个propoption是图表的数据,所以必须是Object类型
            type: Object,
            default(){
                return {};
            }
        }
    },
    watch:{//用于监测子组件暴露的属性值变化所触发的动作
        propoption:{
            handler(newValue){
                this.option = newValue;
                this.redrawChart();
            }
        }
    },
    //组件template的内容
    template: '<div class="echarts" v-bind:id="itemid"></div>',
    mounted: function () {
        this.drawLineGraph();
    },
    methods: {
        //图表绘制
        drawLineGraph() {
            //# 1. 获取一个用于挂在 echarts 的 DOM 元素
            let $echartsDOM = document.getElementById(this.itemid);//此处用组件内部的属性数据
            //# 2. 初始化
            if(this.mychart==null){
                let myEcharts = echarts.init($echartsDOM);
                this.mychart = myEcharts;
            }
            //# 3. 设置配置项
            let option = this.option;//此处用组件内部的属性数据
            //# 4. 为 echarts 指定配置
            this.mychart.setOption(option);
        },
        redrawChart(){
            this.drawLineGraph();
        }
    }
});

 

亲测可用,大家可以试试哈哈哈~

ε≡٩(๑>₃<)۶ 一心向学

(๑╹ヮ╹๑)ノ Studying makes me happy

转载于:https://my.oschina.net/lanhui/blog/1863048

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值