Vue3 echarts组件化及使用hook进行resize方式

 更新时间:2023年04月20日 09:11:32   作者:瞎跑的uice  
这篇文章主要介绍了Vue3 echarts组件化及使用hook进行resize方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

echarts组件化及使用hook进行resize

hook 本质是一个函数,把setup函数中使用的 Composition API 进行了封装

组件化echarts实例

<template>
  <div ref="echart" :style="{ height: height, width: width }"></div>
</template>

<script setup>
import * as echarts from "echarts";
import useResize from "@/hooks/useResize"; // hook 代码见下方

const { proxy } = getCurrentInstance(); // 获取实例中的proxy

let echart;
let echartInstance;

const props = defineProps({
  // 数据
  data: {
    type: Array,
    default: [
      { value: 40, name: "rose 1" },
      { value: 38, name: "rose 2" },
      { value: 32, name: "rose 3" },
    ],
  },
  // 高度
  height: {
    type: [Number, String],
    default: "300px",
  },
  // 宽度
  width: {
    type: [Number, String],
    default: "100%",
  },
});

const { data } = toRefs(props);

const data1 = reactive({
  option: {
    legend: {
      top: "bottom",
    },
    toolbox: {
      show: false,
      feature: {
        mark: { show: true },
        dataView: { show: true, readOnly: false },
        restore: { show: true },
        saveAsImage: { show: true },
      },
    },
    tooltip: {
      trigger: "item",
      formatter: "{b} : {c} ({d}%)",
    },
    series: [
      {
        name: "Nightingale Chart",
        type: "pie",
        radius: [10, 120],
        center: ["50%", "45%"],
        roseType: "area",
        itemStyle: {
          borderRadius: 8,
        },
        data: data.value,
      },
    ],
  },
});

const { option } = toRefs(data1);

// 观察 data ,重新绘制
watch(
  data,
  (newValue) => {
    option.value.series[0].data = newValue;
  },
  { deep: true }
);
watch(
  option,
  (newValue) => {
    echartInstance.setOption(newValue, true);
  },
  { deep: true }
);

onMounted(() => {
  echart = proxy.$refs.echart; // 获取的DOM根节点
  echartInstance = echarts.init(echart, "macarons"); // 初始化 echart
  echartInstance.setOption(option.value, true); // 绘制
  // notMerge 可选。是否不跟之前设置的 option 进行合并。默认为 false。即表示合并。合并的规则,详见 组件合并模式。如果为 true,表示所有组件都会被删除,然后根据新 option 创建所有新组件。
  // setOption 见 https://echarts.apache.org/zh/api.html#echartsInstance.setOption
});

function resize() {
  echartInstance.resize();
}

// 暴露函数 (供hook调用)
defineExpose({
  resize,
});

useResize();
</script>

hook (useResize)

export default function () {
    let proxy

    onMounted(() => {
        proxy = getCurrentInstance(); // 获取实例中的proxy
        window.addEventListener('resize', resize)
    })

    onBeforeUnmount(() => {
        window.removeEventListener('resize', resize)
    })

    function resize() {
        proxy.exposed.resize()
    }
}

使用echarts和echarts自适应

首先安装echarts,这个就不介绍了,直接说怎么使用.

<!-- 创建一个div去显示echarts -->
<div ref="main" style="height: 300px"></div>
import {ref, provide, inject, onMounted, reactive} from "vue";
import * as echarts from "echarts";
const main = ref() // 使用ref创建虚拟DOM引用,使用时用main.value
onMounted(
    () => {
        init()
    }
)
function init() {
    // 基于准备好的dom,初始化echarts实例
    var myChart = echarts.init(main.value);
    // 指定图表的配置项和数据
    var option = {
        /*title: {
            text: 'ECharts 入门示例'
        },*/
        tooltip: {},
        // color:['#779ffe','#a07dfe','#fc9b2e','#63f949','#fb6464','#fce481'],
        /*grid: {
            left: '30%',
            right: '4%',
            bottom: '3%',
            containLabel: true
        },*/
        legend: {
            // data: ['国家类型','非国家类型','个人','法人','可公式','非公式']
        },
        xAxis: {
            type: 'category',
            data: ['国家类型','非国家类型','个人','法人','可公式','非公式']
        },
        yAxis: {
            type: 'value',
            scale: true,
            max: 150,
            min: 0,
            splitNumber: 3,
        },
        series: [
            {
                data: [
                    {
                        value: 120,
                        itemStyle: {
                            color: '#7fa6fe'
                        }
                    },
                    {
                        value: 90,
                        itemStyle: {
                            color: '#a17fff'
                        }
                    },
                    {
                        value: 40,
                        itemStyle: {
                            color: '#fda630'
                        }
                    },
                    {
                        value: 120,
                        itemStyle: {
                            color: '#93fc73'
                        }
                    },
                    {
                        value: 120,
                        itemStyle: {
                            color: '#fb6666'
                        }
                    },
                    {
                        value: 120,
                        itemStyle: {
                            color: '#fbe068'
                        }
                    }
                ],
                type: 'bar'
            }
        ]
    };
    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue3 Vite 进阶rollup命令行使用详解

    vue3 Vite 进阶rollup命令行使用详解

    这篇文章主要介绍了vue3 Vite 进阶rollup命令行使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • vue3中toRef、toRefs和toRaw的使用

    vue3中toRef、toRefs和toRaw的使用

    本文主要介绍了vue3中toRef、toRefs和toRaw的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • vue3+js+elementPlus使用富文本编辑器@vueup/vue-quill详细教程

    vue3+js+elementPlus使用富文本编辑器@vueup/vue-quill详细教程

    富文本编辑器在任何项目中都会用到,下面这篇文章主要给大家介绍了关于vue3+js+elementPlus使用富文本编辑器@vueup/vue-quill的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • 深入理解vue中的 slot-scope=“scope“

    深入理解vue中的 slot-scope=“scope“

    这篇文章主要介绍了理解vue中的 slot-scope=“scope“,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Vue3的组合式API中使用ref()函数的例子

    Vue3的组合式API中使用ref()函数的例子

    你们是否听说过Vue3的组合式API?它可是Vue3的新玩法,把以前的Vue2组件函数转化为了函数组件。好了,今天我要和大家分享的是如何在组合式API中使用ref()函数,感兴趣的朋友跟随小编一起看看吧
    2023-06-06
  • vue2中watch的用法(通俗易懂,简单明了)

    vue2中watch的用法(通俗易懂,简单明了)

    这篇文章主要给大家介绍了关于vue2中watch用法的相关资料,通过watch监听器,我们可以实时监控数据的变化,并且在数据发生改变时进行相应的操作,需要的朋友可以参考下
    2023-09-09
  • vue不通过路由直接获取url中参数的方法示例

    vue不通过路由直接获取url中参数的方法示例

    通过url传递参数是我们在开发中经常用到的一种传参方法,但通过url传递后改如果获取呢?下面这篇文章主要给大家介绍了关于vue如何不通过路由直接获取url中参数的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • vue项目如何去掉URL中#符号的方法

    vue项目如何去掉URL中#符号的方法

    在开发过程中发现路径中带有/#/的标示,而且还去不掉,很丑陋,下面这篇文章主要给大家介绍了vue项目如何去掉URL中#符号的相关资料,文中通过实例代码的非常详细,需要的朋友可以参考下
    2022-07-07
  • Vue自定义指令的使用详细介绍

    Vue自定义指令的使用详细介绍

    我们看到的v-开头的行内属性,都是指令,不同的指令可以完成或实现不同的功能,对普通 DOM元素进行底层操作,这时候就会用到自定义指令。除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令
    2022-09-09
  • Vue项目报错:Uncaught SyntaxError: Unexpected token '<'的解决方法

    Vue项目报错:Uncaught SyntaxError: Unexpected token '<&a

    最近在做vue项目时,需要引入一个第三方的js文件,在index.html中通过以下方式引入JS文件编译后就报了这个问题,这篇文章主要给大家介绍了关于Vue项目报错:Uncaught SyntaxError: Unexpected token '<'的解决方法,需要的朋友可以参考下
    2022-08-08

最新评论