vue显示/隐藏元素的相关问题,数组已经改变但是对应的元素却没有隐藏?

问题:

点击按钮后发现console面板中arr的值已经改变了,为什么对应的列表没有隐藏呢?

要实现的功能:

点击按钮,相应的列表会隐藏
clipboard.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue测试</title>
    <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
</head>
<body>
    <div id="box">
        <button @click="show(0)">按钮一</button>
        <button @click="show(1)">按钮二</button>
        <button @click="show(2)">按钮三</button>

        <ul>
            <li v-show="arr[0]">11</li>
            <li v-show="arr[1]">22</li>
            <li v-show="arr[2]">33</li>
        </ul>
    </div>

<script type="text/javascript">
    new Vue({
        el:"#box",
        data:{
            arr:[true,true,true]
        },
        methods:{
            show:function(num){
               this.arr[num]=false;
               console.log(this.arr);
            }
        }
    })
</script>

</body>
</html>
阅读 4.4k
4 个回答
show:function(num){
   this.$set(this.arr, num, !this.arr[num])
}

vue监测不到arr[index]方式的改变
可用
this.$set(this.arr, num, !this.arr[num]) 或
this.arr.splice(num, 1, !this.arr[num])

这是因为JavaScript浏览器的限制,其实主要是 Object.observe() 方法支持的不好,数组中index都可以看做是属性,当添加属性并赋值时,Vue并不能检测到对象中属性的添加或者删除,但是其的确是添加或删除了,故我们可以通过console看到变化,但是就没有办法做到响应式。
楼主有兴趣去了解一下,这个和js的 Object.defineProperty方法有关:https://www.cnblogs.com/zhuzh...

需要这样写

<template>
  <div id="box">
    <button @click="show(0)">按钮一</button>
    <button @click="show(1)">按钮二</button>
    <button @click="show(2)">按钮三</button>
    <ul>
      <li v-show="arr[0]">11</li>
      <li v-show="arr[1]">22</li>
      <li v-show="arr[2]">33</li>
    </ul>
  </div>
</template>

<script>
  export default {
    name: 'vue_test1',
    data () {
      return {
        arr: [true, true, true]
      }
    },
    methods: {
      myTest () {
        alert('我是test里面的代码')
      },
      show (num) {
        this.$set(this.arr, num, !this.arr[num])//这个地方要用$set
        console.log(this.arr)
      }
    }
  }
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->

具体请看这个https://cn.vuejs.org/v2/api/#...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题