v-for更新检测

199 阅读1分钟

-v-for更新检测

1.数组的方法分为两种 第一种: 会改变原数组的元素值, 例如 reverse()、pop()、push()等 * 这种情况 v-for也会更新 第二种:不会改变原数组的元素值. 例如 slice() 、 filter() 、 concat()等 * 这种情况 v-for不会更新

2.总结 : 如果v-for没有更新. 可以覆盖整个数组, 或 使用 vue.$set() 强制更新

``

Snipaste_2022-11-03_21-36-24.png

<!-- HTML结构 -->
<div id="app">
    <ul>
        <li v-for="item in list" >
            {{ item }}
        </li>
    </ul>
    <button @click="revBtn">数组翻转</button>
    <button @click="sliceBtn">截取前2个</button>
    <button @click="updateBtn">更新第一个元素值</button>
</div>

<script>

    /* v-for更新检测
    1.数组的方法分为两种
        第一种: 会改变原数组的元素值, 例如  reverse()、pop()、push()等
            * 这种情况 v-for也会更新
        第二种:不会改变原数组的元素值. 例如  slice() 、 filter() 、 concat()等
            * 这种情况 v-for不会更新

    2.总结 : 如果v-for没有更新.  可以覆盖整个数组, 或 使用 vue.$set() 强制更新
    */
    /* 创建vue实例 */
    var app = new Vue({
        //el:挂载点
        el: '#app',
        //data: 要渲染的数据
        data: {
            list: [
                10,20,30,40,50
            ]
        },
        //methods:事件处理函数
        methods: {
            revBtn() {
                // 1. 数组翻转可以让v-for更新
                this.list.reverse()
            },
            sliceBtn() {
                // 2. 数组slice方法不会造成v-for更新
                /* 原因:slice没有改变原始数组,只是从原始数组中获取元素
                   解决方案: 覆盖原始数组
                */
                let newArr = this.list.slice(0, 2)
                this.list = newArr
            },
            updateBtn() {
                // 3. 替换元素值,不会造成v-for更新
                // this.list[0] = 88

                /* 解决方案: this.$set()
                参数1: 更新目标结构
                参数2: 更新位置
                参数3: 更新值
                */
                this.$set(this.list, 0, 88)
            }
        }
    })
</script>
复制代码

`

这些方法会触发数组改变, v-for会监测到并更新页面

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

这些方法不会触发v-for更新

  • slice()
  • filter()
  • concat()

注意: vue不能监测到数组里赋值的动作而更新, 如果需要请使用Vue.set() 或者this.$set(), 或者覆盖整个数组

总结: 改变原数组的方法才能让v-for更新