【问题标题】:Why is the computed property of this component not reactive:为什么这个组件的计算属性不是反应性的:
【发布时间】:2018-08-24 03:08:38
【问题描述】:

我有一个这样的对象:

  myObject: {
    items: [{
      title: '140',
      isActive: true,
    }, {
      title: '7',
      isActive: false
    }, {
      title: '10',
      isActive: false
    }]
  }

我是这样使用的:

<my-component :items="myObject.items"></my-component>

这是组件的样子:

<template>
  <div class="i-panel panel-container d-flex"
    <div
      v-for="item in prefs.items"
      class="panel-item"
      @click="onClick(item)">
      <!-- some content -->
    </div>
  </div>
</template>

<script>
export default {
  name: 'IPanel',
  props: {
    items: {
      type: Array,
      default () {
        return []
      }
    }
  },

  computed: {
    // code
    prefs () {
      return {
        items: this.items
      }
    }
  },

  methods: {
    onClick (item) {
      this.prefs.items.forEach(item => {
        if (JSON.stringify(item) === JSON.stringify(clickedItem)) {
          item.isActive = true
        }
      })
    }
  }
}
</script>

当我单击一个项目时(并且 itemclickedItem 相同),它应该变为 isActive true。确实如此。但我必须刷新 Vue devtools 或重新渲染页面才能使更改生效。

为什么item.isActive = true 没有反应性?

【问题讨论】:

  • 在您的 onClick 方法中,您使用的是 clickedItemobject,但我无法在任何地方看到它的定义

标签: vue.js vuejs2


【解决方案1】:

在您发布的代码中,您使用的是未在任何地方定义的 clickedItem 对象。我不知道这只是在写你的问题还是你的问题。

但是,当以正确的方式使用clickedItem 时,它似乎可以工作:https://jsfiddle.net/d5z93ygy/4/

HTML

<div id="app" class="i-panel panel-container d-flex">
    <div
      v-for="item in prefs.items"
      class="panel-item"
      @click="onClick(item)">
      <!-- some content -->{{ item.isActive ? 'active' : 'inactive' }}
    </div>
</div>

JS

new Vue({
    el: "#app",
  data: {
    items: [{
      title: '140',
      isActive: true,
    }, {
      title: '7',
      isActive: false
    }, {
      title: '10',
      isActive: false
    }]
  },
  computed: {
    // code
    prefs () {
      return {
        items: this.items
      }
    }
  },
  methods: {
    onClick (clickedItem) {
      this.prefs.items.forEach(item => {
        if (JSON.stringify(item) === JSON.stringify(clickedItem)) {
          item.isActive = true
        }
      })
    }
  }
})

【讨论】:

【解决方案2】:

改变

<div
  v-for="item in prefs.items"
  class="panel-item"
  @click="onClick(item)">
  <!-- some content -->
</div>

<div
  v-for="(item, index) in prefs.items"
  class="panel-item"
  @click="onClick(index)">
  <!-- some content -->
</div>

然后,在您的更改方法中,如下所示:

onClick (index) {
  Vue.set(this.items, index, true);
}

https://vuejs.org/v2/guide/list.html#Object-Change-Detection-Caveats

【讨论】:

    猜你喜欢
    • 2018-12-18
    • 2019-07-09
    • 2018-10-12
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多