vue的响应式原理面试_vue面试题目

vue的响应式原理面试_vue面试题目coderwhyVue面试题-vue响应式原理笔记

大家好,又见面了,我是你们的朋友全栈君。

Vue的响应式原理

  • 数据发生改变,界面跟着更新,并不是理所当然的,Vue内部是做了很多封装的

依赖技术的分析和学习

  • 首先,来看一个最简单的Vue响应式例子:
 <div id="app">
        {
  
  {message}}
 </div>
   <script src='./js/vue.js'></script>
    <script> const app = new Vue({ 
      el: '#app', data: { 
      message: '哈哈哈哈', name: 'coderYYY' } }) </script>
  • 分析
    • 1.app.message修改数据,Vue内部是如何监听message数据的改变?
      • Vue2 -> object.defineProperty -> 监听对象属性的改变
      • Vue3 -> Proxy
    • 2.当数据发生改变,Vue是如何知道要通知哪些人,界面发生刷新?
      • 发布者订阅者模式
    const obj = { 
   
            message: '哈哈哈哈',
            name: 'yyy'
        }
        // 1.监听值的改变 -> Object.defineProperty(属性所在的对象,要添加或者修改的对象属性,属性描述符)
        Object.keys(obj).forEach(key => { 
   
            let value = obj[key]

            Object.defineProperty(obj, key, { 
   
                set(newValue) { 
   
                    console.log('监听' + key + '改变');
                    // 告诉谁?谁用告诉谁?谁在用?
                    // 根据解析html代码,获取到哪些人有用属性
                    // 张三/李四/王五 在用
                    value = newValue
                    // dep.notify()// 通知
                },
                get() { 
   
                    // 谁用一次就会调用一次get
                    // 张三: get -> update
                    // 李四: get -> update
                    // 王五: get -> update
                    console.log('获取' + key + '对应的值');
                    return value
                }
            })
        })
        // 2.发布者订阅者模式
        // 发布者
        class Dep { 
    // 存储所有对属性有依赖的东西
            constructor() { 
   
                this.subscribe = [] // subscribe 订阅 这个数组记录谁要订阅属性
            }
            addSub(watcher) { 
   
                this.subscribe.push(watcher)
            }
            notify(){ 
   
                this.subscribe.forEach(item=>{ 
   
                    item.update()
                })
            }
        }
        const dep = new Dep()
        // 订阅者
        class Watcher { 
   
            constructor(name) { 
   
                this.name = name;
            }
            update() { 
   
                console.log(this.name + '发生update');
            }
        }
        const w1 = new Watcher('张三')
        dep.addSub(w1)
        const w2 = new Watcher('李四')
        dep.addSub(w2)
        const w3 = new Watcher('王五')
        dep.addSub(w3)
        dep.notify()

在这里插入图片描述
在这里插入图片描述

通过图解理解过程

在这里插入图片描述

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

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

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


相关推荐

  • 动态注册广播接收器_ip广播系统软件v2.3说明书

    动态注册广播接收器_ip广播系统软件v2.3说明书从registerReceiver(BroadcastReceiverreceiver,IntentFilterfilter)出发所经历的类和方法:registerReceiver(receiver,filter)–>ContextWrapper.java$registerReceiver(receiver,filter);@OverridepublicIntentregis…

    2025年11月1日
    3
  • quicktime player屏幕录制_电脑自带录屏怎么使用

    quicktime player屏幕录制_电脑自带录屏怎么使用Mac电脑用自带软件QuickTimePlayer进行录屏的教程,几步就可以学会,挺简单的。  1、首先,找到并打开QuickTimePlayer软件。可以鼠标右键这个图标,选择“选项”-“在程序坞中保留”,这样,软件就固定在了Dock栏,方便以后打开软件。  2、启动软件后,屏幕顶部左上角出现“QuickTimePlayer”栏目。  3、这时,我们点击屏幕左上角“QuickTimePlayer”栏目右边的“文件”选项,选择“新建屏幕录制”菜单项。  4、这时,屏…

    2022年9月13日
    3
  • python txt读取_python读取本地文件

    python txt读取_python读取本地文件以下代码为1:新建onefile.txt文件2:向onefile.txt文件中写入数据3:尝试读取新建文件的所有数据4:尝试读取该文件指定数据5:拷贝onefile.txt至新建twofile.txt文件,并且统计行数与字节长度下面该代码为第1,2,3,4项把代码复制,并创建test.py文件,然后在当前文件夹中的终端执行python3test.py即可#打开文件,并且写入6.2文件的基本处理defmain():#第一步打开文件#打开文件open()

    2022年9月29日
    3
  • [Android] Bitmap的内存计算

    本文聚焦的问题1、Bitmap中像素数据占用多大内存?如何计算?2、不同图片来源对内存大小有什么影响?Bitmap bitmap = Bitmap.createBitmap(100,100,Bitmap.Config.ARGB_8888);依然以如此声明一个bitmap为例,参数就决定了bitmap的大小。(以Android 8.0+平台为例,这行代码执行后占用的总内存大小=bitmap在…

    2022年3月11日
    63
  • 时序数据库 日志_mysql恢复数据库

    时序数据库 日志_mysql恢复数据库1.基础1.1时序数据的定义什么是时间序列数据(TimeSeriesData,TSD,以下简称时序)从定义上来说,就是一串按时间维度索引的数据。用描述性的语言来解释什么是时序数据,简单的说,就是这类数据描述了某个被测量的主体在一个时间范围内的每个时间点上的测量值。它普遍存在于IT基础设施、运维监控系统和物联网中。对时序数据进行建模的话,会包含三个重要部分,分别是:主体,时间点和测量值。套用这…

    2022年10月4日
    3
  • 【springmvc】拦截器Interceptor的使用与源码分析

    【springmvc】拦截器Interceptor的使用与源码分析拦截器Interceptor的使用自定义拦截器需要实现HandlerInterceptor接口。packagecom.morris.spring.mvc.interceptor;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;importjavax.servlet.http.HttpServletRequest;imp

    2022年7月25日
    9

发表回复

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

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