2

Vue.js (状態管理用の vuex と一緒に) プロジェクト内でvega-embedを使用しようとしています。基本的に、バックエンドは Vega json オブジェクトを提供します。これは、クリック イベントで HTTP GET 要求を介してフロントエンドによって取得されます。ただし、プロットを表示するには 2 回クリックする必要があり、最初のクリック イベントでは常にエラー " Uncaught (in promise) TypeError: Cannot read property '$schema' of null" が発生します。誰かがデバッグを手伝ってくれますか? 非常に高く評価。詳細を以下に示します。

vue コンポーネント ファイル:

<template>
  <button @click.native="fetchCars(); displayVegaPlot()">fetch cars</button>
  <div id="vega-example"></div>
</template>

<script>
  import {default as vegaEmbed} from 'vega-embed'
  import {
  mapState
} from 'vuex'

  export default {
    name: 'VegaExample',
    props: {
      component_msg: String
    },
    methods: {
      fetchCars () {
        this.$store.dispatch('fetchCars')
      },
      displayVegaPlot () {
        vegaEmbed('#vega-example', this.vega_cars, {actions: false})
      }
    },
    computed: {
    ...mapState([
      'vega_cars'
    ])
    }
  }
</script>

...そしてストアjsファイル:

import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
Vue.use(Vuex)

export default new Vuex.Store({
  strict: true,
  state: {
    error: '',
    vega_cars: null
  },

  mutations: {
    SET_CARS: (state, cars) => {
      state.vega_cars = cars
    },
    SET_ERROR: (state, error) => {
      state.error = error
    }
   }

  actions: {
    fetchCars: (context) => {
      axios.get(`vega_cars`)
        .then(response => context.commit('SET_CARS', response.data))
        .catch(error => context.commit('SET_ERROR', error))
    }
  }
4

1 に答える 1