vue的mounted和created方法的执行

21 篇文章 0 订阅
3 篇文章 0 订阅

Vue的created 和 mouted的执行顺序

今天在数据可视化的项目中,用了echarts和vue来进行展示。按照我的理解,先执行created中调用后台数据的接口,然后再进行echarts的展现。很遗憾一直失败,而且每次打印都有数据,但是始终无法给echarts绑定。

<template>
    <div class="map">
        <dv-border-box-8 class="map-chart-border">
            <div ref="mapChart" class="map-chart"></div>
        </dv-border-box-8>

    </div>
</template>
<script>
    //引入geo数据
    //
    import mapApi from '@/api/chinaMap'
    import mapData from "@/lib/china";

    export default {
        data() {
            return {
                mapData: [],
                currentData: [
                ],
                statisticData: []
            }
        },
        created() {
            this.getMapData();
        },
        methods: {
            initMapChart() {
                console.log(this.currentData)
                const el = this.$refs.mapChart;
                const myChart = this.$echarts.init(el);
                this.$echarts.registerMap("chinaMap", mapData);

                const option = {
                    title: {
                        text: '地图可视化',
                        left: '45%',
                        textStyle: {
                            fontSize: 20,
                            color: "#fff"
                        },
                    },
                    tooltip: {
                        trigger: 'item'
                    },
                    visualMap: {
                        min: 0,
                        max: 100,
                        text: ['High', 'Low'],
                        realtime: false,
                        calculable: true,
                        inRange: {
                            color: ['lightskyblue', 'yellow', 'orangered']
                        },
                        textStyle: {
                            color: "#fff",
                            fontSize: 18
                        },
                        left: '5%'
                    },
                    series: [
                        {
                            name: '全国疫情热力图',
                            type: 'map',
                            map: 'chinaMap',
                            label: {
                                show: false
                            },
                            zoom: 1.4,
                            data: this.currentData,
                            layoutCenter: ['50%', '70%'],
                            layoutSize: 400
                        }
                    ]
                }
                myChart.setOption(option);
                window.addEventListener("resize", function () {
                    myChart.resize();
                });
            },
            getMapData() {
                mapApi.getMapData()
                    .then(response => {
                        //刷新页面
                        this.mapData = response.data.data.mapData
                        for (let i = 0; i < this.mapData.length; i++) {

                            this.currentData.push({
                                name: this.mapData[i].name,
                                value: this.mapData[i].currentConfirmedCount
                            })
                            this.statisticData.push({
                                name: this.mapData[i].name,
                                value: this.mapData[i].confirmedCount
                            })
                        }
                    })
            },
        },
        mounted() {
            this.initMapChart();

        },
    };
</script>

<style lang="less" scoped>
    .map {
        width: 60%;
        height: 100%; //要给指定高度,这里我在组件外加了固定高度,所以这里给了100%
        .map-chart-border {
            width: 100%;
            height: 100%;
        }

        .map-chart {
            width: 100%;
            height: 100%;
            padding: 10px;
        }
    }
</style>

经过半天的探索发现其实created和mounted没有严格的执行顺序,因为异步执行两段代码。
最后附上正确代码

<template>
    <div class="map">
        <dv-border-box-8 class="map-chart-border">
            <div ref="mapChart" class="map-chart"></div>
        </dv-border-box-8>

    </div>
</template>
<script>
    //引入geo数据
    //
    import mapApi from '@/api/chinaMap'
    import mapData from "@/lib/china";

    export default {
        data() {
            return {
                mapData: [],
                currentData: [
                ],
                statisticData: []
            }
        },
        created() {
            this.getMapData();
        },
        methods: {
            initMapChart() {
                console.log(this.currentData)
                const el = this.$refs.mapChart;
                const myChart = this.$echarts.init(el);
                this.$echarts.registerMap("chinaMap", mapData);

                const option = {
                    title: {
                        text: '地图可视化',
                        left: '45%',
                        textStyle: {
                            fontSize: 20,
                            color: "#fff"
                        },
                    },
                    tooltip: {
                        trigger: 'item'
                    },
                    visualMap: {
                        min: 0,
                        max: 100,
                        text: ['High', 'Low'],
                        realtime: false,
                        calculable: true,
                        inRange: {
                            color: ['lightskyblue', 'yellow', 'orangered']
                        },
                        textStyle: {
                            color: "#fff",
                            fontSize: 18
                        },
                        left: '5%'
                    },
                    series: [
                        {
                            name: '全国疫情热力图',
                            type: 'map',
                            map: 'chinaMap',
                            label: {
                                show: false
                            },
                            zoom: 1.4,
                            data: this.currentData,
                            layoutCenter: ['50%', '70%'],
                            layoutSize: 400
                        }
                    ]
                }
                myChart.setOption(option);
                window.addEventListener("resize", function () {
                    myChart.resize();
                });
            },
            getMapData() {
                mapApi.getMapData()
                    .then(response => {
                        //刷新页面
                        this.mapData = response.data.data.mapData
                        for (let i = 0; i < this.mapData.length; i++) {

                            this.currentData.push({
                                name: this.mapData[i].name,
                                value: this.mapData[i].currentConfirmedCount
                            })
                            this.statisticData.push({
                                name: this.mapData[i].name,
                                value: this.mapData[i].confirmedCount
                            })
                        }
                        this.initMapChart();
                    })
            },
        },
        mounted() {
        },
    };
</script>

<style lang="less" scoped>
    .map {
        width: 60%;
        height: 100%; //要给指定高度,这里我在组件外加了固定高度,所以这里给了100%
        .map-chart-border {
            width: 100%;
            height: 100%;
        }

        .map-chart {
            width: 100%;
            height: 100%;
            padding: 10px;
        }
    }
</style>

效果如下:在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue中的created和mounted是两个生命周期钩子函数,它们的区别如下: 1. created钩子函数在实例被创建之后立即调用,此时组件的数据观测和事件机制都已经初始化完成,但是DOM元素还没有被挂载到页面上。在created钩子函数中可以进行一些数据的初始化操作,但是无法访问到DOM元素。 2. mounted钩子函数在组件挂载到页面之后调用,此时组件的DOM元素已经被渲染到页面上,可以进行一些DOM操作或者调用第三方库。在mounted钩子函数中可以访问到DOM元素,但是此时组件可能还没有被完全渲染完成,因此需要注意一些异步操作的问题。 总之,created钩子函数适合进行一些数据的初始化操作,而mounted钩子函数适合进行一些DOM操作或者调用第三方库。 ### 回答2: Vue.js是一款非常流行的前端框架,它为我们提供了很多方便的API来简化开发过程。其中,Vue组件的生命周期函数中,mountedcreated是两个很重要的方法,下面我将为你详细介绍它们的区别。 首先说created,这个方法是在组件实例被创建之后,执行一些初始的工作,比如创建数据监测器、初始化一些数据等。此时,组件并没有被渲染到页面上,因此我们无法获取到DOM元素。 而mounted则是在组件被挂载到页面上之后,执行一些需要访问DOM元素的操作,比如设置一些计时器、绑定事件监听器等。此时,组件已经被渲染到页面上,我们可以访问DOM元素进行一些具体的操作。 总的来说,created方法主要是在实例化的时候进行一些预处理,而mounted方法则是进行一些需要DOM元素的操作。如果需要在组件刚创建时进行一些初始化,比如构建数据监控等操作,那么就使用created方法;如果需要在组件挂载到页面上之后进行一些其他的操作,比如绑定事件、设置计时器等,那么就使用mounted方法。 总的来说,Vue组件的生命周期函数可以帮助我们更好地控制组件的渲染和操作过程,我们需要根据实际需要,选择合适的生命周期函数来实现我们的需求。同时,我们也需要注意,生命周期函数的执行顺序是有一定规律的,因此需要仔细地阅读文档,了解各个生命周期函数的用途和作用。 ### 回答3: Vue是一种流行的前端框架,它采用了MVVM(Model-View-ViewModel)架构模式,为开发人员提供了简单易用的界面数据绑定和状态管理工具。Vue中的两个重要钩子函数之一是created和mounted,它们都在Vue实例被创建时被调用,但它们的执行时机和用途略有不同。 首先,created钩子函数是在Vue实例被创建后立即调用的。它是在实例化Vue对象、构造DOM的创建阶段完成后执行的,但在挂载阶段之前执行的。一般来说,我们可以在这个钩子里完成一些初始化操作,例如在组件创建时发送Ajax请求进行数据获取。 其次,mounted钩子函数是在Vue实例的挂载阶段被调用的,这时Vue实例已经完成了渲染并挂载到了DOM树上。它是在Vue实例的生命周期中最后一个被执行的钩子函数。在这个钩子函数里,我们可以完成一些依赖于DOM的操作,例如使用第三方插件、绑定事件、进行DOM操作等。 综上所述,created和mounted钩子函数相同之处在于它们都在Vue实例创建时被调用,但不同之处在于它们的执行时机和用途。Created钩子函数主要用于初始化,而mounted钩子函数则主要用于操作DOM。因此,在实际开发中,需要根据具体情况选用适当的钩子函数以达到更好的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值