首页 > 其他分享 >实现vue2的响应式原理

实现vue2的响应式原理

时间:2024-06-18 17:11:53浏览次数:23  
标签:node function Depend key el 响应 vue2 原理 data

/**
 * 
 * 基本原理:
 *  1、通过Observer劫持data上的对象并监听data上的所有属性,遍历所有属性,并用Object.defineProperty转化为getter/setter,监听data上属性的的变化
 *  2、将data上的属性挂载到vue的实例上,实例化后可以在vue使用this访问data属性       
 *  3、使用Compiler解析模板
 *  4、Watcher:添加订阅者,访问和修改时update更新视图
 *  5、Depend:addSub管理订阅数据对象,数据变化时notify通知所有数据对象进行视图更新
 */
function myVue(options={}){
    this.$options = options;
    this.$data = typeof this.$options == 'function' ? this.options.data() : this.$options.data;
    this.$el = this.$options.el;
    // 将this.$data添加到响应式系统
    new Observer(this.$data)
    //将data上的属性添加到vue中
    this.$proxy();
    //解析模板
    new Compiler(this.$el,this.$data);
    this.$options.created.call(this);
}
myVue.prototype.$proxy = function () {
    Object.keys(this.$data).forEach(key=>{
        Object.defineProperty(this,key,{
            configurable:true,
            enumerable:true,
            set(val){
                this.$data[key] = val;
            },
            get(){
                return this.$data[key]
            }
        });
    })
}
// 响应式系统
function Observer($data){
    Object.keys($data).forEach(key=>{
        this.$ref($data,key,$data[key])
    })
}
Observer.prototype.$ref = function(_data,key,value){
    let dep = new Depend();
    Object.defineProperty(_data,key,{
        configurable:true,
        enumerable:true,
        set(val){
            if(value===val) return;
            value = val;
            dep.notify();
        },
        get(){
            Depend.target && dep.addSub(Depend.target)       
            return value
        }
    })
}
// 依赖
function Depend(){
    // 订阅者数组
    this.subs = []
}
// 添加订阅者
Depend.prototype.addSub = function(sub){
    this.subs.push(sub)
}
Depend.prototype.notify = function(){
    this.subs.forEach(sub=>{
        sub.update();
    })
}
// 订阅者
function Watcher(node,name,data){
    this.node = node;
    this.name = name;
    this.data = data;
    Depend.target = this;
    this.update();
    Depend.target = null;
}
Watcher.prototype.update = function(){
    if(this.node.nodeType===1){
        this.node.value = this.data[this.name]
    } else if (this.node.nodeType === 3){
        this.node.nodeValue = this.data[this.name]
    }
}
let reg = /\{\{(.+)\}\}/;
// 解析模板
function Compiler(el,data){
    this.el = document.querySelector(el);
    this.data = data;
    let frag = this.createFragment();
    this.el.appendChild(frag);
}
Compiler.prototype.createFragment = function(){
    let child;
    let frag = document.createDocumentFragment();
    while(child = this.el.firstChild){
        this._compiler(child);
        frag.appendChild(child);
    }
    return frag
    
}
Compiler.prototype._compiler = function(node){
    // 标签节点
    if(node.nodeType===1){
        node.childNodes.forEach(item=>{
            this._compiler(item);
        })
    // 文本节点
    }else if(node.nodeType===3){
        if(reg.test(node.nodeValue)){
            const name = reg.exec(node.nodeValue)[1]
            new Watcher(node,name,this.data)
        }

    }
}

 

myVue

标签:node,function,Depend,key,el,响应,vue2,原理,data
From: https://www.cnblogs.com/jzm2842688813/p/18254707

相关文章

  • DSP原理初步了解
    DSP原理初步了解目录DSP原理初步了解哈佛结构冯诺依曼结构哈佛结构改进的哈佛结构分布式处埋多总线结构Pipeline-流水线操作片内多块存储器ROM(Read-OnlyMemory)SARAM(StaticRandom-AccessMemory)DARAM(Dual-PortStaticRandom-AccessMemory)注意!!!!灵活的寻址......
  • Angular项目简单使用拦截器 httpClient 请求响应处理
    1:为啥要使用拦截器httpClient请求响应处理,其作用我们主要是:目前我的Angular版本是Angular17.3,版本中实现请求和响应的拦截处理了。这种机制非常适合添加如身份验证头、错误统一处理、日志记录等功能。======具体的操作步骤=======2:注入服务:nggsservices/myhttp-intercept......
  • 大语言模型中上下文窗口理解和实现原理
    本文由ChatMoney团队出品上下文窗口含义及其作用上下文窗口就像是语言模型在阅读和写作时使用的一个“记忆窗口”。想象一下你在读一本书的时候,为了理解某个句子,你可能需要回顾前面的一两句话来抓住它们之间的联系。同样,语言模型在预测或生成文本时,也需要查看前面的一定数量的......
  • 大语言模型中上下文窗口理解和实现原理
    本文由ChatMoney团队出品上下文窗口含义及其作用上下文窗口就像是语言模型在阅读和写作时使用的一个“记忆窗口”。想象一下你在读一本书的时候,为了理解某个句子,你可能需要回顾前面的一两句话来抓住它们之间的联系。同样,语言模型在预测或生成文本时,也需要查看前面的一定数量的......
  • 高速信号处理板卡设计原理图:519-基于ZU19EG的4路100G光纤的PCIe 加速计算卡
    基于ZU19EG的4路100G光纤的PCIe加速计算卡  一、板卡概述    本板卡系我司自主设计研发,基于Xilinx公司ZynqUltraScale+MPSOC系列SOCXCZU19EG-FFVC1760架构,支持PCIEGen3x16模式。其中,ARM端搭载一组64-bitDDR4,总容量达4GB,可稳定运行在2400MT/s,PL端......
  • JSON响应中提取特定的信息——6.14山大软院项目实训2
    在收到的JSON响应中提取特定的信息(如response字段中的文本)并进行输出,需要进行JSON解析。在Unity中,可以使用JsonUtility进行简单的解析,但由于JsonUtility对嵌套对象的支持有限,通常推荐使用第三方库如Newtonsoft.Json来处理复杂的JSON结构。首先,确保Unity项目中已经包含了Newton......
  • 由心知天气服务器响应的实时天气数据并进行JSON解析
    由心知天气服务器响应的实时天气数据并进行JSON解析#include<netinet/in.h>#include<arpa/inet.h>#include<stdio.h>#include<errno.h>#include<sys/socket.h>#include<netinet/in.h>#include<netinet/ip.h>#include<arpa/inet.h>......
  • LLM大模型: DPO原理和源码解析
     1、前段时间国外某大学反向抄袭国内某团队的大模型闹得沸沸扬扬,国内被抄袭的大模型是MiniCPM,详细资料:https://github.com/OpenBMB/MiniCPM;能被国外同行抄袭,必定有过人之处,粗略看了一下https://github.com/OpenBMB/MiniCPM/blob/main/model/modeling_minicpm.py模型文件,发......
  • 决策树算法介绍:原理与案例实现
    一、引言在机器学习领域,决策树是一种常用且直观的分类和回归方法。它通过一系列简单的决策规则,将数据集分割成更小的子集,最终形成一个树状结构。本文将详细介绍决策树算法的原理,并通过具体案例实现来帮助读者更好地理解和应用这一算法。二、决策树原理1.决策树的基本概念......
  • JMeter 响应断言详解:提升测试精度的利器
    前言在性能测试和功能测试中,响应断言是验证系统响应是否符合预期的重要手段。ApacheJMeter提供了丰富的断言功能,帮助测试工程师确保测试请求的响应数据正确、可靠。本文将详细介绍JMeter中响应断言的类型、配置方法以及最佳实践。什么是响应断言?响应断言用于验证JMeter发......