当前位置:  开发笔记 > 编程语言 > 正文

VueJS v-if = array [index]不起作用

如何解决《VueJSv-if=array[index]不起作用》经验,为你挑选了1个好方法。

当鼠标悬停在图像上时,我想制作一个获取文本框的组件.

下面是HTML模板.

{{ item.name }}

{{ item.content }}

以下是app.js

new Vue({
  el: '#app',
  data: {
    show: [false, false, false],
    items: [
      {
        name: 'Author 1',
        content: 'Content 1'
      },
      {
        name: 'Author 2',
        content: 'Content 2'
      },
      {
        name: 'Author 3',
        content: 'Content 3'
      }
    ]
  },
  methods: {
    changeStatus: function(index) {
      this.show[index] = !this.show[index];
      console.log(this.show); 
      console.log(this.show[index]);  // console gets it as expected
    }
  }
});

当我执行上面的代码时,我发现show属性已经改变.但是,v-if未更新.我们不能将数组[index]用于v-if或者还有其他原因吗?



1> CodinCat..:

问题不在v-if于此,因为Vue无法直接检测到数组元素的变化,这是JavaScript的局限之一.

因此,Vue为此提供了一些辅助函数,例如 Vue.set

改变这个 this.show[index] = !this.show[index]

Vue.set(this.show, index, !this.show[index])

那它应该工作.

Vue.set 不是唯一的解决方案,有几种方法可以实现这一点,万一你可能想知道.

您可以使用JavaScript数组的本机方法,Vue将挂钩这些方法,以便它可以检测到更改.

以下是使用示例 .splice

this.show.splice(index, 1, !this.show[index])

另一种方法是完全替换阵列.如果您使用的是ES6,则可以使用spread运算符轻松克隆阵列:

this.show[index] = !this.show[index]
this.show = [...this.show]

.map 也会工作,因为它返回一个新数组

this.show = this.show.map((el, i) =>
  i === index ? !el : el
)

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有