浅谈vue数据劫持(2)


theme: healer-readable

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

前言:

  • 上一篇讲解了defineProperty方法今天来讲讲proxy

  • vue3中数据劫持使用了proxy主要是因为defineProperty有几项缺点

    • 新增属性,删除属性
    • 直接通过下标修改数组
  • defineProperty缺点讲解

    //先回顾上期知识点       let person = {        name:'vike',        age:5   } ​    // 回顾上篇defineProperty方法    let p = {}    // name属性    Object.defineProperty(p,'name',{        get(){            console.log('读取name属性')            return person.name       },        set(newValue){            console.log('修改name属性')            person.name = newValue       }   })    // age属性    Object.defineProperty(p,'age',{        get(){            console.log('读取age属性')            return person.age       },        set(newValue){            console.log('修改age属性')            person.age = newValue       }   })

image-20210810093626476.png

  • 新增属性

    • 没有进行数据劫持 不能成为响应式数据

image-20210810093922717.png

  • 删除属性

    • 使用delete关键字删除属性,返回flase。
    • delete 删除会返回true或者flase。删完了为true,删不掉为false
    • 在Object.defineProperty配置项内多加一行configurable:true,即可删除
    • delete删除p上属性不会影响person上的属性,主要原因是无法捕获这个变化

image-20210810094133057.png

image-20210810094606508.png

proxy讲解

  • window.Proxy为内置函数

    • 使用实例

    let person = {        name:'vike',        age:5   } ​    // proxy作用 让p映射person 第一个参数为要映射的对象 第二参数可为空对象占位    let p = new Proxy(person,{})

image-20210810095731094.png

-   Proxy里的Handler 对属性进行增删改查操作靠这里面的配置

-   Proxy里的Target 属性

    -   取值方法 p.name p.age

-   新增 修改 删除 proxy代理实现

image-20210810100449035.png

-   proxy捕获数据

    ```
     // 源对象
        let person = {
            name:'vike',
            age:5
        }
    ​
        // 代理对象
        let p = new Proxy(person,{
            // get 上有两个参数 target是newProxy传入的对象 propName是读取的属性
            // 读取属性触发
            get(target,propName){
                console.log(`读取了${propName}属性`)
                return target[propName]
            },
            // set上新增了newValue属性 修改和新增触发
            set(target,propName,newValue){
                console.log(`修改了${propName}属性`)
                target[propName] = newValue
            },
            // deleteProperty 删除属性触发
            deleteProperty(target,propName) {
                console.log(`删除了${propName}属性`)
                delete target[propName]
            }
        })
    ```

image-20210810102150988.png

-   delete p.name返回false是因为deleteProperty方法没返回,只要`return delete target[propName]`

### Reflect 介绍

-   ES6新增

-   ECMA正尝试把Object上的方法移植到Reflect上

image-20210810104307333.png

-   Reflect方法上也包含defineProperty 且有返回值 true表示成功,false表示失败

    ```
        let person = {
            name:'vike',
            age:5
        }
    ​
        let p1 = Reflect.defineProperty(person,'sex',{
            get() {
                return '男'
            }
        })
    ​
        let p2 = Reflect.defineProperty(person,'sex',{
            get() {
                return '女'
            }
        })
    ​
        console.log(p1,p2)
    ```

image-20210810104738379.png

-   对比Object.defineProperty 会直接报错且不执行下面代码

    ```
        let person = {
            name:'vike',
            age:5
        }
    ​
        Object.defineProperty(person,'sex',{
            get() {
                return '男'
            }
        })
    ​
        Object.defineProperty(person,'sex',{
            get() {
                return '女'
            }
        })
    ```

image-20210810105021217.png

总结

  • Reflect和Object来说,框架封装更需要健壮性强的Reflect
  • Proxy处理响应式数据更具优势
  • Object.defineProperty那些缺点在vue框架里也提供了相应的api进行解决
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Vue时,有时候会遇到获得后台数据无法显示到table上面的问题,这是因为可能存在一些常见的坑。 首先,如果后台返回的数据是异步获取的,需要在Vue的生命周期钩子函数中设置一些延时,以确保在数据到达之后再进行操作。例如,在created钩子函数中,可以使用setTimeout来延迟某些操作,等待数据的返回。这样可以避免数据还未到达就渲染表格导致出错。 其次,需要确保在Vue组件中正确地绑定数据。在Vue的el选项中指定的DOM元素内使用v-for指令循环遍历数据,并在表格的相应位置使用{{}}语法将数据绑定。如果没有正确绑定数据,那么即使数据已经获取到了,也无法显示在表格上。 此外,还需要注意表格中的属性绑定是否正确。例如,如果要使用v-bind指令将数据绑定到表格的class、style等属性上,需要确保语法正确且数据的值符合要求。如果属性绑定的值不正确,会导致数据无法显示在表格上或者显示不符合预期的结果。 最后,还需要检查一下浏览器的控制台输出,看是否有相关的错误提示。如果有报错信息,可以根据报错信息来确定问题所在。有时候可能是因为语法错误、变量名错误或者其他错误导致数据无法显示。 综上所述,浅谈了一些可能导致Vue无法将后台数据显示到表格上的常见坑。在使用Vue获得后台数据时,需要仔细检查数据绑定、属性绑定、延时等问题,以保证数据能够正确显示在表格上。同时,也要留意浏览器控制台的报错信息,及时解决可能出现的错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值