模板未获取计算属性的内容,但在生命周期挂钩中记录正常

Posted

技术标签:

【中文标题】模板未获取计算属性的内容,但在生命周期挂钩中记录正常【英文标题】:Content of Computed property not picked up by the template, but is logged ok in lifecycle hook 【发布时间】:2021-09-19 03:53:56 【问题描述】:

我正在创建一个网上商店,您可以选择在不影响购物车内容的情况下订购购物车以外的产品。我实现这一点的方式是为您的购物车项目和单个产品共享一个页面。它检查是否已设置 productID 参数,在这种情况下它使用不同的数据。

这是我写的函数:

    computed : 
        products: function() 
            if ( this.$route.query.pid ) 
                var product = []
                axios.get(`/api/products/$this.pid`).then(response => 
                    product[0].id = response.data[0].id
                    product[0].name = response.data[0].name
                    product[0].units = response.data[0].units
                    product[0].image = response.data[0].product_image[0].image
                    product[0].price = response.data[0].price
                    product[0].quantity = 1
                )
                return Object.assign(product)
             else 
                return this.$store.state.cart
            
        
    ,

这是成功检索数据的生命周期钩子(beforeMount):

    beforeMount() 
        console.log(this.products)
    

现在的问题是 products 属性被模板视为空。当我没有查询参数进入这个页面时完全没问题,它只是找不到单个产品的计算数据。

我该如何解决这个问题?提前致谢!

【问题讨论】:

return Object.assign(product) 的意义何在? 我想我可以使用它,因为我使用的是 for 循环,所以我不需要两个为单个产品添加额外的代码。 【参考方案1】:

vue/no-async-in-computed-properties

计算的属性和函数应该是同步的。它们内部的异步操作可能无法按预期工作,并可能导致意外行为,这就是您应该避免使用它们的原因。如果您需要异步计算属性,您可能需要考虑使用其他插件 [vue-async-computed]

模板没有获取属性,但生命周期挂钩能够使用计算属性获取数据

您在控制台中看到某些内容的唯一原因是大多数现代浏览器log objects as live data(一旦对象更新,控制台也会更新)。因此,您在控制台中看到的不是对象在执行 console.log 时的值,而是稍后执行的值。您可以通过 console.log(JSON.parse(JSON.stringify(this.products))) 来确认这一点...

要解决问题,请使用watch 而不是computed

data() 
  return 
    products: []
  
,
watch: 
  '$route.query.pid': 
    handler: function(newValue) 
      if(newValue) 
        axios.get(`/api/products/$newValue`).then(response => 
          var product = 
            id: response.data[0].id,
            name: response.data[0].name,
            units: response.data[0].units
            image: response.data[0].product_image[0].image
            price: response.data[0].price
            quantity: 1
          
          this.products = []
          this.products.push(product)
       else this.products = this.$store.state.cart
    ,
    immediate: true
  
,

【讨论】:

以上是关于模板未获取计算属性的内容,但在生命周期挂钩中记录正常的主要内容,如果未能解决你的问题,请参考以下文章

vue生命周期钩子小记

vue 524 (生命周期 计算属性 监听)

从 Angular2 路由中的子组件调用 router.parent.navigate 方法时未触发组件构造函数和路由器生命周期挂钩

Vue生命周期

vue生命周期

Vue生命周期,计算属性方法侦听器