<template> <div> <v-chart :option="options" style="height: 500px; width: 90%" ref="chart" @click="onChartClick" lazy ></v-chart> </div> </template> <script> import moment from "jalali-moment"; // import { use } from "echarts/core"; import { CandlestickChart, LineChart } from "echarts/charts"; import { LegendComponent, DataZoomComponent, TooltipComponent, GridComponent, } from "echarts/components"; import { CanvasRenderer } from "echarts/renderers"; use([ LegendComponent, DataZoomComponent, GridComponent, TooltipComponent, CandlestickChart, LineChart, CanvasRenderer, ]); /** * @vue-prop {Array} [dataChart=[]] - آرایهای از دادههای نمودار * * @vue-data {String} dates - تاریخها * @vue-data {String} modifiedData - دادههای اصلاح شده * @vue-data {Object} options - تنظیمات نمودار * @vue-data {Object} options.legend - تنظیمات نمایش لجند * @vue-data {Array} options.legend.data - دادههای لجند * @vue-data {String} options.legend.inactiveColor - رنگ غیرفعال لجند * @vue-data {Object} options.tooltip - تنظیمات نمایش ابزارک راهنما * @vue-data {String} options.tooltip.trigger - نوع راهاندازی ابزارک راهنما * @vue-data {Object} options.tooltip.axisPointer - تنظیمات نشانگر محور * @vue-data {Boolean} options.tooltip.axisPointer.animation - وضعیت انیمیشن نشانگر محور * @vue-data {String} options.tooltip.axisPointer.type - نوع نشانگر محور * @vue-data {Object} options.tooltip.axisPointer.lineStyle - سبک خط نشانگر محور * @vue-data {String} options.tooltip.axisPointer.lineStyle.color - رنگ خط نشانگر محور * @vue-data {Number} options.tooltip.axisPointer.lineStyle.width - عرض خط نشانگر محور * @vue-data {Number} options.tooltip.axisPointer.lineStyle.opacity - شفافیت خط نشانگر محور * @vue-data {Function} options.tooltip.formatter - تابع فرمتدهی ابزارک راهنما * @vue-data {Object} options.xAxis - تنظیمات محور افقی * @vue-data {String} options.xAxis.type - نوع محور افقی * @vue-data {Array} options.xAxis.data - دادههای محور افقی * @vue-data {Object} options.xAxis.axisLine - خط محور افقی * @vue-data {Object} options.xAxis.axisLine.lineStyle - سبک خط محور افقی * @vue-data {String} options.xAxis.axisLine.lineStyle.color - رنگ خط محور افقی * @vue-data {Object} options.yAxis - تنظیمات محور عمودی * @vue-data {Boolean} options.yAxis.scale - مقیاس محور عمودی * @vue-data {Array} options.yAxis.data - دادههای محور عمودی * @vue-data {Object} options.yAxis.axisLine - خط محور عمودی * @vue-data {Object} options.yAxis.axisLine.lineStyle - سبک خط محور عمودی * @vue-data {String} options.yAxis.axisLine.lineStyle.color - رنگ خط محور عمودی * @vue-data {Object} options.yAxis.splitLine - خطوط تقسیمکننده محور عمودی * @vue-data {Boolean} options.yAxis.splitLine.show - وضعیت نمایش خطوط تقسیمکننده محور عمودی * @vue-data {Object} options.grid - تنظیمات شبکه نمودار * @vue-data {Number} options.grid.bottom - موقعیت پایین شبکه نمودار * @vue-data {Object[]} options.dataZoom - تنظیمات بزرگنمایی داده * @vue-data {Object} options.dataZoom[0] - تنظیمات بزرگنمایی داده * @vue-data {Object} options.dataZoom[1] - تنظیمات داخلی بزرگنمایی داده * @vue-data {Object} options.series - تنظیمات سریهای نمودار * @vue-data {String} options.series[].type - نوع سری * @vue-data {String} options.series[].name - نام سری * @vue-data {Array} options.series[].data - دادههای سری * @vue-data {Boolean} options.series[].smooth - وضعیت نمایش نرم نمودار * @vue-data {Boolean} options.series[].showSymbol - وضعیت نمایش نماد * @vue-data {Object} options.series[].lineStyle - سبک خط سری * @vue-data {Number} options.series[].lineStyle.width - عرض خط سری * @vue-data {Object} options.series[].itemStyle - سبک آیتم سری * @vue-data {String} options.series[].itemStyle.color - رنگ آیتم سری */ export default { props: { dataChart: { default() { return []; }, type: Array, }, }, data() { return { dates: "", modifiedData: "", options: { legend: { data: ["داده"], inactiveColor: "#777", }, tooltip: { trigger: "axis", axisPointer: { animation: false, type: "cross", lineStyle: { color: "#376df4", width: 2, opacity: 1, }, }, formatter: function (params) { // console.log(params) var dataIndex = params[1].dataIndex; // دریافت ایندکس داده var value = params[1].value; // دریافت مقدار داده return "مقدار: " + value; // نمایش مقدار داده }, }, xAxis: { type: "category", data: "", axisLine: { lineStyle: { color: "#8392A5" } }, }, yAxis: { scale: true, data: "", axisLine: { lineStyle: { color: "#8392A5" } }, splitLine: { show: false }, }, grid: { bottom: 80, // width: "90%", // اندازه چارت }, dataZoom: [ { textStyle: { color: "#8392A5", }, handleIcon: "path://M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z", dataBackground: { areaStyle: { color: "#8392A5", }, lineStyle: { opacity: 0.8, color: "#8392A5", }, }, brushSelect: true, }, { type: "inside", }, ], series: [ { type: "candlestick", name: "Day", data: [], itemStyle: { color: "#FD1050", color0: "#0CF49B", borderColor: "#FD1050", borderColor0: "#0CF49B", }, }, { name: "داده ", type: "line", data: "", smooth: true, showSymbol: false, lineStyle: { width: 1, }, }, ], }, }; }, watch: { dataChart(navItem) { this.dataChartHandler(navItem); }, }, mounted() { moment.locale("fa"); this.dataChartHandler(this.dataChart); }, methods: { /** * پردازش دادههای نمودار و بهروزرسانی گزینههای نمودار. * * @param {Array} value - آرایهای از نقاط داده. هر نقطه داده باید شامل یک تاریخ و یک مقدار عددی باشد. */ dataChartHandler(value) { this.dates = value.map(function (item) { try { if (item[0] < 0) { let stringifiedItem = String(item[0]).length; if (stringifiedItem <= 11) return moment(item[0] * 1000).format("dddd jDD jMMMM jYYYY"); else if (stringifiedItem > 11) return moment(item[0]).format("dddd jDD jMMMM jYYYY"); } else { let stringifiedItem = String(item[0]).length; if (stringifiedItem <= 10) return moment(item[0] * 1000).format("dddd jDD jMMMM jYYYY"); else if (stringifiedItem > 10) return moment(item[0]).format("dddd jDD jMMMM jYYYY"); } } catch (error) { } }); this.modifiedData = value.map(function (item) { return [+item[1]]; }); this.options.xAxis.data = this.dates; this.options.series[0].data = this.modifiedData; this.calculateMA(1, this.dataChart); }, /** * محاسبه میانگین متحرک برای دادههای نمودار. * * @param {number} dayCount - تعداد روزهایی که باید در محاسبه میانگین متحرک در نظر گرفته شوند. * @param {Array} data - آرایهای از نقاط داده. */ calculateMA(dayCount, data) { var result = []; for (var i = 0, len = data.length; i < len; i++) { if (i < dayCount) { result.push("-"); continue; } var sum = 0; for (var j = 0; j < dayCount; j++) { sum += +data[i - j][1]; } result.push(sum / dayCount); } this.options.series[1].data = result; }, /** * مدیریت رویداد کلیک روی نمودار. * * @param {Object} event - شی رویداد که اطلاعات نقطه دادهای که روی آن کلیک شده را شامل میشود. */ onChartClick(event) { var item = this.dataChart[event.dataIndex]; const itemSelected = { category: item[0], y: item[1] }; this.$emit("on-chart-click", itemSelected); }, }, }; </script> <style lang="scss"> .highcharts { height: 100%; .highcharts-container { height: 100%; } } </style>