开发者问题收集

如何定义一个空的 Vuex 状态,然后检查它在 Vue 组件中是否为空/空?

2020-03-25
1884

我有一个 Vuex 存储,它将状态定义为 null:

const state = {
    Product: null  // I could do Product:[] but that causes a nested array of data
};

const getters = {
     getProduct: (state) => state.Product
};

const actions = {
     loadProduct({commit}, {ProudctID}) {
     axios.get(`/api/${ProductID}`).then(response => {commit('setProduct', response.data)})
     .catch(function (error) {
     //error handler here
     }
   }
};

const mutations = {
     setProduct(state, ProductData) {
     state.Product = ProductData
     }
};

在我的 Vue 组件中,我想在 Product 数据可用时显示它。所以我这样做了:

<template>
   <div v-if="Product.length">{{Product}}</div>
</template>

当我运行它时,我收到一条错误消息

Vue warn: Error in render: "TypeError: Cannot read property 'length' of null"

好的,所以我尝试了这个,但它什么也不做(没有抛出任何错误并且从不显示数据):

<template>
   <div v-if="Product != null && Product.length">{{Product}}</div>
</template>

如果 Product 对象数据不为 null,那么显示它的正确方法是什么? Product 是一个 JSON 对象,其中填充了来自数据库的数据,如下所示:

[{ "ProductID": 123, "ProductTitle": "Xbox One X Gaming" }]

我的 Vue 组件获取的数据如下:

computed:
            {
            Product() {
                return this.$store.getters.getProduct
            }
        }
        ,
        serverPrefetch() {
            return this.getProduct();
        },
        mounted() {
            if (this.Product != null || !this.Product.length) {
                this.getProduct();
            }
        },
        methods: {
            getProduct() {
                return this.$store.dispatch('loadProduct')
            }
        }

如果我查看 Vue Dev Tools,结果发现我的 Vue 组件中的 Product 始终为 null ,但在 Vuex 选项卡中它填充了数据。奇怪吗?

2个回答

这是使用计算的经典案例:

computed: {
   product() {
     return this.Product || [];
   }
}
Alex Brohshtut
2020-03-25

在 store 函数中,当您执行请求时,您可以检查 examoe

const actions = {
     loadProduct({commit}, {ProudctID}) {
if (this.product.length > 0) {// <-- new code
  return this.product // <-- new code
} else { // <-- new code
     // do the http request
     axios.get(`/api/${ProductID}`)
    .then(response => {
    commit('setProduct', response.data)}
    )
     .catch(function (error) {
     //error handler here
     }
   }// <-- new code
   }
};

key
2021-03-18