【问题标题】:Computed Property on Dynamic Prop Object动态道具对象的计算属性
【发布时间】:2019-09-05 17:27:09
【问题描述】:

我有一个将对象传递给子对象的父组件,并且该子组件具有依赖于对象属性的计算属性。

我可以看到,当我更新父级中的 prop 对象时,该 prop 在子级中更新,但计算属性仅在加载时计算一次,然后从不重新计算,即使我使用 ',观察者也是如此deep',计算属性或监视对象永远不会被触发。

这是一个代码示例(假设 orderData 只是一些对象)

订单数据 {'test': 5}

父母

OrderForm(
  :orderData='orderData'
)

孩子

  computed: {
    orderJson() {
      console.log('computed')
      return JSON.stringify(this.orderData)
    }
  },
  props: ['orderData']

我也试过

  watch: {
    orderData: {
      handler(val, oldval) {
        console.log('hanlded')
        this.orderJson = JSON.stringify(val)
      },
      deep: true
    }
  }

在这两种情况下,我都没有在我的 vue 检查器中看到对 orderJson 的更新,有什么想法吗?

【问题讨论】:

  • 你在模板中使用orderJson吗?它仅在您在某处使用时更新计算
  • 另外你的第二次尝试也行不通。 可以为计算的 props 赋值,但前提是你这样声明它们:vuejs.org/v2/guide/computed.html#Computed-Setter
  • 抱歉,我没有包含完整的代码,但使用了计算属性

标签: vue.js


【解决方案1】:

尝试在您的 orderData 观察者中注销 this.orderJson

  watch: {
    orderData: {
      handler(val, oldval) {
        console.log(this.orderJson);
      },
      deep: true
    }
  }

计算的道具在被使用之前不会更新

编辑:这是一个简化的示例,我认为可以满足您的要求,尽管我不是 100% 清楚:https://codepen.io/codingcampbell/pen/219e1377e764659c16ebb8cefbca9ce9

【讨论】:

  • 计算的 prop orderJson 在模板中使用,如 v-model='orderJson',元素是输入
  • 尝试记录它.. v-model 无法正常工作,原因与您无法将值设置为计算值而不像这样声明它:vuejs.org/v2/guide/computed.html#Computed-Setter
  • 那么我可以使用计算属性还是必须使用观察者?
  • 我不清楚你想做什么。以:value="orderJson" 开头,而不是v-model
  • 如果有机会,请查看这些规则:vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats - 基本上,无法检测到新密钥,因此请确保它们在初始化时存在,或使用 Vue.set
猜你喜欢
  • 2021-06-10
  • 2022-11-17
  • 2015-09-20
  • 2018-02-07
相关资源
最近更新 更多