Vue响应式底层原理

1、核心逻辑

发布订阅模式 + 数据劫持

2、代码实现

2.1、发布订阅

/**
 * 发布订阅器
 */
let Dep = {
    //容器:保存所有订阅者的列表
    clientList: {},
    //订阅方法
    listen: function(key, fn){
        (this.clientList[key] || (this.clientList[key] = [])).push(fn);
    },
    //发布方法
    trrigger: function(){
        //获取key
        let key = Array.prototype.shift.call(arguments);
        //获取方法
        let fns = this.clientList[key];
        if(!fns || fns.length === 0){
            return false;
        }else{
            for(let i = 0; i < fns.length; i++){
                let fn = fns[i];
                fn.apply(this, arguments);
            }
        }
    }
}

2.2、数据劫持

/**
 * 数据劫持
 */
let dataHijack = function({data, key, tag, selector}){
    //数据信息
    let value = "";
    let element = document.querySelector(selector);

    //数据劫持
    Object.defineProperty(data, key, {
        get(){
            console.log("获取值");
            return value;
        },
        set(newVal){
            value = newVal;
            console.log("设置值");
            //发布方法
            Dep.trrigger(tag, newVal);
            return value;
        }
    });

    //订阅方法
    Dep.listen(tag, function(text){
        element.innerHTML = text;
    });
}

2.3、HTML页面使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
       <div>订阅视图1:<span class="box-1"></span></div>
       <div>订阅视图2:<span class="box-2"></span></div>
    </div>
</body>
<script type="text/javascript" src="./index.js"></script>
<script>

    //数据信息
    var obj = {};

    //订阅第一个
    dataHijack({
        data: obj,
        key: "one",
        tag: "view-1",
        selector: ".box-1"
    });

    //订阅第二个
    dataHijack({
        data: obj,
        key: "two",
        tag: "view-2",
        selector: ".box-2"
    });

</script>
</html>

2.4、验证

3、注意

需要先订阅在发布才能生效

yanmoz_web
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vue响应式 底层原理
oneorang的博客
04-24 123
页面端 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> 订阅发布1:&
Vue 响应式实现原理深入浅出
小王的技术库
09-30 2399
vue 是一个易上手的框架,许多便捷功能都在其内部做了集成,其中最有区别性的功能就是其潜藏于底层响应式系统。组件状态都是响应式JavaScript 对象。当更改它们时,视图会随即更新,这让状态管理更加简单直观。那么,Vue 响应性系统是如何实现的呢?本文也是在阅读了 Vue 源码后的理解以及模仿实现,所以跟随作者的思路,我们一起由浅入深的探索一下vue吧!本文 Vue 源码版本:2.6.14,为了便于理解,代码都最简化。方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
响应式原理
丫丫不秃头噢---
09-14 4247
响应式原理 vue2 vue2中使用了ES5里面的Object.defineProperty方法,给对应data中的数据的每个值添加了set和get方法,当值被修改时,就会触发对应的set方法,set方法里会通知独影的watcher,watcher接收后将触发render函数,重新渲染数据。 vue3 vue3里面是改用ES6里面的特性proxy来实现对应的给数据添加set和get方法的操作。 ...
Vue响应式原理
最新发布
HHR_hr的博客
07-28 1258
handler(操作者)可以接收事件对象作为参数,‌并根据需要传入其他参数组合式API避免代码重复和冗余,‌提高代码的重用性和可维护性。
Vue2.0响应式底层原理
weixin_47872937的博客
09-10 631
Vue2响应式原理Vue2的数据代理主要用到了Object.define.Property()......
vue响应式原理
2401_84341405的博客
07-27 1475
理解 MVVM 结构:Vue 是一个典型的 MVVM 框架,它将数据层、视图层和数据-视图层进行了良好的分离,使得前端开发更加清晰和高效掌握响应式原理响应式原理Vue 实现数据驱动视图的关键,通过数据劫持和依赖追踪,实现了数据与视图之间的自动更新,为构建动态、交互式的用户界面提供了强大的支持熟悉实现方式:在 Vue 2 中,响应式原理是基于实现的,它具有一定的局限性和缺点,比如无法监听数组变化和兼容性问题。而在 Vue 3 中,采用了基于Proxy的方式,提供了更灵活、高效的响应式系统。
Vue实现双向绑定的原理以及响应式数据的方法
12-12
Vue中,数据的响应式处理主要通过对象和数组的变异方法来实现。下面我们将详细讨论Vue如何实现双向绑定和响应式数据。 首先,我们来看对象的响应式实现。Vue在初始化时,通过`Object.defineProperty()`这个ES5...
浅谈Vue响应式原理
10-16
让我们深入探讨Vue响应式原理及其底层实现。 首先,Vue采用的是MVVM(Model-View-ViewModel)架构模式。在Vue中,View层是DOM对象的HTML,ViewModel层是Vue实例的vm对象,而Model层则包含data、computed、methods等...
Vue底层实现原理 - 深入响应式原理
极客不撩妹
08-06 1050
深入响应式原理写在前面如何追踪变化检测变化的注意事项对于对象对于数组声明响应式 property异步更新队列 写在前面 本篇是Vue底层原理的学习笔记,想要用好一个工具,最重要的就是能理解他的内在原理,所以在用了Vue小半年后,我决定好好研究一下Vue响应式原理。 如何追踪变化 当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty 把这些 property 全部转为 getter
三、【Vue3】——Vue2与Vue3响应式原理区别
yifei1234567的博客
03-30 4956
Vue2实现响应式原理使用的是Object.defineProperty()对对象中某个属性的读取、修改进行拦截,存在新增和删除缺陷。而Vue3实现响应式原理使用的是Proxy代理,拦截对象中任意属性的变化;
Vue响应式原理
wchg21131的博客
06-30 628
首先我们先来看一下最开始提出的问题。第一个:给属性重新赋值成对象,是否是响应式的?答案:是响应式的。应当我们给data中的属性进行重新赋值的时候,会执行Observer类中的方法的set方法在set方法中,调用了walk方法,该方法中判断重新给data属性中赋的值是否为对象,如果是对象,会将对象中的每个属性都修改成响应式的。第二个问题:给Vue实例新增一个成员是否是响应式的?//给Vue实例新增加了一个属性test属性 vm . test = "abc";在index.html。
深入浅出 Vue 响应式原理
CSDN资讯
07-15 3532
作者 | 浪里行舟 责编 | 胡巍巍 Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。这使得状态管理非常简单直接,不过理解其工作原理同样重要,这样你可以避开一些常见的问题。本文将针对响应式原理做一个详细介绍,并且带你实现一个基础版的响应式系统。 什么是响应式 我们先来看个例子: ...
关于Vue刷新页面的机制,深入了解响应式原理
Church_T的博客
08-27 2401
现在是时候深入一下了!Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。这使得状态管理非常简单直接,不过理解其工作原理同样重要,这样你可以避开一些常见的问题。在这个章节,我们将研究一下 Vue 响应式系统的底层的细节。 如何追踪变化 当你把一个普通的 JavaScript 对象传入 Vue 实例作为data选项,Vue 将遍历此对象所有的 property,并使用Object.defineProperty...
Vue3响应式原理分析(reactive,ref,computed底层实现)
m0_56344602的博客
05-25 3721
本文主要介绍Vue3响应式原理的实现,最后会以demo的形式一步步带你实现 reactive ref computed底层实现步骤。
vue底层-响应式原理
挥别了青春的博客
08-17 434
先简单了解下object.defineProperty方法 // Object.defineProperty方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。 // get 方法 使用该属性的时候会调用get方法 // set 方法 修改或者赋值该属性时调用该方法 Object.defineProperty(obj, key, { enumerable: ...
vue响应式原理
垂耳兔的博客
04-28 8829
一、reduce 1.数值的累加 作用:将****前一项*和*后一项****的值进行运算,返回累积的结果 格式:数组.reduce(function(prev,next){…}) 其中,prev表示前一项,next表示后一项。 运算规则: 默认情况下,会把数组的第一个元素作为prev的初始值。 每循环一次,把累积的结果赋给prev,next就变为下一个数组元素 var arr3 = [10,22,23,25,50]; const total = arr3.reduce(function(pre,ne
浅谈Vue响应式原理
热门推荐
XinKun的博客
02-02 2万+
一、Vue中的响应式 Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。 二、响应式的基本原理 1.通过Object.definePropert来实现监听数据的改变和读取(属性中的getter和setter方法) 实现数据劫持 2.观察者模式(发布者-订阅者) 观察者(订阅者) – Watcher: update():当事件发生时,具体要做的事情 目标(发布者) – Dep: ①subs 数组:存储所有的观察者 ②
怎样理解vue2的响应式底层原理
05-19
Vue2的响应式底层原理是通过数据劫持实现的。其基本思想是:对于对象的属性访问进行拦截,当属性被访问时,触发 getter 函数;对于对象的属性修改进行拦截,当属性被修改时,触发 setter 函数。这样就能够实现数据的...
写文章

热门文章

  • Vue响应式底层原理 202

最新文章

2022年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳坪山网站建设公司乐昌网站优化费用广东知名网站优化费用优化网站排名要掌握的技巧攻略河南新站网站优化公司四川网站优化费用苏州优化网站排名绵阳网站搜索引擎优化餐饮网站seo优化方法遂川网站优化推广邯郸放心的网站设计优化辛集网站优化服务网站SEO优化费用外贸网站关键词优化推广烟台网站seo优化服务网站诊断优化报告河南关键词网站优化平台宣城网站排名优化哪家质量好许昌企业网站优化外包渭南市网站优化广州出名的网站推广与优化濮阳家装行业网站优化推广怎样优化网站关键词排名靠前安阳网站关键词优化软件宁德网站seo优化价格如何优化网站去联火30星棒滨州自适应网站优化公司宣城网站优化怎么样网站seo人工优化收费福田怎么做免费网站推广优化广州服务好的网站优化与推广香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化