我正在使用composition API在vuejs中构建图表,chartjs@4.2和vue-chartjs@5.2.0
然而,我无法保持选项和数据的反应性,所以我构建了一个按钮,当激活时,缩放将处于活动状态,而当不活动时,缩放会被重置。但我没有设法将这种反应性保持在组件内<;条形图>;。更专业的是,我会让grafico条在其他视觉效果中充当过滤器(就像Power BI一样)。有人能帮我吗?
我有一个包含操作码和数据集的js文件:
export const optionBar = { responsive: true, maintainAspectRatio: true, plugins: { datalabels: { formatter: function(values) { return new Intl.NumberFormat('pt-br',{ maximumFractionDigits: 2, minimumFractionDigits:2, }).format(values) } }, zoom: { zoom: { wheel: { enabled: true, }, drag: { enabled: true, backgroundColor: 'rgba(12, 173, 241, 0.10)' }, pinch: { enabled: true }, mode: 'x' } } } } export const dataSet = { labels: [1,2,3,4], datasets: [ { label: `test`, data: null, }, ], }
我可以在控制台日志和模板中使用{{}}看到chartOption的更改,但我的图表不会相应更新。根据我在文档中看到的,根据更新的版本(2022-23),prop:options将通过在vue-chartjs中包含手表来“赞扬”选项中的任何更改:
<template> //Toggle Button that change the boolean value and active changes in chartOption <button @click="ZoomAtivo" > {{zoomEnable}} </button> {{chartOptions.plugins }} <div class="card "> <div class="card-body"> <div class="card-header border-0 d-flex justify-content-between"> <h4 class="card-title mb-0"> Serie Temporal </h4> <div class="d-flex p-2"> <div v-for="value in dateF" :key="value.id" class="btn-group btn p-0 mx-1" role="group" aria-label="Basic radio toggle button group"> <input type="radio" class="btn-check" name="btnradio" :id="value.id_date_mode" :checked="value.check" /> <label class="btn btn-primary mb-0" :for="value.id_date_mode"> {{value.date_mode}}</label> </div> <p v-if="dateF == 1"> teste</p> </div> </div> <Bar v-if="load" class="STChart" :data="datasets" :options="chartOptions" :updateMode="'none'" /> </div> </div> </template> <script> import { Bar } from 'vue-chartjs' import { Chart as ChartJS, Title, Tooltip, Legend, BarElement, CategoryScale, LinearScale } from 'chart.js' import zoomPlugin from 'chartjs-plugin-zoom'; import ChartDataLabels from 'chartjs-plugin-datalabels'; import moment from 'moment' import { ref, reactive} from 'vue' ChartJS.register(Title, Tooltip, Legend, BarElement, CategoryScale, LinearScale, zoomPlugin, ChartDataLabels) import {optionBar,dataSet} from './options.js' import { dateFilter } from '@/components/date-mode'; export default { components: { Bar } , setup() { console.log(Bar) const chart = ref() const zoomEnable = ref(false) const data = ref([]) const dateF = reactive(dateFilter) const chartOptions =reactive(optionBar) const load = ref(false) const data_mov = ref() const sobra_perda = ref() const datasets = reactive(dataSet) const label = ref() datasets.labels = data_mov datasets.datasets[0].data = sobra_perda datasets.datasets[0].label = `Sobra_Perda` const zmm = reactive({ zoom: { wheel: { enabled: true, }, drag: { enabled: true, backgroundColor: 'rgba(12, 173, 241, 0.10)' }, pinch: { enabled: true }, mode: 'x' } }) const ZoomAtivo = () => { zoomEnable.value = !zoomEnable.value if(zoomEnable.value) { chartOptions.plugins.zoom = zmm console.log(chartOptions.plugins.zoom) } else { chartOptions.plugins.zoom=null console.log(chartOptions.plugins.zoom) } } async function DateChart(starDate, endDate, p_items) { starDate = `01-01-2020` endDate = `31-12-2022` const url = `http://localhost:1800/dash/Date/${starDate}/${endDate}` const respons = await fetch(url, { method: 'POST', body: JSON.stringify({ empresa: JSON.parse(localStorage.getItem('companiesGlobalFilter')), items: p_items }), headers: { 'Content-type': 'application/json; charset=UTF-8' }, }); data.value = await respons.json() const title = Object.keys(data.value[0]) const _Sobra =data.value.map(v => v.sobra_perda) const _date_movimento =data.value.map(x => { let datee = new Date(x.date_movimento) const data = moment(datee).utc() datee = data.format('MM/YYYY') return datee }) data_mov.value = _date_movimento sobra_perda.value = _Sobra load.value = true label.value = title return data_mov } return { chartOptions, datasets, load, data_mov, sobra_perda,dateF, zoomEnable, chart, ZoomAtivo } } } </script> <style scoped> @import './css/chartjs.css'; </style>