#vue.js #chart.js
Вопрос:
Я создаю диаграмму, показывающую данные в vuejs, я пытаюсь обновить labels
ее снова, но все еще не работает.
В ChartjsComponentLineChart.vue
:
<script>
import { Line } from 'vue-chartjs'
export default {
extends: Line,
props: {
data: {
type: Object,
default: null,
},
options: {
type: Object,
default: null,
},
plugins: {
type: Array,
default: null,
},
styles: {
type: Object,
default: null,
},
},
mounted() {
this.renderChart(this.data, this.options, this.plugins, this.styles)
},
}
</script>
В отчете.vue
<b-card-body>
<chartjs-component-line-chart
:height="400"
:data="data"
:options="options"
:plugins="plugins"
/>
</b-card-body>
<b-button
variant="primary"
class="btn-tour-finish"
@click="submitData"
>Submit
</b-button>
data() {
return: {
data: {
labels: [],
datasets: [
{
data: [70, 95, 100, 120, 257, 271, 300, 321, 383, 450],
label: "Supper",
borderColor: "#3e95cd",
},
],
},
options: {
title: {
display: true,
text: "Report",
},
responsive: true,
maintainAspectRatio: false,
},
}
},
created() {
this.data.labels = [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025];
},
methods: {
submitData() {
this.data.labels = [1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025, 2030];
}
}
Схема работала. Но когда я нажимаю «Отправить (submitData())
labels
«, сообщение не обновляется. Есть ли способ обновить «метки», когда я нажимаю. Дай мне какие-нибудь идеи. Спасибо
Комментарии:
1. Пожалуйста, добавьте весь соответствующий код, который вы используете, поэтому в этом случае наиболее важная часть вашего
chartjs-component-line-chart
кода отсутствует. Без этого невозможно будет понять, почему это не работает, и это будут только догадки2. @LeeLenalee Я обновил вопрос.. Вы можете мне помочь? Спасибо
Ответ №1:
Chart.js сам по себе не является реактивным, вам нужно самостоятельно вызывать update
метод при изменении данных. Это поведение, не являющееся реактивным из коробки, перенимается vue-chartjs.
Чтобы сделать его реактивным, вам нужно добавить reactiveProp
миксин в компонент LineChart в соответствии с документами.
import { Line, mixins } from 'vue-chartjs'
const { reactiveProp } = mixins
export default {
extends: Line,
mixins: [reactiveProp],
props: ['options'],
mounted () {
// this.chartData is created in the mixin.
// If you want to pass options please create a local options object
this.renderChart(this.chartData, this.options)
}
}
Вы также можете реализовать свой собственный наблюдатель и вызвать метод обновления chart.js сами в соответствии с документами
watch: {
data () {
this.$data._chart.update()
}
}
Комментарии:
1. Отсутствует необходимая опора: «chartData» .. Это ошибка, которую я получил, когда последовал вашему предложению. Вы можете сказать мне, как исправить эту ошибку? Спасибо
2. Должно было быть данными, так как ваша опора называется данными, я думаю
3. Да, я позвонил:
:chart-data="data"
и это было успешно.. Но когда я нажимаю «Отправить», метки по — прежнему не меняются?
Ответ №2:
Я успешно это исправил.Таким образом : v-if="loaded"
<b-card-body>
<chartjs-component-line-chart
v-if="loaded"
:height="400"
:data="data"
:options="options"
:plugins="plugins"
/>
</b-card-body>
data() {
return: {
data: {
loaded: false,
labels: [],
datasets: [
{
data: [70, 95, 100, 120, 257, 271, 300, 321, 383, 450],
label: "Supper",
borderColor: "#3e95cd",
},
],
},
options: {
title: {
display: true,
text: "Report",
},
responsive: true,
maintainAspectRatio: false,
},
}
},
created() {
this.data.labels = [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025];
this.loaded = true;
},
methods: {
submitData() {
this.data.labels = [1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025, 2030];
this.loaded = true;
}
}