Как правильно передать массив с данными на диаграмму из библиотеки VueApexCharts в vue3?

#vue.js #vuex #vuejs3 #apexcharts #vuex4

#vue.js #vuex #vuejs3 #apexcharts #vuex4

Вопрос:

Я пишу небольшой проект по борьбе с covid и пытаюсь отобразить подтвержденные данные о заражении с помощью ApexCharts, но график не отображается. Я ввожу данные из vuex в две таблицы. Данные действительны, однако они поступают из api и sa в прокси-объекте. Что я делаю не так? (Я использую ApexCharts, потому что vue Chartjs несовместим с vue 3).

 <template>
  <apexchart width="500" type="bar" :options="options" :series="series"></apexchart>
</template>

<script>
import VueApexCharts from "vue3-apexcharts";

export default {
  components: {
    apexchart: VueApexCharts,
  },
 data(){  
   return {
     series: [],
      options: {
        chart: {
          type: "bar",
          height: 400,
          stacked: true
        },
        plotOptions: {
          bar: {
            horizontal: false
          }
        },
        dataLabels: {
          enabled: false
        },
        tooltip: {
          shared: true,
          followCursor: true
        },
        stroke: {
          width: 1,
          colors: ["#fff"]
        },
        fill: {
          opacity: 1
        },
        legend: {
          position: "top",
          horizontalAlign: "center",
          offsetX: 40
        },
        colors: ["rgb(95, 193, 215)", "rgb(226, 37, 43)", "rgb(94, 181, 89)"]
      }
    };
 },
 computed: {
   getDate(){
     return this.$store.getters['chart/getDate'];
   },
   getConfirmed(){
    return this.$store.getters['chart/getConfirmed'];
   }
 },
   methods: {
    fillDate(){
       this.options = {
         xaxis: {
           categories: this.getDate
         }
       }
        this.series = [
         {
           name: 'Confirmed',
           data: this.getConfirmed
         }
       ];
     }
   },
  async mounted() {
    await this.fillDate();
  }
}
 

Данные из хранилища vuex представляют собой два массива.

 Proxy
[[Handler]]: Object
[[Target]]: Array(45)
[[IsRevoked]]: false
 

Ответ №1:

Вместо того, чтобы использовать смонтированный хук и метод, попробуйте просмотреть вычисленные свойства, а затем обновить данные на их основе:

  computed: {
   getDate(){
     return this.$store.getters['chart/getDate'];
   },
   getConfirmed(){
    return this.$store.getters['chart/getConfirmed'];
   }
 },
watch:{
   getDate:{
  handler(newVal){
    this.options = {
         xaxis: {
           categories: this.getDate
         }
       },
   deep:true
    },
 getConfirmed:{
   handler(newVal){
    this.series = [
         {
           name: 'Confirmed',
           data: this.getConfirmed
         }
       ];
 },
  deep:true
 }
}
 

Комментарии:

1. Я пытался, но watch вообще не реагирует на изменения данных

2. попробуйте добавить опцию deep, пожалуйста, проверьте отредактированный ответ

3. Теперь это работает, спасибо. Но, кстати, как работает deep?