javaScript实现简单的vue3响应式功能

响应式:无需操作DOM,通过数据修改触发对应的页面修改

vue使用了Proxy  代理函数,Proxy  是一个构造函数,进行变量劫持定义,劫持整个对象的变化,弥补 defineProperty 函数的不足。

 // 基于构造函数创建一个被劫持的代理对象,对对象的所有操作进行拦截控制
new Proxy(target,{
      //      target 目标对象
    get( target,propName ){
     // 对象任何取值劫持函数,通过return对对应访问属性进行取值返回

    } 
    set( target,propName,newValue ){
    // 对象任何赋值劫持函数
    //target 被代理的对象
    //propName 当前正在操作的属性
    //newValue 赋值时的新数据


    }  

})
      
       
<div id="app">
        <h1 v-text="msg"></h1>
        <input type="text" oninput="setMsg(this.value)">
        <hr>
        <h1 v-text="info"></h1>
        <input type="text" oninput="setInfo(this.value)">
</div>

vue3响应式原理,简单实现完整代码

  let data = {
            msg:"msg",
            info:"info",
        }

// ----- 响应式 ----->
//将没有劫持的数据对象赋值作为中转数据对象使用
let _data = data;
//如果是vue2需要将对象数据重新赋值为{}
data = new Proxy({},{
     get(target,propName){
           return target[ propName ]
        },
     set(target,propName,newValue){
           target[ propName ] = newValue
      }
 })
let appDom = document.querySelector("#app")
// 循环对象获取所有对象属性
for (let key in _data) {
     let doms = appDom.querySelectorAll( `[v-text='${key}']` ) 
     doms.forEach(function(d){
         d.textContent = _data[key]
     })

    Object.defineProperty(data,key,{
       enumerable:true,
       configurable:true,
       get(){
            return _data[ key ]
       },
       set(nv){
            data[ key ] = nv;
            // 对当前属性对应的DOM元素进行更新
            doms.forEach(function(d){
                d.textContent = nv
            })
           }
    })

}
//  ----- 响应式 ----->
function setMsg(v){
    data.msg = v;
}

function setInfo(v){
    data.info = v;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue2和Vue3的响应式机制有一些区别。在Vue2中,使用Object.defineProperty来实现响应式,而在Vue3中,使用了新的Proxy和Reflect来实现响应式。 在Vue2中,通过Object.defineProperty将对象的属性转换为getter和setter,从而实现对属性的监听和响应。这种方式需要在初始化时递归遍历对象的所有属性,并将它们转换为getter和setter。这种方式存在一些限制,例如无法监听新增的属性和数组的变化。 而在Vue3中,使用Proxy和Reflect来实现响应式。Proxy可以拦截对对象的访问和修改操作,并在这些操作发生时触发相应的响应。相比于Vue2的Object.defineProperty,Proxy具有更强大的功能和更好的性能。它可以监听新增的属性和数组的变化,并且可以直接监听整个对象,而不需要递归遍历。 下面是一个简单的例子来说明Vue2和Vue3响应式的区别: Vue2响应式示例: ```javascript // Vue2 var data = { count: 0 }; var vm = new Vue({ data: data, created: function() { console.log('Vue2 created'); } }); console.log(vm.count); // 输出:0 vm.count = 1; // 修改属性值 console.log(vm.count); // 输出:1 ``` Vue3响应式示例: ```javascript // Vue3 import { reactive, watch } from 'vue'; var data = reactive({ count: 0 }); watch(() => { console.log('Vue3 created'); }); console.log(data.count); // 输出:0 data.count = 1; // 修改属性值 console.log(data.count); // 输出:1 ``` 在Vue2中,我们需要通过Vue实例来访问响应式的数据,并且需要在创建Vue实例时将数据传入。而在Vue3中,我们可以直接使用reactive函数将一个普通对象转换为响应式对象,并且可以直接访问响应式对象的属性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值