面试官:说说Vue响应式原理

面试官:说说Vue响应式原理Vue2 和 Vue3 的响应式原理前言 vue2 的响应式原理主要使用的是 Object defineProper 里面需要传入三个参数 分别是 响应源数据的对象 源数据中的需要读写的属性 相对应的对象方法 包含了 get 和 set 方法 vue3 的响应式原理主要依靠的是 ES6 新增的 Proxy 方法 需要在 Proxy 的实例对象中传入两个参数 源数据对象 处理对象的方法 get set deleteProper 等 从自己个人来说 vue3 感觉比 vue2 更简单了 很多方法封装的更方便使用可以直接在

前言:

经常有面试官会问“你能说说vue的响应式原理吗?很多不明就里的人会说是v-model,其实面试官想问的是vue能实现响应式使用的是JS中的什么API,而且v-model这个属于双向数据绑定和面试官所问的的vue的响应式原理属于牛头不对马嘴了很容易给面试官留下不好的印象,关于v-model的解释,大家可以直接去vue官方看一下,我们这里主要解析一下vue的响应式原理。资料来自B站尚硅谷,喜欢vue的小伙伴可以在哔哩哔哩直接搜索尚硅谷的vue教程,里面有一个叫姓张的老师讲的挺好的(具体叫什么名字我忘了),建议大家去B站看看。
接下来我们分别介绍一下vue2和vue3的响应式原理

响应式浅析(谨记加粗的位置)

vue2

vue2的响应式原理主要使用的是Object.defineProperty( ),里面需要传入三个参数,分别是:
【响应源数据的对象,源数据中的需要读写的属性,相对应的对象方法(包含了get和set方法)】

vue3

vue3的响应式原理主要依靠的是ES6新增的 Proxy 以及相配合的 Reflect,需要在Proxy的实例对象中传入两个参数
【源数据对象,处理对象的方法【get,set,deleteProperty…等】

vue响应式原理示例

下面通过两个实例我们分别来看看vue2和vue3的响应式原理

一、vue2响应式原理

vue2响应式简例
//源数据 let person = { 
    name:'张三', age:18 } //模拟Vue2中实现响应式 let p = { 
   } Object.defineProperty(p,'name',{ 
    configurable:true, get(){ 
    //有人读取name时调用 console.log('调用了get方法,获取了name属性') return person.name }, set(value){ 
    //有人修改name时调用 console.log('调用了set方法,修改了name属性') person.name = value } }) Object.defineProperty(p,'age',{ 
    get(){ 
    //有人读取age时调用 return person.age }, set(value){ 
    //有人修改age时调用 console.log('调用了set方法,修改了age属性') person.age = value } }) console.log(p.name = '李四') //调用Object.defineProperty中的set方法修改数据 console.log(p.name) //调用Object.defineProperty中的get方法获取数据 
vue2响应式分析总结

在上面的示例中,我们利用了JS对象中的defineProperty()方法对对象person进行了数据劫持,当我们改变空对象p的时候,可以发现person对象中的数据也在跟着改变,这种方法的意义主要在于看我们劫持的是person对象中的哪一个数据,通过在defineProperty()传入的第三个对象中定义的get(),set(),使用delete,我们达到对源数据达到增删改查的目的,这里面比较特殊的是delete关键字(删除对象某个属性),我们需要使用 【configurable:true】这个参数才能真正的删除数据。而我们使用console.log()的输出位置就可以我们作为真正更换数据渲染页面时需要做的一些逻辑处理。我们可以直接打开浏览器的控制台,一些简单的增删改查来验证这个响应式

二、 vue3响应式原理

vue3响应式简例
 //模拟Vue3中实现响应式 //源数据 let person = { 
    name:'张三', age:18 } const p = new Proxy(person,{ 
    //有人读取p的某个属性时调用 get(target,propName){ 
    console.log(`有人读取了p身上的${ 
     propName}属性`) return Reflect.get(target,propName) }, //有人修改p的某个属性、或给p追加某个属性时调用 set(target,propName,value){ 
    console.log(`有人修改了p身上的${ 
     propName}属性,我要去更新界面了!`) Reflect.set(target,propName,value) }, //有人删除p的某个属性时调用 deleteProperty(target,propName){ 
    console.log(`有人删除了p身上的${ 
     propName}属性,我要去更新界面了!`) return Reflect.deleteProperty(target,propName) } }) console.log(p.name) //读取到name的时候会调用实例身上的get方法 console.log(p.name = '李斯特') //修改name的时候调用实例身上的set方法 console.log(p.name) //读取到name的时候会调用实例身上的get方法获取到的是修改后的数据 console.log(delete p.age) //删除属性的时候会调用deleteProperty方法 
vue3响应式分析总结

通过上面的一个简单示例,我们可以清楚发现,vue3的响应式相对于vue2来说简洁了很多,主要体现的地方就是我们用了Proxy的实例对象之后,不需要在单独的想vue2之中那样(使用的defineProperty)需要特意去知名监控某个对象的变化(name、age属性)。这个是很重要的一个变化。我们一定要谨记。希望能看到这里小伙伴以后面试遇到该类问题的时候都能轻松惬意娓娓道来。

最后

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232624.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • php工厂模式详解

    php工厂模式详解工厂类就是一个专门用来创建其它对象的类,工厂类在多态性编程实践中是非常重要的。它允许动态替换类,修改配置,会使应用程序更加灵活。掌握工厂模式对Web开发是必不可少的。工厂模式通常用来返回类似接口的不同的类,工厂的一种常见用法就是创建多态的提供者。通常工厂模式有一个关键的构造,即一般被命名为factory的静态方法。这个静态方法可以接受任意数量的参数,并且必须返回一个对象。P

    2022年7月25日
    10
  • Linux下LAMP的配置详解

    Linux下LAMP的配置详解LAMP的搭建需要安装httpd  phpmysql 三个程序安装完以后先修改httpd的配置文件首先先修改全局配置文件 也就是主配置文件/etc/httpd/conf/httpd.conf将ServerRoot改为ServerRoot"/etc/httpd"将Listen改为Listen80将网站的根目录改为DocumentRoot"/var/www/html"将默认配置索引文件改…

    2022年6月6日
    38
  • php递归算法经典实例_递归算法1加到100

    php递归算法经典实例_递归算法1加到100在前面的文章《PHP递归算法(一)》中,我们为大家介绍了如何利用静态变量的方法来实现递归算法。本篇文章我们就继续为大家介绍另一种实现递归算法的方法即通过全局变量的方法。下面我们结合代码示例,为大家介绍通过全局变量Global实现递归的方法。代码如下:…

    2022年8月11日
    5
  • 贝叶斯公式的理解【转】

    贝叶斯公式的理解【转】本文转载自:https://blog.csdn.net/qq_37953276/article/details/79297316作者:知乎用户 链接:https://www.zhihu.com/question/21134457/answer/169523403来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。最近我自己在学习一些关于机器学习的东西,…

    2022年5月5日
    56
  • github:pycharm 2021激活码【在线注册码/序列号/破解码】

    github:pycharm 2021激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    45
  • 深入FFM原理与实践(美团点评技术)

    深入FFM原理与实践(美团点评技术)from: https://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.htmlFM和FFM模型是最近几年提出的模型,凭借其在数据量比较大并且特征稀疏的情况下,仍然能够得到优秀的性能和效果的特性,屡次在各大公司举办的CTR预估比赛中获得不错的战绩。美团点评技术团队在搭建DSP的过程中,探索并使用了FM

    2022年5月5日
    71

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号