您的位置: 翼速应用 > 业内知识 > web前端 > 正文

详细解析Vue中的响应式原理

本文是关于Vue的相关知识教程,给大家详细解析Vue中的响应式原理,响应式在日常开发中的应用是很常见的,下面一起来看一下,希望能给大家带来帮助。


详细解析Vue中的响应式原理


详细解析Vue中的响应式原理


代码示例:


let a=3
let b=a*10
console.log(b)//30
a=4
console.log(b)//40


如果想让b=4*10显然是行不通的,即使在前面加上个var也只会发生变量提升,我们所给的值并不会提升。这时响应式的作用就体现出来了:


import { reactive } from 'vue'
 
let state = reactive({ a: 3 })
let b = computed(() => state.a * 10)
console.log(b.value) // 30
state.a = 4
console.log(b.value) // 40


只需要一个简单的响应式API便可实现跟踪变化的效果。


聊聊reactive


事实上,Vue3的reactive的本质上就是一个发布订阅模式,通过创建依赖图来跟踪数据的依赖关系。依赖图是一个图形,它描述了哪些数据是依赖于哪些数据的。当数据发生变化时,Vue 3 的 reactive 系统会自动触发视图的更新。这是因为它在依赖图中跟踪了数据变化,并通过将其与视图的更新关联起来来实现的。这里我列出尤大在Vue Master里演示的代码做个简单的示例:


class Dep{
    constructor(value){
        this.subscribers=new Set()
        this._value=value
    }
    get value(){
        this.depend()
        return this._value
    }
    set value(newValue){
        this._value=newValue
        this.notify()
    }
    depend(){
        if(activeEffect){
            this.subscribers.add(activeEffect)
        }
    }
    notify(){
        this.subscribers.forEach(effect=>{
            effect()
        })
    }
}


我们来分析一下这段代码:


●  定义一个subscribe属性,作为一个订阅者列表,用来存储所有的订阅者信息;

●  depend函数用来管理依赖关系,即该订阅者所依赖的该变量;

●  notify函数便是作为通知所有订阅者该变量的值已经发生变化;

●  当变量的值发生变化的时候,它便可以自动的通知所有的订阅者进行更新了。


聊聊Vue2的Object.defineProperty


事实上,在Vue2时期,响应式的都是交给Object.defineProperty来实现的,但在Vue3当中切换成了Proxy,我们等下来结合实际代码来看原因;我们先来看看Vue2是如何实现的:


function reactive(raw){
    Object.keys(raw).forEach(ket=>{
        const dep=new Dep()
        let value=raw[key]
         
        Object.definProperty(raw,key,{
            get(){
                dep.depend()
                return value
            },
            //当属性发生
            set(newValue){
                value=newValue
                dep.notify()
            }
        })
    })
    //这时候返回的原始对象已经具有响应性
    return raw
}


这样一个简单的响应式API就实现了。


聊聊Vue3中的Proxy


Vue3采用Proxy来监控数据的变化,相较于Vue2来说,不仅解决了上述的问题,还有这些优势:


●  无需再使用vue.$set来触发响应式,这让代码看上去能过更加简介;

●  全方位的数组变化检测,消除Vue2中无效边界情况;

●  减少了Vue3中书写响应式的代码量,这让我们的开发更加方便。


让我们来看看实际代码是什么样子的:


const reactiveHandles={
    get(target,key,receiver){
        const dep=getDep(target,key)
        dep.depend()
        return Reflect.get(target,key,receiver)
    },
    set(target,key,value,receiver){
        const dep=getDep(target,key)
        const result=Reflect.set(target,key,value,receiver)
        dep.notify()
        return result
    }
}


通过对对象进行收集依赖来实现响应式的方式也便是Vue3响应式的精髓。以上就是关于Vue中的响应式原理之详细解析,翼速应用平台内有更多相关资讯,欢迎查阅!


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题