【发布时间】:2021-04-13 12:59:13
【问题描述】:
在我的项目中,我有状态 products 和 orders。每个订单都包含一个产品的 ID,或者一个带有产品 ID 的数组。它们来自不同的 API。 (如微服务架构)
订单的 JSON 结构:
[
{
"orderId": 1,
"productId": 360
}
]
order.js
export const state = () => ({
order: {}
})
export const getters = {
order: state => state.allOrder,
}
export const mutations = {
async setOrderById(state, order) {
state.order = order;
}
export const actions = {
async setOrderById(state, orderId) {
const order = await this.$axios.get(api + orderId);
state.commit('setOrderById', client.data);
}
product.js 具有相同的结构,但具有一些不同的属性,例如“标题、名称、价格等:
{
"id": 2,
"title_de": "Example T-Shirt",
"price": 550
}
现在,我想在我的组件中加载订单的产品属性。最好的做法是什么?这有点复杂,因为在我的组件中,我通过计算属性加载数据。最后,我想要这样的东西:
OrderComponent.vue
<template>
<div v-if="currentOrder">
{{ currentOrder.product.title }} <!-- UNDEFINED -->
{{ currentOrder.product.price }} <!-- UNDEFINED -->
</div>
</template>
<script>
import {mapGetters} from 'vuex';
export default {
name: "OrderDetail",
data() {
return {
orderId: this.$route.params.id,
}
},
computed: {
...mapGetters({
currentOrder: 'shop/orders/order'
})
},
mounted() {
this.$store.dispatch('shop/orders/setOrderById', this.orderId)
}
}
</script>
正如我研究的那样,没有办法操纵计算的属性。当然这个例子是行不通的,因为在一个订单中只有productId。
【问题讨论】:
-
这有点复杂,因为在我的组件中,我通过计算属性加载数据 - 计算属性 应该对如何获取订单数据一无所知,这应该是 Vuex 操作的工作。你为什么不在
setOrderById中获取产品?如果您的问题是关于如何构建状态,那么您应该为orderAndProductDetails设置单独的状态,并在视图中使用的那些属性 (currentOrder.product.price) 由操作填充。
标签: vue.js nuxt.js vuex computed-properties