解析Vue为什么重写原数组函数方法

1、操作数组函数后---修改原有数据(被Vue重写)

push 、pop 、shift 、unshift 、splice 、sort 、reverse

2、操作数组函数后---生成新数组

filter 、concat 、slice

3、解析原因

  •  this.persons[0].name = '马老师'      通过直接修改数组里面对象的值,页面模改变
  •  this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'}    通过索引改数组的值,页面模板不变 ------------------------ 因为Vue用数据代理Object.defineProperty get()、set() 进行模板更新,而原生的数组方法无法实现这一点【如果数组每一个都加get、set,那么会严重影响代码效率】

=============== 怎么办????============

所以,Vue重写了push、pop等函数方法、例子如下:

通过重写后,vue虽然不能通过索引改变模板,但是可以操作上面的7个函数方法进行修改

4、原生数组函数方法演示

         <div class="a"></div>

        a = document.querySelector('.a')

        arr = [1, 23, 345, 64]

        a.innerHTML = arr[1]

 上面可以看得出来,页面的模板并没有改变

6、源码

<div id="root">
        <h2>人员列表</h2>
        <button @click="updateMei">更新马冬梅的信息</button>
        <ul>
            <li v-for="(p,index) of persons" :key="p.id">
                {{p.name}}-{{p.age}}-{{p.sex}}
            </li>
        </ul>
    </div>
    <div class="a"></div>
a = document.querySelector('.a')
        arr = [1, 23, 345, 64]
        a.innerHTML = arr[1]


        Vue.config.productionTip = false

        const vm = new Vue({
            el: '#root',
            data: {
                persons: [{
                    id: '001',
                    name: '马冬梅',
                    age: 30,
                    sex: '女'
                }, {
                    id: '002',
                    name: '周冬雨',
                    age: 31,
                    sex: '女'
                }, {
                    id: '003',
                    name: '周杰伦',
                    age: 18,
                    sex: '男'
                }, {
                    id: '004',
                    name: '温兆伦',
                    age: 19,
                    sex: '男'
                }]
            },
            methods: {
                updateMei() {
                    // this.persons[0].name = '马老师' //奏效
                    // this.persons[0].age = 50 //奏效
                    // this.persons[0].sex = '男' //奏效
                    // this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'} //不奏效

                    // push pop shift unshift sort reverse splice可以改变原数组,且页面有反应,直接赋值没有反应
                    // 【所以Vue从新写了Vue数组函数,为什么,因为原数组函数里面的值改变了,但是没有更新在页面上】
                    // 【Vue重写的数组函数:1、调用原来的数组函数push等等对数组进行变化   2、重新解析模板】
                    // 还有Vue.set()也可以更改数组
                    this.persons.splice(0, 1, {
                        id: '001',
                        name: '马老师',
                        age: 50,
                        sex: '男'
                    })
                }
            }
        })
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打不着的大喇叭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值