vue---基本原理

1、vue的基本原理

        当创建一个vue实例的时候,vue会先遍历data中的属性,用Object.defineProperty(vue3是proxy),将属性转换为getter/setter,并且在内部追踪相关依赖,在属性被访问和修改时通知变化。同时,每个组件实例都有相应的watcher程序实例,它会在组件渲染的过程中把属性记录为依赖,之后,当依赖项的setter被调用的时候,会通知watcher重新计算,从而使它关联的组件得以更新。

2、双向数据绑定的原理

        vue的双向数据绑定采取的是数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各属性的setter和getter,在数据变动时,发布消息给订阅者,触发相应的监听回调。主要有以下几步骤:

  • 对需要observe的数据对象和子属性对象的属性进行递归遍历,加上getter和setter方法,这样,为对象进行赋值的时候,就会触发setter,这时就可以监听到数据的变化。
  • 利用complie解析模板指令,将模板中的变量替换为数据,然后初始化渲染页面,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据变动,收到通知后,即更新视图。
  • watcher订阅者是observer和complie之间通信的桥梁,主要负责:在自身实例化时,往属性订阅器(dep)里面添加自己;自身必须拥有一个update()方法;待属性变动dep.notice()通知时,能调用自身的update()方法,并触发complie中绑定的回调。
  • MVVM作为数据绑定的入口,整合observer、complie和watcher三者,通过observer来监听自己的model数据变化,通过complie来解析编译模板指令,最终利用watcher搭起observer和complie之间的通信桥梁,达到数据变化->视图更新,视图变化->数据变化的双向绑定效果。

3、使用Object.defineProperty()进行数据劫持的缺点

         在对一些属性进行操作时,使用这种方法无法拦截,如通过下标修改数组数据或给对象新增属性,都不能触发组件重新渲染。对于数组而言,大部分操作均无法拦截,只是vue内部通过重写函数的方式解决了该问题。在vue3中,通过采用proxy对对象进行代理,从而实现数据劫持。使用proxy的好处是可以完美的监听到任何方式的数据改变,缺点是兼容问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值