Vue数据变化侦测的原理解析,手把手教你手写响应式

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 学Vue的应该都知道Vue最大的特点的数据驱动视图,那么你是否了解Vue数据变化是如何侦测到的呢?能否手写实现响应式原理呢?这一块是面试中经常会问到的地方,也是我们学好vue必须要了解的一个点,这篇就通过小例子带大家理解这个内容

前言

学Vue的应该都知道Vue最大的特点的数据驱动视图,那么你是否了解Vue数据变化是如何侦测到的呢?能否手写实现响应式原理呢?这一块是面试中经常会问到的地方,也是我们学号vue必须要了解的一个点,这篇就通过小例子带大家理解这个内容

数据驱动视图

刚刚说了Vue最大的特点的数据驱动视图。
这里我们可以把数据理解为状态,视图就是用户可以直接看到的页面。

    UI = render(state)
    这个公式理解为:state是输入,UI是输出,状态变化也变随之变化,这种特性就要数据驱动视图。
    如果说想要知道数据在什么时候被读取或者被改写,很简单,JS为我们提供了一个Object.difineProperty方法。具体如何实现和使用,继续往下看

Object.difineProperty

我先来写个简单的对象

<script>
    let home = {
        'brand': 'BGY',
        'price': 5000
    }
</script>

运行打开,我们可以在控制台输入,取到hone对象和它的属性值都没有问题

在这里插入图片描述
那么我们在读取或者是修改时,如何让hone对象告诉我们发生了操作呢?这里就需要用到了Object.difineProperty,我们来修改一下代码:
get就是拿数据,set就是修改数据

<script>
    // let home = {
    //     'brand': 'BGY',
    //     'price': 5000
    // }
    let home = {}
    let val = 5000
    Object.defineProperty(home, 'price', {
        get() {
            console.log('price属性被读取了')
            return val
        },
        set(newVal) {
            console.log('peice属性被修改了')
            return newVal
        }
    })
</script>

我们再来运行试一下,此时hone已经变为可观测的了
在这里插入图片描述

手写实现Vue响应式

上面我们已经了解了Object.difineProperty方法的使用,能够将变量变为可观测,下面一起来手写一个Vue响应式

  1. 我们先来写一个输入框,并且将输入框内容展示到下方p标签里。先把对象里的内容变为可观测形式
<input type="text" id="inp">
<p id="text"></p>
<script>
    let obj = {}
    Object.defineProperty(obj, 'val', {
        get() {
            console.log('val属性被读取了')
            return val
        },
        set(newVal) {
            console.log('val属性被修改了')
            return newVal
        }
    })
</script>
  1. 下面我们要把set中最新的值newVal赋值进行,然后监听input的键盘事件,把对应的目标值赋给对象的val.

这里使用addEventListener的方法,读取到它的target属性,并将它赋值给obj.val,并在set方法中对新的值赋值进去

<input type="text" id="inp">
<p id="text"></p>
<script>
    let obj = {}
    Object.defineProperty(obj, 'val', {
        get() {
            console.log('val属性被读取了')
            return val
        },
        set(newVal) {
            console.log('val属性被修改了')
            val = newVal
                document.getElementById('text').innerHTML = newVal
        }
    })
    document.addEventListener('keyup', function(e) {
         console.log(e.target.value)
         obj.val = e.target.value
     })
</script>

下面一起来看看效果,实现了响应式的简易版
在这里插入图片描述

相关文章
|
20天前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
54 1
|
20天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
124 64
|
2天前
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
28 13
|
24天前
|
JavaScript 前端开发 API
介绍一下Vue中的响应式原理
介绍一下Vue中的响应式原理
27 1
|
27天前
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。
|
21天前
|
存储 供应链 算法
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
44 0
|
24天前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
51 0
|
24天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
26天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
27天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
31 1
vue学习第一章

推荐镜像

更多