将vuex状态传递到图表-vue

时间:2018-06-21 12:04:21

标签: javascript vue.js vue-component vuex vuex-modules

我正在做一个图表部件,它将在页面上多次显示。

为此,我正在使用Vuex,在那里我可以通过突变/操作来获取该日期,并且一切正常。

在图形组件的created()中,我调用操作以发出请求,并且要将日期传递给图表。

状态如下-

{
   typeChart: [data],
   typeChart2: [data2]
}

如果我从状态开始进行console.log,则看起来不错,但是如果使用键返回未定义。

console.log(this.dataChart)
// log - { stacked: Array }

console.log(this.dataChart.stacked);
//  log - undefined

我发现将状态传递到图表的唯一方法是执行超时,但是我认为这不是最好的方法。

这是我的代码

页面的组成部分-

<template>
    <stacked-chart
        endpoint="endpoint"
        chart="stacked"
        :states="['state1', 'state2', 'state3']"
        :keys="['key1', 'key2', 'key3']"
    />
</template>

图表的组成部分-

<template>
    <div class="box-content-white">
        <div class="title"> Gráfico 1 </div> <!-- //! name for chart -->
        <column-chart  :data="data" :stacked="true" :colors="['#006837', '#FF0000', '#000']"></column-chart>
    </div>
</template>

<script>
    import { mapGetters } from 'vuex';
    import { mapActions } from 'vuex';

    export default {
        props: {
            endpoint: String,
            chart: String,
            states: Array,
            keys: Array
        },
        data() {
            return {
                 data: []
            }
        },
        created() {
            this.fetchReporting({endpoint: this.endpoint, chart: this.chart, states: this.states, keys: this.keys, formData: { state: 'negotiation' }});
            console.log(this.dataChart);
            console.log(this.dataChart[this.chart]);
            setTimeout(() =>{
                this.data = this.dataChart[this.chart];
            }, 150);
        },
        methods: {
            ...mapActions({
                fetchReporting: 'fetchReporting'
            })
        },
        mounted() {

            this.data = this.dataChart[this.chart];
        },
        computed: {
            ...mapGetters({
                dataChart: 'dataChart'
            })
        },
        watch: {

        }
    }
</script>

带有vuex的文件-

import axios from 'axios';

const state = {
    dataChart: {}
}

const mutations = {
    'ADD_DATA_CHART'(state, data) {
        state.dataChart[data.key] = [];

        [].forEach.call(data.states, (s, i) => {
            let obj = {};
            obj.name = s;
            obj.data = [];

            [].forEach.call(data.value, d => {
                obj.data.push([d.name, d[data.keys[i]].toFixed(2)]);
            });
            state.dataChart[data.key].push(obj);
        });
    }
}

const actions = {
    fetchReporting({state, commit}, response) {
        axios.post(response.endpoint, response.formData)
            .then(({data}) => {
                commit('ADD_DATA_CHART', {key: response.chart, value: data, states: response.states, keys: response.keys})
            }).catch(err => {
                console.log(err);
            });
    }
}

const getters = {
    dataChart: state => {
        return state.dataChart;
    }
}


export default {
    state,
    mutations,
    actions,
    getters
}

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您需要等待fetchReporting操作完成。使用async/await或使用promise/resolve