vue中检测数组改变
有两种情况变动的数组,是VUE不能检测到的,也不会触发视图的更新。
- 通过索引直接设置项
- 修改数组的长度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <!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不能检测到通过索引直接设置项的问题呢,如下:
第一种方法:
1 2 3 4 5 | btnClick() { this .$set( this .items, 0, { name: '通过this.$set去改变值' } } |
第二种方法:
1 2 3 4 5 | btnClick() { this .items.splice(0, 1, { name: '通过splice去改变值' } } |
第三种方法:
1 2 3 | btnClick() { this .items[0].name = '改变数组第一个值' } |
那么,文章开头说的vue不能检测到修改数组长度,办法呢是用第二种中的splice()来解决。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步