vue中使用echarts并根据选择条件动态展示echarts图表

 更新时间:2023年12月19日 11:20:23   作者:m0_62317155  
虽然老早就看过很多echarts的例子, 但自己接触的项目中一直都没有真正用到过,直到最近才开始真正使用,下面这篇文章主要给大家介绍了关于vue中使用echarts并根据选择条件动态展示echarts图表的相关资料,需要的朋友可以参考下

前言

以前在使用echarts的时候,想要根据选择条件让echarts的图片也跟着变化,我经常是放在vue的watch中监听数据的变化来实现的。但是这里我发现了一个更加简单的方法,不需要在vue的watch中监听数据也可以实现,具体代码和运行结果如下所示

echarts官网示例

Examples - Apache ECharts

1、在vue中使用echarts图表,官网示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- vue在线引入 -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <!-- 在线引入echarts -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.1/echarts.min.js"></script>
</head>

<body>
    <div id="app">
        <div id="main" style="width: 500px; height: 400px;"></div>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                myChart: null
            },
            methods: {
                // 初始化echarts
                initEcharts() {
                    var chartDom = document.getElementById('main');
                    // 将创建的echarts示例放到vue的data中,这样在这个界面就想到于全局配置了
                    this.myChart = echarts.init(chartDom);
                },
                // 配置echarts的option,展示数据图表
                setEchartsOption() {
                    // 这里可以发送axios请求,然后通过响应的数据赋值给对应的x轴和y轴即可,由于这里没有于后端联调,所以简单请求判断一下,
                    // 请求后端大概也是这个过程
                    var option;

                    option = {
                        tooltip: {
                            trigger: 'axis',
                            axisPointer: {
                                type: 'shadow'
                            }
                        },
                        grid: {
                            left: '3%',
                            right: '4%',
                            bottom: '3%',
                            containLabel: true
                        },
                        xAxis: [
                            {
                                type: 'category',
                                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                                axisTick: {
                                    alignWithLabel: true
                                }
                            }
                        ],
                        yAxis: [
                            {
                                type: 'value'
                            }
                        ],
                        series: [
                            {
                                name: 'Direct',
                                type: 'bar',
                                barWidth: '60%',
                                data: [10, 52, 200, 334, 390, 330, 220]
                            }
                        ]
                    };

                    option && this.myChart.setOption(option);
                },
            },
            mounted() {
                // 注意调用顺序,先初始化echarts才给echarts赋值
                this.initEcharts()
                this.setEchartsOption()
            }
        })
    </script>
</body>

</html>

2、根据条件选择展示echarts图表,这里没有发送axios请求

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- vue在线引入 -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <!-- 在线引入echarts -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.1/echarts.min.js"></script>
</head>

<body>
    <div id="app">
        <el-row>
            <el-select v-model="value" filterable placeholder="请选择" @change="setEchartsOption">
                <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
                </el-option>
            </el-select>
            <el-button type="primary" @click="searchButton">查询</el-button>
        </el-row>
        <el-row>
            <div id="main" style="width: 500px; height: 400px;"></div>
        </el-row>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                myChart: null,
                options: [{
                    value: '星期六',
                    label: '星期六'
                }, {
                    value: '星期日',
                    label: '星期日'
                }],
                value: '星期六',

                zhouliu: {
                    xValue: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                    yValue: [10, 52, 200, 334, 390, 330, 220]
                },
                zhouri: {
                    xValue: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                    yValue: [50, 80, 40, 99, 300, 88, 160]
                }

            },
            methods: {
                // 初始化echarts
                initEcharts() {
                    var chartDom = document.getElementById('main');
                    // 将创建的echarts示例放到vue的data中,这样在这个界面就想到于全局配置了
                    this.myChart = echarts.init(chartDom);
                },
                // 配置echarts的option,展示数据图表
                setEchartsOption() {
                    // 这里可以发送axios请求,然后通过响应的数据赋值给对应的x轴和y轴即可,由于这里没有于后端联调,所以简单请求判断一下,
                    // 请求后端大概也是这个过程
                    var xValue = null;
                    var yValue = null;
                    if (this.value === '星期六') {
                        xValue = this.zhouliu.xValue
                        yValue = this.zhouliu.yValue
                    } else if (this.value === '星期日') {
                        xValue = this.zhouri.xValue
                        yValue = this.zhouri.yValue
                    }
                    var option;
                    option = {
                        tooltip: {
                            trigger: 'axis',
                            axisPointer: {
                                type: 'shadow'
                            }
                        },
                        grid: {
                            left: '3%',
                            right: '4%',
                            bottom: '3%',
                            containLabel: true
                        },
                        xAxis: [
                            {
                                type: 'category',
                                data: xValue,
                                axisTick: {
                                    alignWithLabel: true
                                }
                            }
                        ],
                        yAxis: [
                            {
                                type: 'value'
                            }
                        ],
                        series: [
                            {
                                name: 'Direct',
                                type: 'bar',
                                barWidth: '60%',
                                data: yValue
                            }
                        ]
                    };

                    option && this.myChart.setOption(option);
                },
                searchButton() {
                    // 为了避免重复初始化echarts, 我们在点击按钮的时候可以调用echarts的clear方法清楚一下,然后再重新调用函数进行对echarts的赋值
                    this.myChart.clear() // 这一句有没有都可以
                    this.setEchartsOption()
                }
            },
            mounted() {
                // 注意调用顺序,先初始化echarts才给echarts赋值
                this.initEcharts()
                this.setEchartsOption()
            }
        })
    </script>
</body>

</html>

3、结合使用axios请求展示图表

mysql数据库数据数据如下所示

后端返回的数据格式

可以根据传入的时间获得需要的数据

{
    "code": 200,
    "message": "查询成功!",
    "data": [
        {
            "id": 1,
            "count": 24,
            "createTime": "2023-02-15T14:17:50"
        },
        {
            "id": 2,
            "count": 32,
            "createTime": "2023-02-16T14:18:19"
        },
        {
            "id": 3,
            "count": 40,
            "createTime": "2023-02-17T14:18:30"
        },
        {
            "id": 4,
            "count": 16,
            "createTime": "2023-02-18T14:18:44"
        },
        {
            "id": 5,
            "count": 88,
            "createTime": "2023-02-19T14:18:59"
        },
        {
            "id": 6,
            "count": 8,
            "createTime": "2023-02-20T14:19:11"
        },
        {
            "id": 7,
            "count": 160,
            "createTime": "2023-02-21T14:19:27"
        },
        {
            "id": 8,
            "count": 108,
            "createTime": "2023-02-22T14:19:38"
        }
    ]
}

前端代码

vue+elementUI

可以直接复制使用

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- vue在线引入 -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <!-- 在线引入echarts -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.1/echarts.min.js"></script>
    <!-- axios -->
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>

<body>
    <div id="app">
        <el-row>
            <el-date-picker v-model="value1" type="datetimerange" start-placeholder="开始日期" end-placeholder="结束日期"
                value-format="yyyy-MM-dd HH:mm:ss" :default-time="['00:00:00']">
            </el-date-picker>
            <el-button type="primary" @click="searchButton">查询</el-button>
        </el-row>
        <el-row>
            <div id="main" style="width: 500px; height: 400px;"></div>
        </el-row>
    </div>
    <script>
        var app = new Vue({
            el: '#app',
            data: {
                myChart: null,
                value1: [
                    '2023-02-15 14:17:50',
                    '2023-02-22 14:19:38'
                ],
            },
            methods: {
                // 初始化echarts
                initEcharts() {
                    var chartDom = document.getElementById('main');
                    // 将创建的echarts示例放到vue的data中,这样在这个界面就想到于全局配置了
                    this.myChart = echarts.init(chartDom);
                },
                // 配置echarts的option,展示数据图表
                async setEchartsOption() {
                    // 这里可以发送axios请求,然后通过响应的数据赋值给对应的x轴和y轴即可,由于这里没有于后端联调,所以简单请求判断一下,
                    const result = await axios.get(`http://localhost:8080/echarts/getechartslistbytime?startTime=${this.value1[0]}&endTime=${this.value1[1]}`)
                    console.log(result.data.data)
                    var xValue = null;
                    var yValue = null;
                    if (result.data.data) {
                        xValue = result.data.data.map(item => {
                            return item.createTime.split('T')[0]
                        })
                        yValue = result.data.data.map(item => {
                            return item.count
                        })
                    }
                    var option;
                    option = {
                        tooltip: {
                            trigger: 'axis',
                            axisPointer: {
                                type: 'shadow'
                            }
                        },
                        grid: {
                            left: '3%',
                            right: '4%',
                            bottom: '3%',
                            containLabel: true
                        },
                        xAxis: [
                            {
                                type: 'category',
                                data: xValue,
                                axisTick: {
                                    alignWithLabel: true
                                }
                            }
                        ],
                        yAxis: [
                            {
                                type: 'value'
                            }
                        ],
                        series: [
                            {
                                name: '数量',
                                type: 'bar',
                                barWidth: '60%',
                                data: yValue
                            }
                        ]
                    };

                    option && this.myChart.setOption(option);
                },
                searchButton() {
                    // 为了避免重复初始化echarts, 我们在点击按钮的时候可以调用echarts的clear方法清楚一下,然后再重新调用函数进行对echarts的赋值
                    this.myChart.clear() // 这一句有没有都可以
                    this.setEchartsOption()
                }
            },
            mounted() {
                // 注意调用顺序,先初始化echarts才给echarts赋值
                this.initEcharts()
                this.setEchartsOption()
            }
        })
    </script>
</body>

</html>

其实这里也可以用折线图,过程都差不多的

后端代码

springboot+mysql+mybatis-plus,刚好这里有springboot结合mybatis-plus的用法

后端代码各个文件的位置截图如下

mysql数据库建表语句和插入数据语句

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for echarts
-- ----------------------------
DROP TABLE IF EXISTS `echarts`;
CREATE TABLE `echarts`  (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `count` int NULL DEFAULT NULL COMMENT '统计数量',
  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of echarts
-- ----------------------------
INSERT INTO `echarts` VALUES (1, 24, '2023-02-15 14:17:50');
INSERT INTO `echarts` VALUES (2, 32, '2023-02-16 14:18:19');
INSERT INTO `echarts` VALUES (3, 40, '2023-02-17 14:18:30');
INSERT INTO `echarts` VALUES (4, 16, '2023-02-18 14:18:44');
INSERT INTO `echarts` VALUES (5, 88, '2023-02-19 14:18:59');
INSERT INTO `echarts` VALUES (6, 8, '2023-02-20 14:19:11');
INSERT INTO `echarts` VALUES (7, 160, '2023-02-21 14:19:27');
INSERT INTO `echarts` VALUES (8, 108, '2023-02-22 14:19:38');

SET FOREIGN_KEY_CHECKS = 1;

application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/echarts-demo?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: root

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

启动器类

@SpringBootApplication
@MapperScan("com.example.dao")
public class EchartsDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(EchartsDemoApplication.class, args);
    }

}

Controller

@RestController
@RequestMapping("echarts")
@CrossOrigin // 允许跨域
public class EchartsController{
    /**
     * 服务对象
     */
    @Autowired
    private EchartsService echartsService;

    @GetMapping("/getechartslistbytime")
    public R getEchartsListByTime(String startTime, String endTime) {
        return echartsService.getEchartsListByTime(startTime,endTime);
    }
}

dao或者mapper

public interface EchartsDao extends BaseMapper<Echarts> {
}

实体类,这里包括统一响应格式的R对象

Echarts类

public class Echarts {
    //主键id
    private Integer id;
    //统计数量
    private Integer count;
    //创建时间
    private LocalDateTime createTime;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    public LocalDateTime getCreateTime() {
        return createTime;
    }

    public void setCreateTime(LocalDateTime createTime) {
        this.createTime = createTime;
    }
}

R对象

package com.example.domain;

public class R {
    private Integer code;
    private String message;
    private Object data;

    public R(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public R(Integer code, String message, Object data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

Service接口

public interface EchartsService extends IService<Echarts> {

    R getEchartsListByTime(String startTime, String endTime);
}

ServiceImpl实现类

@Service("echartsService")
public class EchartsServiceImpl extends ServiceImpl<EchartsDao, Echarts> implements EchartsService {

    @Override
    public R getEchartsListByTime(String startTime, String endTime) {
        LambdaQueryWrapper<Echarts> queryWrapper = new LambdaQueryWrapper<>();
        // ge 是>=
        queryWrapper.ge((startTime != null && startTime.length() > 0), Echarts::getCreateTime, startTime);
        queryWrapper.le((endTime != null && endTime.length() > 0), Echarts::getCreateTime, endTime);
        // 这里就相当于SELECT id,count,create_time FROM echarts WHERE (create_time >= ? AND create_time <= ?)
        List<Echarts> list = this.list(queryWrapper);
        return new R(200, "查询成功!", list);
    }
}

总结 

到此这篇关于vue中使用echarts并根据选择条件动态展示echarts图表的文章就介绍到这了,更多相关vue使用echarts图表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue中js实现点击复制文本到剪贴板的3种方案

    vue中js实现点击复制文本到剪贴板的3种方案

    今天遇到一个复制粘贴的需求,研究之后发现太简单了,这篇文章主要给大家介绍了关于vue中js实现点击复制文本到剪贴板的3种方案,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 在 Vue 中编写 SVG 图标组件的方法

    在 Vue 中编写 SVG 图标组件的方法

    这篇文章主要介绍了在 Vue 中编写 SVG 图标组件的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 前端axios取消请求总结详解

    前端axios取消请求总结详解

    这篇文章主要为大家介绍了前端axios取消请求总结示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 学习Vite的原理

    学习Vite的原理

    这篇文章主要介绍了Vite的原理,Vite是一个更轻、更快的web应用开发工具,面向现代浏览,Vite创建的项目是一个普通的Vue3应用,相比基于Vue-cli创建的应用少了很多配置文件和依赖,下面基于Vite相关资料内容,需要的朋友可以参考一下
    2022-02-02
  • Vue.js实现按钮的动态绑定效果及实现代码

    Vue.js实现按钮的动态绑定效果及实现代码

    本文通过实例代码给大家介绍了Vue.js实现按钮的动态绑定效果,代码简单易懂,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
    2017-08-08
  • vue中使用路由改浏览器标题和图标

    vue中使用路由改浏览器标题和图标

    这篇文章主要介绍了vue中使用路由改浏览器标题和图标,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 解决vue-element-admin安装依赖npm install报错问题

    解决vue-element-admin安装依赖npm install报错问题

    这篇文章主要介绍了解决vue-element-admin安装依赖npm install报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • vue中组件的3种使用方式详解

    vue中组件的3种使用方式详解

    这篇文章主要给大家介绍了关于vue中组件的3种使用方式,文中通过示例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • vue3+ts+vite+electron搭建桌面应用的过程

    vue3+ts+vite+electron搭建桌面应用的过程

    这篇文章主要介绍了vue3+ts+vite+electron搭建桌面应用的过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • 解决v-model双向绑定失效的问题

    解决v-model双向绑定失效的问题

    这篇文章主要介绍了解决v-model双向绑定失效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04

最新评论