목차
分析一下reactive
Vue2的Object.defineProperty
Vue3的Proxy
ref
분석 반응형
🎜Vue2 Object.defineProperty🎜
🎜Vue3의 Proxy🎜
🎜ref🎜
웹 프론트엔드 View.js Vue의 반응성 원리를 자세히 설명하는 기사

Vue의 반응성 원리를 자세히 설명하는 기사

Feb 13, 2023 pm 07:30 PM
프런트 엔드 디자인 패턴 vue.js

이 글은 Vue를 배우고 Vue의 반응성 원리를 심층적으로 이해하는 데 도움이 될 것입니다.

Vue의 반응성 원리를 자세히 설명하는 기사

이 글은 반응형 구문 설탕의 통과를 기념합니다

더 이상 고민하지 않고 곧바로 일상적인 개발에서 반응성을 적용하는 것이 매우 일반적인 예입니다. 이번에는 b=4*10을 원하는데 이는 분명히 불가능합니다. 앞에 var를 추가하더라도 우리가 원하는 것은 variable Promotion입니다. 주어진 값은 증가하지 않습니다.

이제 반응성의 역할이 중요해집니다. var也只会发生变量提升,我们所给的值并不会提升。

而这个时候,响应式的作用就体现出来了:

let a=3
let b=a*10
console.log(b)//30
a=4
console.log(b)//40
로그인 후 복사

只需要一个简单的响应式API便可实现跟踪变化的效果。【相关推荐:vuejs视频教程web前端开发

分析一下reactive

事实上,Vue3的reactive的本质上就是一个发布订阅模式

通过创建依赖图来跟踪数据的依赖关系。依赖图是一个图形,它描述了哪些数据是依赖于哪些数据的。当数据发生变化时,Vue 3 的 reactive 系统会自动触发视图的更新。这是因为它在依赖图中跟踪了数据变化,并通过将其与视图的更新关联起来来实现的

这里我列出尤大在Vue Master里演示的代码做个简单的示例:

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
로그인 후 복사

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

  • 定义一个subscribe属性,作为一个订阅者列表,用来存储所有的订阅者信息
  • depend函数用来管理依赖关系,即该订阅者所依赖的该变量
  • notify函数便是作为通知所有订阅者该变量的值已经发生变化

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

Vue2的Object.defineProperty

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

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()
        })
    }
}
로그인 후 복사

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

但这里缺点也就很明显了:在 Vue 2.x 中,被传入的对象会直接被 Vue.observable 变更 而在Vue3当中,则是会返回一个可响应的代理,而对源对象直接进行变更仍然是不可响应的

这就导致了:

  • 当我们添加或者删除对象的属性时,Vue2的响应式是无法检测的,由于 Vue 会在初始化实例时对 property 执行 getter/setter 转化,所以 property 必须在 data 对象上存在才能让 Vue 将它转换为响应式的
  • 无法检测数组下标和长度的变化

当然,这个属于历史局限了,当时ES5也就只能选择Object.definProperty,但在了ES6版本,便多了Proxy,这时候Vue的响应式便得到了升级

Vue3的Proxy

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

  • 无需再使用vue.$set来触发响应式,这让代码看上去能过更加简介
  • 全方位的数组变化检测,消除Vue2中无效边界情况
  • 减少了Vue3中书写响应式的代码量,这让我们的开发更加方便

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

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
}
로그인 후 복사

通过对对象进行收集依赖来实现响应式的方式也便是Vue3响应式的精髓

ref

在官方文档有句话:reactive() 的种种限制归根结底是因为 JavaScript 没有可以作用于所有值类型的 “引用” 机制,而reactive的限制便是:

  • 只能处理可被观测的数据结构,如数组和对象;而不可观测的数据结构,如原始数据类型就无法被其监测
  • 只能处理定义在它所在组件的数据,不能处理全局变量

而这个时候就需要ref

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
    }
}
로그인 후 복사
간단한 반응형 API만이 변경 사항 추적 효과를 얻을 수 있습니다. [관련 권장사항: vuejs 비디오 튜토리얼, 웹 프론트엔드 개발]

분석 반응형

을 살펴보겠습니다

사실 Vue3의 반응형은 데이터 종속성을 추적하기 위해 종속성 그래프를 생성하여 본질적으로 🎜게시 및 구독 모델🎜🎜🎜입니다. 종속성 그래프는 어떤 데이터가 어떤 데이터에 종속되는지 설명하는 그래프입니다. 데이터가 변경되면 Vue 3의 reactive 시스템이 자동으로 뷰 업데이트를 트리거합니다. 이는 종속성 그래프의 데이터 변경 사항을 추적하고 이를 뷰에 대한 업데이트와 연결하여 이를 수행하기 때문입니다🎜🎜여기에는 Vue Master에서 Youda가 간단한 예를 들어 시연한 코드가 나열되어 있습니다.🎜rrreee🎜 이 코드를 분석해 보겠습니다. 🎜🎜
  • subscribe 속성을 ​​모든 구독자 정보를 저장하는 구독자 목록으로 정의하세요.
  • dependent 함수는 종속성을 관리하는 데 사용됩니다. 구독자가 의존하는 변수입니다.
  • notify 이 함수는 모든 구독자에게 변수 값을 알리는 데 사용됩니다.
🎜🎜변수 값이 변경되면 모든 구독자에게 업데이트를 자동으로 알릴 수 있습니다🎜

🎜Vue2 Object.defineProperty🎜

🎜사실 Vue2 시대에는 응답성은 Object.defineProperty에 의해 구현되었지만 Vue3에서는 Proxy로 전환되었습니다. 실제 코드와 결합된 이유를 먼저 살펴보겠습니다. Vue2가 구현되었습니다: 🎜rrreee🎜 이렇게 간단한 반응형 API가 구현되었습니다. 🎜🎜 하지만 여기서 단점도 분명합니다. 🎜 Vue 2.x에서는 전달된 개체가 Vue.observable에 의해 직접 변경됩니다. 🎜. Vue3에서는 반응형 프록시가 반환되고 소스 객체는 여전히 응답하지 않습니다.🎜🎜🎜이로 인해 다음이 발생합니다.🎜🎜
  • 추가 또는 삭제 code> 객체의 속성, Vue는 인스턴스를 초기화할 때 속성에 대해 getter/setter 변환을 수행하므로 해당 속성이 data 객체에 순서대로 존재해야 하기 때문에 Vue2의 응답성을 감지할 수 없습니다. Vue에서 반응형으로 변환하려면
  • 🎜array🎜 subscript 및 길이의 변경 사항을 감지할 수 없습니다.
🎜🎜물론 이것은 당시 ES5에서는 Object.definProperty만 선택할 수 있었지만 ES6 버전에서는 Proxy가 더 많아지고 Vue의 응답성이 업그레이드되었습니다🎜

🎜Vue3의 Proxy🎜

🎜 Vue3는 Proxy를 사용하여 데이터 변경을 모니터링합니다. Vue2와 비교하면 위의 문제를 해결할 뿐만 아니라 다음과 같은 장점도 있습니다. : 🎜🎜
  • 응답성을 트리거하기 위해 더 이상 vue .$set를 사용할 필요가 없으므로 코드가 더욱 멋지게 보입니다. 🎜소개🎜
  • 포괄적인 배열 변경 감지, Vue2에서 유효하지 않은 경계 조건 제거
  • Vue3에서 작성된 반응형 코드의 양을 줄여 개발이 더욱 편리해졌습니다.
🎜🎜실제 코드가 어떻게 생겼는지 살펴보겠습니다. : 🎜rrreee🎜객체에 🎜을 수행하여 종속성을 수집합니다. 🎜응답성을 구현하는 방법이 Vue3 응답성의 핵심입니다🎜

🎜ref🎜

🎜에 문장이 있습니다. 공식 문서: reactive()의 다양한 제한은 궁극적으로 JavaScript에 모든 값 유형에 대해 작동할 수 있는 "참조" 메커니즘이 없다는 사실에 기인하며, 반응의 제한은 다음과 같습니다. 🎜🎜 <ul> <li>배열 및 객체와 같은 관찰 가능한 데이터 구조만 처리할 수 있으며 기본 데이터 유형과 같은 관찰할 수 없는 데이터 구조는 모니터링할 수 없습니다.</li> <li>구성 요소에 정의된 데이터만 처리할 수 있습니다. 위치가 있어 전역 변수를 처리할 수 없습니다.</li> </ul>🎜 🎜이때 <code>ref가 필요합니다. ref는 🎜기본 데이터 유형🎜을 위해 탄생했는데, 이것이 단점을 보완합니다. 간단히 말해서 ref는 단순한 단일 변수 Value에 더 적합합니다. (그러나 실제 개발에서는 대부분 ref에 관한 것입니다. 하하하하🎜🎜그런데 반응형 구문 설탕에 대한 제안이 아쉽습니다. 취소됨🎜

(학습 영상 공유: vuejs 입문 튜토리얼, 기본 프로그래밍 영상)

위 내용은 Vue의 반응성 원리를 자세히 설명하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Java 프레임워크의 디자인 패턴과 아키텍처 패턴의 차이점 Java 프레임워크의 디자인 패턴과 아키텍처 패턴의 차이점 Jun 02, 2024 pm 12:59 PM

Java 프레임워크에서 디자인 패턴과 아키텍처 패턴의 차이점은 디자인 패턴이 클래스와 객체(예: 팩토리 패턴) 간의 상호 작용에 중점을 두고 소프트웨어 디자인의 일반적인 문제에 대한 추상적인 솔루션을 정의한다는 것입니다. 아키텍처 패턴은 계층화된 아키텍처와 같은 시스템 구성 요소의 구성 및 상호 작용에 중점을 두고 시스템 구조와 모듈 간의 관계를 정의합니다.

vue.js vs. React : 프로젝트 별 고려 사항 vue.js vs. React : 프로젝트 별 고려 사항 Apr 09, 2025 am 12:01 AM

vue.js는 중소형 프로젝트 및 빠른 반복에 적합한 반면 React는 크고 복잡한 응용 프로그램에 적합합니다. 1) vue.js는 사용하기 쉽고 팀이 불충분하거나 프로젝트 규모가 작는 상황에 적합합니다. 2) React는 더 풍부한 생태계를 가지고 있으며 고성능 및 복잡한 기능적 요구가있는 프로젝트에 적합합니다.

vue.js는 배우기가 어렵습니까? vue.js는 배우기가 어렵습니까? Apr 04, 2025 am 12:02 AM

vue.js는 특히 JavaScript Foundation을 가진 개발자에게는 배우기가 어렵지 않습니다. 1) 진보적 인 설계와 반응 형 시스템은 개발 프로세스를 단순화합니다. 2) 구성 요소 기반 개발은 코드 관리를보다 효율적으로 만듭니다. 3) 사용 예제는 기본 및 고급 사용을 보여줍니다. 4) vuedevtools를 통해 일반적인 오류를 디버깅 할 수 있습니다. 5) V-IF/V- 쇼 및 주요 속성 사용과 같은 성능 최적화 및 모범 사례는 애플리케이션 효율성을 향상시킬 수 있습니다.

Vue는 프론트 엔드 또는 백엔드에 사용됩니까? Vue는 프론트 엔드 또는 백엔드에 사용됩니까? Apr 03, 2025 am 12:07 AM

vue.js는 주로 프론트 엔드 개발에 사용됩니다. 1) 사용자 인터페이스 및 단일 페이지 응용 프로그램 구축에 중점을 둔 가볍고 유연한 JavaScript 프레임 워크입니다. 2) vue.js의 핵심은 반응 형 데이터 시스템이며, 데이터가 변경되면 뷰가 자동으로 업데이트됩니다. 3) 구성 요소 개발을 지원하고 UI는 독립적이고 재사용 가능한 구성 요소로 분할 될 수 있습니다.

Java 디자인 패턴의 데코레이터 패턴 분석 Java 디자인 패턴의 데코레이터 패턴 분석 May 09, 2024 pm 03:12 PM

데코레이터 패턴은 원래 클래스를 수정하지 않고도 객체 기능을 동적으로 추가할 수 있는 구조적 디자인 패턴입니다. 추상 컴포넌트, 콘크리트 컴포넌트, 추상 데코레이터, 콘크리트 데코레이터의 협업을 통해 구현되며, 변화하는 요구에 맞게 클래스 기능을 유연하게 확장할 수 있습니다. 이 예에서는 우유와 모카 데코레이터가 총 $2.29의 가격으로 Espresso에 추가되어 객체의 동작을 동적으로 수정하는 데코레이터 패턴의 힘을 보여줍니다.

PHP 디자인 패턴: 실제 테스트 중심 개발 PHP 디자인 패턴: 실제 테스트 중심 개발 Jun 03, 2024 pm 02:14 PM

TDD는 고품질 PHP 코드를 작성하는 데 사용됩니다. 단계에는 테스트 사례 작성, 예상 기능 설명 및 실패 만들기가 포함됩니다. 과도한 최적화나 세부 설계 없이 테스트 케이스만 통과하도록 코드를 작성합니다. 테스트 케이스를 통과한 후 코드를 최적화하고 리팩터링하여 가독성, 유지 관리성 및 확장성을 향상시킵니다.

Guice 프레임워크에 디자인 패턴 적용 Guice 프레임워크에 디자인 패턴 적용 Jun 02, 2024 pm 10:49 PM

Guice 프레임워크는 다음을 포함한 다양한 디자인 패턴을 적용합니다. 싱글톤 패턴: @Singleton 주석을 통해 클래스에 인스턴스가 하나만 있는지 확인합니다. 팩토리 메소드 패턴: @Provides 주석을 통해 팩토리 메소드를 생성하고 종속성 주입 중에 객체 인스턴스를 얻습니다. 전략 모드: 알고리즘을 다양한 전략 클래스로 캡슐화하고 @Named 주석을 통해 특정 전략을 지정합니다.

Java 프레임워크에서 디자인 패턴을 사용할 때의 장점과 단점은 무엇입니까? Java 프레임워크에서 디자인 패턴을 사용할 때의 장점과 단점은 무엇입니까? Jun 01, 2024 pm 02:13 PM

Java 프레임워크에서 디자인 패턴을 사용하면 향상된 코드 가독성, 유지 관리성 및 확장성이 향상된다는 이점이 있습니다. 단점으로는 복잡성, 성능 오버헤드, 과도한 사용으로 인한 가파른 학습 곡선 등이 있습니다. 실제 사례: 프록시 모드는 개체를 지연 로드하는 데 사용됩니다. 디자인 패턴을 현명하게 사용하여 장점을 활용하고 단점을 최소화하세요.

See all articles