【问题标题】:vuejs - computed is not working with propsvuejs - 计算不适用于道具
【发布时间】:2018-09-11 20:45:35
【问题描述】:

我正在使用道具来更新子组件中的网站内容。这基本上是这样工作的:

<child-component :updatedArray="updatedArray" />

然后在子组件中:

<template>
   {{updatedArray}}
   <div>{{computedArray}}</div>
</template>
<script>
   props: ['updatedArray'],
   ...
   computed: {
      computedArray() {
        if(this.updatedArray.item == "item one") {return "item one"}
       else {return "other item"}
       }
   }
</script>

现在,当我在父组件中更新 updatedArray 时,这段代码应该可以正常工作。然后我在我的子组件中看到我的{{updatedArray}} 正在正确更改,但我的computedArray 没有被触发并且不起作用。

我能问你为什么会这样吗? 计算是否不适用于每个道具更新?

我应该如何更正我的代码?

编辑:不重复 我没有改变道具,我只是根据它的值进行计算。

【问题讨论】:

  • 帮我们一点忙。该变量名为updatedArray,但您正在使用updatedArray.item 在其上测试一个键。 updatedArray 是什么?一个数组还是别的什么?
  • 其实这是一个对象 updatedArray: {item: "item1", item2: "item2"} etc..
  • @Sphinx 不是这种情况,我不是在改变道具,我只是根据它的值进行计算
  • 哈,需要绑定v-bind:updated-array="updatedArray"

标签: vue.js


【解决方案1】:

您的绑定使用了错误的名称。

正如Vue Guide 所述:

HTML 属性名称不区分大小写,因此浏览器会解释 任何大写字符为小写。这意味着当您使用 在 DOM 模板中,camelCased 的道具名称需要使用它们的 kebab-cases (连字符分隔)等价物

所以你需要将 camelCase 转换为 kebab-case

喜欢v-bind:updated-array 而不是v-bind:updatedArray

下面是一个使用 kebab-case 的工作演示。你可以把它改成camelCase,然后你会发现不行。

Vue.component('child', {

  template: '<div><span style="background-color:green">{{ updatedArray }}</span><div style="background-color:red">{{computedArray}}</div></div>',
  props: ['updatedArray'],
  computed: {
    computedArray() {
      if(this.updatedArray.item.length > 0) {return this.updatedArray}
      else {return "other item"}
    }
  }
})

new Vue({
  el: '#app',
  data() {
    return {testArray: {
      'item': 'test',
      'prop1': 'a'
    }}
  },
  methods:{
    resetArray: function() {
      this.testArray['item'] += this.testArray['prop1'] + 'b'
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
<button v-on:click="resetArray()">Click me</button>
<child v-bind:updated-array="testArray"></child>
</div>

【讨论】:

  • 谢谢你的回答,这可能是正确的,但它对我不起作用。我的子组件中有正确的 testArray 值。问题是我的计算看不到它已经改变:/我的意思是它看到但只有在子组件重新渲染时才能看到
  • 如果绑定正确,应该不会导致您遇到的问题。你能把你的代码改成kebab-case然后试一试吗?
  • 我做到了,但没有成功。但是我可以看到您的代码显然可以正常工作,因为我希望它可以正常工作。问题是为什么我的计算看不到对象值的变化
  • 真的,真的很简单,有什么问题吗? specPerson() { if (this.readyOffer.person == "physician"){ return 'physician' }else{ return 'nurse' } },
  • {{readyOffer.person}} 给出“医生” {{specPerson}} 给出“护士”:/ xD
猜你喜欢
  • 1970-01-01
  • 2020-05-26
  • 2021-04-12
  • 2019-12-15
  • 2019-05-08
  • 2019-03-01
  • 2013-06-22
  • 2022-09-28
  • 2017-01-08
相关资源
最近更新 更多