2017-07-14 32 views
0

我想從父級傳遞數據到GrandChild(圖表),因此我使用道具。用Vue使用ChartJS得到了「超出最大調用堆棧大小」

這是

的「kalkulator數據」的組件工作,它是用來將數據添加到

<template> 
    <div class="container"> 
     <div class="row"> 

       <kalkulator-data 
        :saldoAwal="saldoAwal" 
        :saldoTerpakai="saldoTerpakai" 
        :saldoAkhir="saldoAkhir" 
        :dataKategori="dataKategori" 
        :dataPengeluaran="dataPengeluaran" 

        @inputSaldo="saldoAwal = $event" 
        @inputPengeluaran="dataPengeluaran.push($event)"> 

       </kalkulator-data> 

       <kalkulator-chart 
        :chartData="chartData" 
        :chartOptions="chartOptions">  

       </kalkulator-chart> 

     </div> 
    </div> 
</template> 

<script> 
    import Chart from './Bagian/Chart.vue'; 
    import Data from './Bagian/Data.vue'; 

    export default { 
     data(){ 
      return { 
       saldoAwal : 0, 
       dataPengeluaran : [{ kategori : 'Abi', nominal : 12}, { kategori : 'Ilham', nominal : 13}], 
       dataKategori : [ 
        'Makan dan Minum', 
        'Berbelanja', 
        'Perlengkapan Rumah', 
        'Transportasi', 
        'Kendaraan', 
        'Gaya Hidup dan Hiburan', 
        'Komunikasi', 
        'Pengeluaran dan Finansial', 
        'Investasi', 
       ], 
       chartOptions : {responsive: true, maintainAspectRatio: false} 
      } 
     }, 
     computed : { 
      saldoTerpakai(){ 
       var saldoPakai = 0; 
       for(var data of this.dataPengeluaran){ 
        saldoPakai += parseInt(data.nominal); 
       } 
       return saldoPakai; 
      }, 
      saldoAkhir(){ 
       return this.saldoAwal - this.saldoTerpakai; 
      }, 
      getRandomColor(){ 
       var letters = 'ABCDEF'; 
       var color = '#'; 
       for (var i = 0; i < 6; i++) { 
        color += letters[Math.floor(Math.random() * 16)]; 
       } 
       return color; 
      }, 
      chartLabels(){ 
       var chartLabels = []; 
       for (var data of this.dataPengeluaran){ 
        chartLabels.push(data.kategori); 
        // backgroundColor.push(this.getRandomColor); 
       }; 
       return chartLabels; 
      }, 
      chartId(){ 
       var chartData = []; 
       for (var data of this.dataPengeluaran){ 
        chartData.push(parseInt(data.nominal)); 
        // backgroundColor.push(this.getRandomColor); 
       }; 
       return chartData; 
      }, 
      chartData(){ 
       return { 
        labels: this.chartLabels, 
        datasets: [ 
         { 
         label: 'Data One', 
         backgroundColor: '#f87979', 
         data: this.chartId 
         } 
        ] 
       } 
      } 
     }, 
     methods : { 

     }, 
     components : { 
      'kalkulator-data' : Data, 
      'kalkulator-chart' : Chart 
     }, 
    } 
</script> 

這是兒童

<template> 
    <div class="col-sm-6"> 
     <div class="row"> 
      <h1 class="text-center">Struktur Pengeluaran</h1> 

      <chart-comp 
       :chartData="chartData" 
       :chartOptions="chartOptions">    
      </chart-comp> 

     </div> 
    </div> 
</template> 

<script> 
    import chartComp from './Chart-Data.js' 

    export default{ 
     props : ['chartData', 'chartOptions'], 
     components : { 
      'chart-comp' : chartComp 
     } 
    } 
</script> 

而且這個如GrandChild這是圖

import {Bar} from 'vue-chartjs' 

export default Bar.extend({ 
    props : ['chartData', 'chartOptions'], 
    computed : { 
     renderChart(){ 
      this.renderChart(this.chartData, this.chartOptions); 
     } 
    }, 
    mounted() { 
     this.renderChart; 
    } 
}) 

我使用的計算,以保持反應,當我添加的數據,但它在控制檯說:

app.js:5366 [Vue warn]: Error in mounted hook: "RangeError: Maximum call stack size exceeded" 

found in 

---> <ChartComp> 
     <KalkulatorChart> at C:\xampp\htdocs\SemuaOkee-Laravel\resources\assets\js\components\Bagian\Chart.vue 
     <Kalkulator> at C:\xampp\htdocs\SemuaOkee-Laravel\resources\assets\js\components\Kalkulator.vue 
      <Root> 
warn @ app.js:5366 
handleError @ app.js:5451 
callHook @ app.js:7490 
insert @ app.js:8315 
invokeInsertHook @ app.js:10143 
patch @ app.js:10308 
Vue._update @ app.js:7248 
updateComponent @ app.js:7371 
get @ app.js:7710 
Watcher @ app.js:7693 
mountComponent @ app.js:7375 
Vue$3.$mount @ app.js:12503 
Vue$3.$mount @ app.js:14602 
Vue._init @ app.js:8942 
Vue$3 @ app.js:9027 
(anonymous) @ app.js:29926 
__webpack_require__ @ app.js:20 
(anonymous) @ app.js:29888 
__webpack_require__ @ app.js:20 
(anonymous) @ app.js:63 
(anonymous) @ app.js:66 
app.js:5455 RangeError: Maximum call stack size exceeded 
    at Watcher.evaluate (app.js:7809) 
    at VueComponent.computedGetter [as renderChart] (app.js:8064) 
    at VueComponent.renderChart (app.js:61047) 
    at Watcher.get (app.js:7710) 
    at Watcher.evaluate (app.js:7810) 
    at VueComponent.computedGetter [as renderChart] (app.js:8064) 
    at VueComponent.renderChart (app.js:61047) 
    at Watcher.get (app.js:7710) 
    at Watcher.evaluate (app.js:7810) 
    at VueComponent.computedGetter [as renderChart] (app.js:8064) 

當我還沒有添加的數據,它的工作完美(這就是爲什麼我m硬編碼中的兩個對象父在開始時測試我的圖表),但是當我添加數據時出現錯誤。

換句話說,它在靜態而不是動態數據上工作。

回答

1

在您的孫子組件中,您已經定義了一個計算屬性renderChart,它返回this.renderChart。這是導致最大調用堆棧大小錯誤的原因。

你應該只調用renderChart方法在mounted鉤:

import { Bar } from 'vue-chartjs' 

export default Bar.extend({ 
    props: ['chartData', 'chartOptions'], 
    mounted() { 
     this.renderChart(this.chartData, this.chartOptions); 
    } 
}) 

如果您需要的圖表數據是反應性,VUE-chartjs提供指定使用一個混合的公認的愚蠢方式:

import { Bar, mixins } from 'vue-chartjs' 

export default Bar.extend({ 
    props: ['chartData', 'chartOptions'], 
    mixins: [mixins.reactiveProp], 
    mounted() { 
     this.renderChart(this.chartData, this.chartOptions); 
    } 
}) 

Here's the vue-chartjs documentation on using reactive data.

+0

感謝FO回答你的答案,但那會導致無動於衷(這意味着我將數據添加到父項時,圖表不會發生變化)。這就是爲什麼我決定使用計算(但得到一個錯誤) – codeComic

+0

@IlhamWahabi vue-chartjs使您可以使用mixin來指定您希望數據是被動的。看到我的編輯 – thanksd

+0

ups我得到它,謝謝它的工作:) – codeComic

相關問題