开发者问题收集

在 Vue.js 中将对象作为 props 发送并获取 TypeError 和警告

2021-11-15
2147

我试图将一个对象传递到我的子组件中,但它未定义。所以我的父组件:

<template>
    <section id="cart-page" class="row">
        <div v-for="items in cart" :key="items.product.id">
            <div class="col-lg-8 col-md-12 col-sm-12 col-xs-12">
                <div class="title">WARENKORB</div>
                <SoldTickets :items = "items"/>
            </div>
        </div>
    </section>
</template>
<script>
import image from "../../../../img/Hallenbad.jpg";
import CheckBox from "../components/CheckBox";
import SoldTickets from "../components/SoldTickets";
export default {
    components: {
        CheckBox,
        SoldTickets,
    },
    data(){
        return {
            image: image,
        };
    },
    computed: {
        cart() {
            return this.$store.state.cart;
        },
    },
};
</script>

因此,我将购物车存储到 Vuex 存储中,并且我正确使用它,它是一个如下所示的对象:

在此处输入图像描述

因此,我想将此 cart.attributes.items 对象发送到 SoldTickets 组件以在组件内部显示它们。

<template>
    <div id="sold-tickets">
        <div class="card">
            <div class="sold-tickets-actions">
                <div class="sold-tickets-inner">
                    <img class="sold-tickets-image" :src="image" alt="Sold Ticket"/>
                </div>
            </div>
            <div class="sold-tickets-actions properties">
                <div class="sold-tickets-inner">
                    <div class="ticket-details">
                        <div class="ticket-prop">
                            <div class="ticket-name">{{ items.product_name }}</div>
                            <div class="ticket-type">{{ items.variation_name }}</div>
                        </div>
                    </div>
                    <DeleteButton />
                </div>
            </div>
        </div>
    </div>
</template>
<script>
import image from "../../../../img/Hallenbad.jpg";
import DeleteButton from "./DeleteButton";
import cartHelper from "../helpers/cartHelper";

export default {
    props: {
        items: Object,
    },
    components: {DeleteButton},
    data() {
        return {
            image: image,
        };
    },
};
</script>

但我收到了错误。 vue.esm.js:628 [Vue warn]: 渲染时出错:“TypeError: 无法读取未定义的属性(读取‘id’)” TypeError: 无法读取未定义的属性(读取‘id’) 。如果我这次从父组件中删除‘:key="items.product.id"’,我会收到警告,但项目无法再次显示。 [Vue warn]: 无效的 prop: prop“items”的类型检查失败。预期对象,得到的字符串值为“00e84ffb-1fbf-00bf-d3cc-adbcc795e060” [Vue warn]: 无效的 prop: prop“items”的类型检查失败。预期对象,得到的字符串值为“carts”

但问题是,如果我尝试在父组件中显示项目,它会在没有警告的情况下工作 &错误。那么您认为为什么会发生这种情况呢?谢谢您的帮助。

2个回答

这里的问题是,项目是一个对象数组,从 console.log() 中可以看出,但您在代码中将其视为对象。您可以通过将某个对象传递给子组件来更改这种情况,如下所示:

<div v-for="items in cart" :key="items.product.id">
            <div class="col-lg-8 col-md-12 col-sm-12 col-xs-12">
                <div class="title">WARENKORB</div>
                <SoldTickets :items = "items[0]"/>  --> only pass first object
            </div>
        </div>

或者,您可以将子组件更改为接受数组,然后在模板中循环遍历数组,如下所示:

<template>
    <div id="sold-tickets">
        <div class="card">
            <div class="sold-tickets-actions">
                <div class="sold-tickets-inner">
                    <img class="sold-tickets-image" :src="image" alt="Sold Ticket"/>
                </div>
            </div>
            <div v-for="item in items" :key="item.product.id" class="sold-tickets-actions properties">
                <div class="sold-tickets-inner">
                    <div class="ticket-details">
                        <div class="ticket-prop">
                            <div class="ticket-name">{{ item.product_name }}</div>
                            <div class="ticket-type">{{ item.variation_name }}</div>
                        </div>
                    </div>
                    <DeleteButton />
                </div>
            </div>
        </div>
    </div>
</template>
<script>
import image from "../../../../img/Hallenbad.jpg";
import DeleteButton from "./DeleteButton";
import cartHelper from "../helpers/cartHelper";

export default {
    props: {
        items: Array,
    },
    components: {DeleteButton},
    data() {
        return {
            image: image,
        };
    },
};
</script>
Mario Klisanic
2021-11-15

问题在于,您正在循环遍历具有许多键的对象 cart ,其中一些键是 string (例如:“00e84ffb-1fbf-00bf-d3cc-adbcc795e060”),同时您的子组件希望接收一个对象。这就是它吐出错误的原因。您可以在此处阅读有关 使用对象进行列表渲染 的更多信息。

我的建议:

如果您的子组件中需要 cart.attributes.items ,则只需发送它,将计算属性 cart 更改为数组:

computed: {
    cart() {
        return this.$store.state.cart.attributes?.items || [];
    }
}

在模板中,将 item 数组传递到子组件中,变量 item 应为单数形式,您可以随意命名,但为了清楚起见,请使用单数形式:

<div v-for="item in cart" :key="item.id">
        <div class="col-lg-8 col-md-12 col-sm-12 col-xs-12">
            <div class="title">WARENKORB</div>
            <SoldTickets :item = "item"/>
        </div>
    </div>

不要忘记更改您的道具声明:

props: {
    items: Array,
}
KienHT
2021-11-15