gpt4 book ai didi

javascript - Vue.js:在方法中使用计算属性返回未定义的错误

转载 作者:行者123 更新时间:2023-12-02 21:01:19 24 4
gpt4 key购买 nike

我有一个从 vuex 获取状态的计算属性。在 vuex 内部,状态是使用 axios 设置的,以从我的 api 获取一些数据。我的问题是,当我尝试在我的方法中使用此计算属性时,我收到未定义的错误。这是因为我尝试使用在 vuex 存储中设置之前的数据。那么,在我尝试在我的方法中使用 boardColumnData 之前,如何确保它已设置?

错误:

Error in mounted hook: "TypeError: Cannot read property 'total' of undefined"
TypeError: Cannot read property 'total' of undefined

AppCharts.vue

<template>
<div id="chart_section">
<div id="charts" v-if="boardColumnData">
<DoughnutChart :chart-data="datacollection" :options="chartOptions" class="chart"></DoughnutChart>

<button v-on:click="fillData">Fill Data</button>
</div>
</template>


<script>
import DoughnutChart from './DoughnutChart';
import { mapGetters } from 'vuex';

export default {
components: {
DoughnutChart
},
computed: {
...mapGetters(['boardColumnData']),
},
data() {
return {
datacollection: null,
chartOptions: null
}
},
mounted() {
this.fillData();
},
methods: {
fillData() {
this.datacollection = {
datasets: [{
data: [this.boardColumnData[0].total.$numberDecimal, this.boardColumnData[1].total.$numberDecimal, this.boardColumnData[2].total.$numberDecimal, this.boardColumnData[3].total.$numberDecimal],
backgroundColor: [
'#83dd1a',
'#d5d814',
'#fdab2f',
'#1ad4dd'
],
borderColor: [
'#83dd1a',
'#d5d814',
'#fdab2f',
'#1ad4dd'
],
}]
};

this.chartOptions = {
responsive: true,
maintainAspectRatio: false,
};
}
}
}
</script>

DoughtnutChart.vue

<script>
import { Doughnut, mixins } from 'vue-chartjs';
const { reactiveProp } = mixins;

export default {
extends: Doughnut,
mixins: [reactiveProp],
props: ['chartData', 'options'],
mounted () {
this.renderChart(this.chartdata, this.options)
}
}
</script>

vuex 商店:

import axios from 'axios';

const state = {
defaultPosts: [],
boardPosts: [],
boardColumnData: [],
};

const getters = {
boardColumnData: state => state.boardColumnData,
};

const actions = {
getAllBoardPostData: ({commit}) => {
function getBoardColumns() {
return axios.get('http://localhost:5000/api/summary-board/columns');
}

function getBoardPosts() {
return axios.get('http://localhost:5000/api/summary-board/posts');
}

axios.all([getBoardColumns(), getBoardPosts()])
.then(axios.spread((columnData, postData) => {
let rawPosts = postData.data;
let columns = columnData.data;
let posts = Array.from({length: columns.length}, () => []);

rawPosts.forEach((post) => {
// If column index matches post column index value
if(posts[post.column_index]){
posts[post.column_index].push(post);
}
});

columns.forEach((column, index) => {
let columnTotal = 0;

posts[index].forEach((post) => {
columnTotal += post.annual_value;
});

column.total.$numberDecimal = columnTotal;
});

commit('setBoardColumns', columns);
commit('setBoardPosts', posts);
commit('setDefaultPosts', posts);
}))
.catch(error => console.log(error));
}
};

const mutations = {
setDefaultPosts: (state, payload) => {
state.defaultPosts = payload;
},
setBoardPosts: (state, payload) => {
state.boardPosts = payload;
},
setBoardColumns: (state, payload) => {
state.boardColumnData = payload;
}
};

export default {
state,
getters,
actions,
mutations
};

boardColumnData 看起来像这样:

[
{
"name": "Opportunities",
"percentage": {
"$numberDecimal": "0"
},
"total": {
"$numberDecimal": 70269
}
},
{
"name": "Prospects",
"percentage": {
"$numberDecimal": "0.25"
},
"total": {
"$numberDecimal": 0
}
},
{
"name": "Proposals",
"percentage": {
"$numberDecimal": "0.5"
},
"total": {
"$numberDecimal": 5376
}
},
{
"name": "Presentations",
"percentage": {
"$numberDecimal": "0.75"
},
"total": {
"$numberDecimal": 21480
}
},
{
"name": "Won",
"percentage": {
"$numberDecimal": "1"
},
"total": {
"$numberDecimal": 0
}
},
{
"name": "Lost",
"percentage": {
"$numberDecimal": "1"
},
"total": {
"$numberDecimal": 0
}
},
{
"name": "No Opportunity",
"percentage": {
"$numberDecimal": "1"
},
"total": {
"$numberDecimal": 0
}
}
]

最佳答案

一旦数据到达商店,Vue 应该能够处理更新组件的 react 性,并且由于您将其正确地传递到组件中,我认为您只需要进行一些小的调整即可使组件更 react 性的。我会将 datacollection 移至计算属性,因为它仅依赖于商店的 boardColumnData,然后您可以将 chartOptions 移至最初定义,因为它只是静态数据?


export default {

data: () => ({
// datacollection: null, // remove this
chartOptions: {
responsive: true,
maintainAspectRatio: false,
},
},

//...

computed: {
...mapGetters([
'boardColumnData'
]),
datacollection() { // Property added to computed properties
if (this.boardColumnData.length) { // - check for boardColumnData before using it
return {
datasets: [{
data: [this.boardColumnData[0].total.$numberDecimal, this.boardColumnData[1].total.$numberDecimal, this.boardColumnData[2].total.$numberDecimal, this.boardColumnData[3].total.$numberDecimal],
backgroundColor: [
'#83dd1a',
'#d5d814',
'#fdab2f',
'#1ad4dd'
],
borderColor: [
'#83dd1a',
'#d5d814',
'#fdab2f',
'#1ad4dd'
],
}]
};

} else {
return null;
}
}, // end dataCollection()
},

//... rest of component...

然后在模板中,只需检查 datacollection 是否具有值。例如:

<template>
<div id="chart_section">
<div id="charts" v-if="datacollection">
<DoughnutChart
:chart-data="datacollection"
:options="chartOptions"
class="chart"
/>
</div>
</div>
</template>

关于javascript - Vue.js:在方法中使用计算属性返回未定义的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61349241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com