• vue中检测数组改变


    有两种情况变动的数组,是VUE不能检测到的,也不会触发视图的更新。

    • 通过索引直接设置项
    • 修改数组的长度 
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <script src = "https://unpkg.com/vue"></script>
    </head>
    <body>
        <div id="app">
            <h2>数组更新</h2>
            <ul>
                <li v-for="(item, index) in items" :key="index">{{item.name}}</li>
            </ul>
            <button @click="btnClick">通过索引直接设置项</button>
        </div>
        <script>
            var app = new Vue({
    			el: '#app',
    			data: {
    				items: [
                        {name: 'qqqqqqqqqq'},
                        {name: 'wwwwwwwwww'},
                        {name: 'eeeeeeeeee'}
                    ]
                },
                methods: {
                    btnClick() {
                        // this.items[0] = {name: '改变数组第一个值'}
                        this.items.push({name: '11111111111111111111111'})
                    }
                }
            })
        </script>
    </body>
    </html>
    

      这里,我想说的是第30行,注释那行,我正在验证数组变异的方法,所以30行和31行同时写上的,居然可以利用数组索引直接设置项,然后我就why?教程里说好的不能这样做的。。。

      后面注释了第31行,才没有设置成功的。这里,使用push()方法,改变数组也会触发视图更新,所以才导致了this.items[0] = {name: '改变数组第一个值'}这么做也能成功。

      以上,说明了我自己挖的这个坑的原因,那么,该怎么解决vue不能检测到通过索引直接设置项的问题呢,如下:

     第一种方法:

    btnClick() {
           this.$set(this.items, 0, {
           name: '通过this.$set去改变值'
       }
    }
    

     第二种方法:

    btnClick() {
           this.items.splice(0, 1, {
           name: '通过splice去改变值'
      }
    }
    

      第三种方法:

    btnClick() {
        this.items[0].name =  '改变数组第一个值'
    }
    

      那么,文章开头说的vue不能检测到修改数组长度,办法呢是用第二种中的splice()来解决。

  • 相关阅读:
    宏任务、微任务
    类和模块
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
  • 原文地址:https://www.cnblogs.com/ddkei/p/9362081.html
Copyright © 2020-2023  润新知