Vue3?echarts組件化及使用hook進(jìn)行resize方式
echarts組件化及使用hook進(jìn)行resize
hook 本質(zhì)是一個(gè)函數(shù),把setup函數(shù)中使用的 Composition API 進(jìn)行了封裝

組件化echarts實(shí)例
<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(); // 獲取實(shí)例中的proxy
let echart;
let echartInstance;
const props = defineProps({
// 數(shù)據(jù)
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: " : {c} (wppm3vysvbp%)",
},
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根節(jié)點(diǎn)
echartInstance = echarts.init(echart, "macarons"); // 初始化 echart
echartInstance.setOption(option.value, true); // 繪制
// notMerge 可選。是否不跟之前設(shè)置的 option 進(jìn)行合并。默認(rèn)為 false。即表示合并。合并的規(guī)則,詳見 組件合并模式。如果為 true,表示所有組件都會(huì)被刪除,然后根據(jù)新 option 創(chuàng)建所有新組件。
// setOption 見 https://echarts.apache.org/zh/api.html#echartsInstance.setOption
});
function resize() {
echartInstance.resize();
}
// 暴露函數(shù) (供hook調(diào)用)
defineExpose({
resize,
});
useResize();
</script>
hook (useResize)
export default function () {
let proxy
onMounted(() => {
proxy = getCurrentInstance(); // 獲取實(shí)例中的proxy
window.addEventListener('resize', resize)
})
onBeforeUnmount(() => {
window.removeEventListener('resize', resize)
})
function resize() {
proxy.exposed.resize()
}
}
使用echarts和echarts自適應(yīng)
首先安裝echarts,這個(gè)就不介紹了,直接說(shuō)怎么使用.
<!-- 創(chuàng)建一個(gè)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創(chuàng)建虛擬DOM引用,使用時(shí)用main.value
onMounted(
() => {
init()
}
)
function init() {
// 基于準(zhǔn)備好的dom,初始化echarts實(shí)例
var myChart = echarts.init(main.value);
// 指定圖表的配置項(xiàng)和數(shù)據(jù)
var option = {
/*title: {
text: 'ECharts 入門示例'
},*/
tooltip: {},
// color:['#779ffe','#a07dfe','#fc9b2e','#63f949','#fb6464','#fce481'],
/*grid: {
left: '30%',
right: '4%',
bottom: '3%',
containLabel: true
},*/
legend: {
// data: ['國(guó)家類型','非國(guó)家類型','個(gè)人','法人','可公式','非公式']
},
xAxis: {
type: 'category',
data: ['國(guó)家類型','非國(guó)家類型','個(gè)人','法人','可公式','非公式']
},
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'
}
]
};
// 使用剛指定的配置項(xiàng)和數(shù)據(jù)顯示圖表。
myChart.setOption(option);
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue3 Vite 進(jìn)階rollup命令行使用詳解
這篇文章主要介紹了vue3 Vite 進(jìn)階rollup命令行使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
vue3+js+elementPlus使用富文本編輯器@vueup/vue-quill詳細(xì)教程
富文本編輯器在任何項(xiàng)目中都會(huì)用到,下面這篇文章主要給大家介紹了關(guān)于vue3+js+elementPlus使用富文本編輯器@vueup/vue-quill的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
vue2中watch的用法(通俗易懂,簡(jiǎn)單明了)
這篇文章主要給大家介紹了關(guān)于vue2中watch用法的相關(guān)資料,通過(guò)watch監(jiān)聽器,我們可以實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)的變化,并且在數(shù)據(jù)發(fā)生改變時(shí)進(jìn)行相應(yīng)的操作,需要的朋友可以參考下2023-09-09
vue不通過(guò)路由直接獲取url中參數(shù)的方法示例
通過(guò)url傳遞參數(shù)是我們?cè)陂_發(fā)中經(jīng)常用到的一種傳參方法,但通過(guò)url傳遞后改如果獲取呢?下面這篇文章主要給大家介紹了關(guān)于vue如何不通過(guò)路由直接獲取url中參數(shù)的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-08-08
vue項(xiàng)目如何去掉URL中#符號(hào)的方法
在開發(fā)過(guò)程中發(fā)現(xiàn)路徑中帶有/#/的標(biāo)示,而且還去不掉,很丑陋,下面這篇文章主要給大家介紹了vue項(xiàng)目如何去掉URL中#符號(hào)的相關(guān)資料,文中通過(guò)實(shí)例代碼的非常詳細(xì),需要的朋友可以參考下2022-07-07
Vue項(xiàng)目報(bào)錯(cuò):Uncaught?SyntaxError:?Unexpected?token?'<&a
最近在做vue項(xiàng)目時(shí),需要引入一個(gè)第三方的js文件,在index.html中通過(guò)以下方式引入JS文件編譯后就報(bào)了這個(gè)問(wèn)題,這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目報(bào)錯(cuò):Uncaught?SyntaxError:?Unexpected?token?'<'的解決方法,需要的朋友可以參考下2022-08-08

