1

当我尝试使用 VueCharts 加载组件时,该组件加载了四次。我怎么解决这个问题?因为我需要在组件加载并且请求繁重时发出 ajax 请求

** 编辑 **

import { Line } from 'vue-chartjs'
import Const from '../helper/const.js'

const URL = Const.ANALYTIC_SENTIMENT

export default Line.extend({
  props: ['idBot', 'initialDate', 'finalDate'],
  data () {
    return {
      consulta: [],
      datacollection: {
        labels: [],
        datasets: []
      },
      cores: ['#ff0000', '#ff4300', '#ff7b00', '#ffae00', '#c19403', '#ffe100', '#aeff00', '#6aff00', '#26ff00', '#2fa803', '#03c107'],
      moment: require('moment')
    }
  },
  methods: {
    dateFormat: function (date) {
      this.moment.locale('pt-BR')
      return this.moment(date).format('L')
    },
    graphGenerator: function () {
      let self = this

      this.renderChart({
        labels: this.datacollection.labels,
        datasets: this.datacollection.datasets
      }, {
        responsive: true,
        maintainAspectRatio: false,
        // Click event
        onClick: function (e) {
          let activePoints = this.getElementAtEvent(e)

          if (activePoints.length > 0) {
          // Dados do Gŕafico
            let chartData = activePoints[0]['_chart'].config.data

          // Index do DataSet do Ponto
            let dsidx = activePoints[0]['_datasetIndex']

            // Index do Ponto
            let idx = activePoints[0]['_index']

          // Label do Ponto
            let date = chartData.labels[idx]

          // Valor do Sentimento no Gráfico
            let sentiment = chartData.datasets[dsidx].label

            self.$emit('emit', {'date': date, 'sentiment': sentiment})
            console.log('date: ' + date + 'sentiment: ' + sentiment)
          }
        },
        legend: {
          position: 'right',
          fullWidth: true,
          labels: {
            boxWidth: 50,
            fontSize: 16
          }
        },
        title: {
          display: true,
          text: 'Sentimento',
          fontSize: 25
        },
        tooltips: {
          mode: 'index',
          intersect: false
        },
        hover: {
          mode: 'nearest',
          intersect: true
        },
        scales: {
          xAxes: [{
            display: true,
            ticks: {
              beginAtZero: true
            },
            scaleLabel: {
              display: true,
              labelString: 'Mês',
              fontSize: 25
            }
          }],
          yAxes: [{
            display: true,
            ticks: {
              beginAtZero: true
            },
            scaleLabel: {
              display: true,
              labelString: 'Total',
              fontSize: 25,
              fontColor: 'green'
            }
          }]
        }
      })
    },
    loadData: function () {
      this.datacollection.labels = []
      this.datacollection.datasets = []
      let datasets = []

      for (var i = 0; i <= 10; i++) {
        let linha = {
          label: i,
          backgroundColor: this.cores[i],
          fill: false,
          tension: 0.1,
          borderColor: this.cores[i],
          pointBorderColor: '',
          pointBorderWidth: 5,
          // Dados da Linha
          data: []
        }
        datasets.push(linha)
      }
      let entrouGeral = []
      this.consulta.forEach((dado, index) => {
        this.datacollection.labels.push(this.dateFormat(dado.key))
        let entrou = []
        dado.feeling.buckets.forEach((sentiment) => {
          entrou.push(sentiment.key)
          datasets[sentiment.key].data.push(sentiment.doc_count)
        })

        entrou.forEach((element) => {
          if (!entrouGeral.includes(element)) {
            entrouGeral.push(element)
          }
        })

        datasets.forEach((teste, index) => {
          if (!entrou.includes(index)) {
            teste.data.push('*')
          }
        })
      })

      for (let i = 0; i < datasets.length; i++) {
        if (entrouGeral.includes(datasets[i].label)) {
          this.datacollection.datasets.push(datasets[i])
        }
      }
    },
    async apiCall () {
      let url = URL + this.idBot

      if (this.initialDate !== 'Invalid date' && this.finalDate !== 'Invalid date') {
        url += `?initialDate=${this.initialDate}&finalDate=${this.finalDate}`
        console.log(url)
      }

      this.$emit('load', true)

      await this.$http.get(url).then((res) => {
        this.consulta = res.data

        this.loadData()
      }).then(() => {
        this._chart.data = this.datacollection
        this._chart.update()
        this.$emit('load', false)
      }, (res) => {
        console.log(res)
      })
    }
  },
  async mounted () {
    this.$emit('load', true)
    await this.$http.get(URL + this.idBot).then((res) => {
      this.consulta = res.data

      this.loadData()

      this.graphGenerator()
    }, (res) => {
      console.log('Resposta: ' + res)
    })
    this.$emit('load', false)
  },
  watch: {
    'finalDate': {
      handler: function () {
        console.log('aa')
        this.apiCall()
      },
      deep: true
    }
  }
})

-----------------------------THE PART WHERE THE COMPONENT IS LOADED ------

   <v-card flat>
          <v-card-text >
            <component class="elevation-3" :is="isSelected" @emit="show" @load="isLoading" :idBot="idBot" :initialDate="initialDate" :finalDate="finalDate"></component>

            <v-dialog v-model="dialog.show" :width="700" persistent>
              <v-card

>

4

0 回答 0