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 및 길이
의 변경 사항을 감지할 수 없습니다.
Object.definProperty
만 선택할 수 있었지만 ES6 버전에서는 Proxy
가 더 많아지고 Vue의 응답성이 업그레이드되었습니다🎜🎜Vue3의 Proxy🎜
🎜 Vue3는Proxy
를 사용하여 데이터 변경을 모니터링합니다. Vue2와 비교하면 위의 문제를 해결할 뿐만 아니라 다음과 같은 장점도 있습니다. : 🎜🎜- 응답성을 트리거하기 위해 더 이상
vue .$set
를 사용할 필요가 없으므로 코드가 더욱 멋지게 보입니다. 🎜소개🎜 - 포괄적인 배열 변경 감지, Vue2에서 유효하지 않은 경계 조건 제거
- Vue3에서 작성된 반응형 코드의 양을 줄여 개발이 더욱 편리해졌습니다.
🎜ref🎜
🎜에 문장이 있습니다. 공식 문서:reactive()의 다양한 제한은 궁극적으로 JavaScript에 모든 값 유형에 대해 작동할 수 있는 "참조" 메커니즘이 없다는 사실에 기인하며, 반응의 제한은 다음과 같습니다. 🎜🎜 <ul>
<li>배열 및 객체와 같은 관찰 가능한 데이터 구조만 처리할 수 있으며 기본 데이터 유형과 같은 관찰할 수 없는 데이터 구조는 모니터링할 수 없습니다.</li>
<li>구성 요소에 정의된 데이터만 처리할 수 있습니다. 위치가 있어 전역 변수를 처리할 수 없습니다.</li>
</ul>🎜 🎜이때 <code>ref
가 필요합니다. ref는 🎜기본 데이터 유형🎜을 위해 탄생했는데, 이것이 단점을 보완합니다. 간단히 말해서 ref는 단순한 단일 변수 Value에 더 적합합니다. (그러나 실제 개발에서는 대부분 ref에 관한 것입니다. 하하하하🎜🎜그런데 반응형 구문 설탕에 대한 제안이 아쉽습니다. 취소됨🎜(학습 영상 공유: vuejs 입문 튜토리얼, 기본 프로그래밍 영상)
위 내용은 Vue의 반응성 원리를 자세히 설명하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











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

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

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

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

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

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

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

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