【问题标题】:Vuex sync : Cannot read property of undefinedVuex同步:无法读取未定义的属性
【发布时间】:2021-07-07 10:31:20
【问题描述】:

我正在尝试使用 vuex 让事情变得更简单,总体来说还不错,但是在使用带有来自其他 getter 的参数的 getter 时我卡住了。

主要代码:

<template>
    <v-container>

        <v-card v-for="(order,i) in getOrders" :key="i" class="cart-cards text-left">

                <v-card-title>
                    {{getMealById(order.meal_id).name}}
                </v-card-title>
                <v-btn v-on:click="addQuantity(order)">
                        +
                    </v-btn>
                    <h1>
                        {{order.quantity}}
                    </h1>
                    <v-btn @click="reduceQuantity(order)">
                        -
                    </v-btn>

        </v-card>

    </v-container>
</template>

<script>
import { mapGetters, mapActions } from "vuex";

export default {
    data: () => ({
    }),
    created() {
        this.fetchOrders();
    },
    mounted() {
    },
    methods: {
        ...mapActions(["fetchOrders"]),
        addQuantity(order) {
            order.quantity += 1;
            this.updateOrders(order);
        },
        reduceQuantity(order) {
            if (order.quantity > 0) {
                order.quantity -= 1;
                this.updateOrders(order);
            }
        },
    },
    computed: {
        ...mapGetters(["getOrders", "getMealById"]),
    },
};

order.js:

import axios from 'axios'
import url from '../../config.js'

const state = {
    all_orders: [],
}
const getters = {
    getOrders : (state)=>state.all_orders,

}
const actions = {
    async fetchOrders({commit}) {
        const response = await axios.get("http://" + url + "/orders")
        commit('setOrders',response.data)
    },
    async updateOrders({commit},payload) {
        const response = await axios.put("http://" + url + "/orders/"+payload.id,payload)
        commit('setOrders',response.data)
    },
}
const mutations = {
    setOrders: (state,orders)=>{
        state.all_orders = orders
    },
}

export default {
    state,
    getters,
    actions,
    mutations
}

meal.js

import axios from 'axios'
import url from '../../config.js'

const state = {
    all_meals: [],
}
const getters = {
    getMeals: (state) => state.all_meals,
    getMealById: (state) => (id) => {
        return state.all_meals.find(todo => todo.id === id)
    }

}
const actions = {
    async fetchMeals({ commit }) {
        const response = await axios.get("http://" + url + "/meals")
        commit('setMeals', response.data)
    },
}
const mutations = {
    setMeals: (state, meals) => {
        state.all_meals = meals
    },
}

export default {
    state,
    getters,
    actions,
    mutations
}

所以当我从链接访问vue时,没有错误,但是当我自己加载url时,会发生错误并且getMealById不会触发

总体而言,他们是“等待”状态/动作调用响应的好习惯吗?

提前致谢!!!

【问题讨论】:

    标签: vue.js asynchronous synchronization vuex


    【解决方案1】:

    在组件中,你可以检查getMeals是否返回一个非空数组,然后渲染v-for循环:

    <template>
    <v-container v-if="getMeals().length > 0">
    
        <v-card v-for="(order,i) in getOrders" :key="i" class="cart-cards text-left">
    
                <v-card-title>
                    {{getMealById(order.meal_id).name}}
                </v-card-title>
    
        </v-card>
    
    </v-container>
    </template>
    
    <script>
    import { mapGetters, mapActions } from "vuex";
    
    export default {
        data: () => ({
        }),
        created() {
            this.fetchOrders();
        },
        mounted() {
        },
        methods: {
            ...mapActions(["fetchOrders"]),
        },
        computed: {
            ...mapGetters(["getMeals", "getOrders", "getMealById"]),
        },
    };
    

    【讨论】:

    • 您好! “getMeals”并没有真正参与这个页面,我尝试在 getOrders 上使用 v-if,但它并没有真正起作用,问题是 getMealById(order.meal_id).nameorder 加载之前出现
    • 仔细查看错误。它声明它无法读取未定义(meal.name)的属性nameorder 已定义(否则它不会循环遍历它们),但是按顺序定义其 id (order.meal_id) 的餐点尚未在商店中,因此 getMealById 返回 undefined 和增加错误。
    • 首先,抱歉,我想我无意中编辑了您的回复,我想编辑我的主要信息。好的,我通过在created中添加fetchMeals解决了这个问题,因此我添加了2个函数来更新数量addQuantity , reduceQuantity,第一个调用工作正常,但在第一个调用之后,同样的错误Error in render: "TypeError: Cannot read property 'name' of undefined"
    猜你喜欢
    • 2018-04-21
    • 2017-11-08
    • 1970-01-01
    • 2021-07-07
    • 2020-04-06
    • 2020-01-17
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多