我正在使用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>