数据响应 vue2 $set和vue3 reactive

vue 里面常用的就是数据响应,理解原理才是最重要的。

下面是介绍,向响应式对象中添加一个 property,并确保这个新 property 同样是响应式的,且触发视图更新

vue2和vue3的不同实现方式

手动实现数据响应,练习vue2的 Object.defineProperty,代码如下:

案例思路:在input框中输入内容,p标签显示input框输入的内容

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <p class="result"></p>
        <input type="text" name="" class="ipt1">
    </div>
</body>

<script>
    class Test {
        constructor() {
            this.result = document.getElementsByClassName('result')[0];
            this.ipt1 = document.getElementsByClassName('ipt1')[0];
            this.data = this.defineData();
        }
        init() {
            //添加input事件
            this.ipt1.addEventListener('input', this.handleInput.bind(this), false);
        }
        defineData() {
            let _obj = {};
            let name = '';
            let age = '';
            
            Object.defineProperties(_obj,{
                name:{
                    get(){
                        return name;
                    },
                    set(newVal){
                        name=newVal;
                    }
                },
                age:{
                    get(){
                        return age;
                    },
                    set(newVal){
                        age=newVal;
                    }
                }
            });
            //返回新的对象
            return _obj;
        }
        handleInput(e) {
            console.log("能进来吗", e.target.value);
            this.data.name = e.target.value;
            this.result.innerHTML = this.data.name;
        }
    }
    //需要new 构造函数,再执行这个方法
    new Test().init();
</script>

</html>

练习vue3 的 通过proxy(ES6提供)实现数据响应E

ES6 阮一峰书中介绍, 

1. Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”

2. Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截。因此提供了一种机制,可以对外界的访问进行过滤和改写

    let obj = {
        a : 1
    }
    let proxyObj = new Proxy(obj,{
        get : function (target,prop) {
            return prop in target ? target[prop] : 0
        },
        set : function (target,prop,value) {
            target[prop] = 888;
        }
    })
    
    console.log(proxyObj.a);        // 1
    console.log(proxyObj.b);        // 0

    proxyObj.a = 666;
    console.log(proxyObj.a)         // 888

不难看出,对obj这个对象做出了代理后,取属性时( proxyObj.a ),存在就返回值,不存在则返回0(以前默认都是undefined) ,给属性a设置值时,通都为888

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

tengyuxin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值