Vue의 반응성 원칙은 무엇입니까?
저는 최근 Vue 원리에 대한 많은 기사를 읽었습니다. 이 기사의 도움으로 Vue의 소스 코드를 직접 이해하려고 여러 번 노력했습니다. 드디어 다른 글과는 다른 관점으로 여러분께 Vue를 친숙하게 다가갈 수 있는 콘텐츠를 직접 출력해 볼 때가 된 것 같습니다.
Dep
var Dep = function Dep() { this.id = uid++ this.subs = [] }
Dep의 의미는 당연히 의존성(즉, 의존성, 컴퓨터 분야의 명사)입니다.
node.js 프로그램을 작성하는 것과 마찬가지로 npm Warehouse의 종속성이 자주 사용됩니다. Vue에서 종속성은 구체적으로 반응적으로 처리된 데이터를 나타냅니다. 나중에 언급하겠지만 반응형 처리의 핵심 기능 중 하나는 DefineReactive이며 이는 많은 Vue 원칙 기사에서 언급됩니다.
Dep이 각 반응형 데이터에 바인딩된 후 반응형 데이터는 종속성(명사)이 됩니다. 아래 Watcher를 소개할 때 반응형 데이터가 템플릿에서 감시, 계산 또는 사용될 수 있음이 언급됩니다(동사).
subs
Dep 배열인 subs 속성이 있는데, 이는 구독자 목록을 의미한다고 추측하기 쉽습니다. 구독자는 감시 기능, 계산 기능 또는 보기 업데이트 기능일 수 있습니다.
Watcher
Watcher는 Dep에서 언급한 구독자입니다(나중에 Observer 관찰자와 혼동하지 마세요).
Watcher의 기능은 일부 앱의 구독 푸시와 마찬가지로 Dep 업데이트에 적시에 응답하는 것이기 때문입니다. 업데이트되었습니다.
deps
Dep에 subs 속성이 있는 것과 유사하게 Watcher 개체에도 deps 속성이 있습니다. 이는 Watcher와 Dep 사이의 다대다 관계를 구성합니다. 서로를 기록하는 이유는 한 당사자가 삭제되면 관련 개체가 시간에 업데이트될 수 있기 때문입니다.
Watcher 생성 방법
위에서 여러 번 언급한 watch, 계산 및 렌더링 템플릿은 Vue 소스 코드에서 간결하고 이해하기 쉬운 Watcher를 생성합니다.
- mountComponent's vm._watcher = new Watcher(vm , updateComponent, noop);
- initCompulated's watchers[key] = new Watcher(vm, getter || noop, noop, ComputedWatcherOptions)
- $watcher의 var watcher = new Watcher(vm, expOrFn, cb, options);
Observer
Observer는 반응형 객체(또는 배열)를 재귀적으로 관찰(또는 처리)하는 역할을 담당하는 관찰자입니다. 인쇄된 예에서 반응 객체에는 관찰된 내용의 증거인 __ob__이 있음을 알 수 있습니다. 관찰자는 위의 Dep 및 Watcher만큼 중요하지 않으며 약간의 이해만으로도 충분합니다.
walk
Observer.prototype.walk는 Observer 초기화 시 재귀적 처리의 핵심 메소드인데, 이 메소드는 객체를 처리하는 데 사용되며, 배열을 처리하는 Observer.prototype.observeArray도 있습니다.
핵심 프로세스
위 개념 간의 관계에 따라 이를 일치시키는 방법과 반응형 데이터 업데이트를 달성하는 방법은 무엇입니까?
먼저 목표를 설정하세요. 데이터가 업데이트되면 자연스럽게 뷰가 자동으로 새로 고쳐져 최신 데이터가 표시됩니다.
위에서 언급한 Dep과 Watcher의 관계입니다. 데이터는 Dep이고 Watcher는 페이지 렌더링 기능을 트리거합니다(가장 중요한 Watcher입니다).
하지만 새로운 질문이 생깁니다. Dep은 감시자가 자신에게 의존한다는 것을 어떻게 알 수 있습니까?
Vue는 매우 흥미로운 방법을 채택합니다.
Watcher의 콜백 함수를 실행하기 전에 먼저 현재 Watcher가 무엇인지 기록합니다(Dep.target을 통해).
콜백 함수 실행에 반응형 데이터가 사용됩니다. 반응형 데이터의 getter 함수는 필연적으로 호출됩니다
반응형 데이터의 getter 함수에서는 현재 Watcher를 기록할 수 있으며, 이후 반응형 데이터가 업데이트되면 Dep과 Watcher 간의 관계가 구축됩니다. , 필연적으로 리액티브 데이터를 호출하는 setter 함수
이전에 설정된 관계를 기반으로 Watcher에 해당하는 콜백 함수가 setter 함수에서 트리거될 수 있습니다
Code
위의 논리는 다음과 같습니다. DefineReactive 함수. 이 기능에는 여러 가지 입구가 있습니다. 먼저 더 중요한 관찰 기능에 대해 이야기해 보겠습니다.
observer 함수에서는 새로운 Observer 객체가 생성되는데 Observer.prototype.walk를 사용하여 객체의 값을 하나씩 반응형으로 처리하고, DefineReactive 함수를 사용합니다.
defineReactive 함수는 워낙 중요하고 길지 않기 때문에 여기에 직접 올리는 것이 더 편리합니다.
function defineReactive(obj, key, val, customSetter, shallow) { var dep = new Dep() depsArray.push({ dep, obj, key }) var property = Object.getOwnPropertyDescriptor(obj, key) if (property && property.configurable === false) { return } // cater for pre-defined getter/setters var getter = property && property.get var setter = property && property.set var childOb = !shallow && observe(val) Object.defineProperty(obj, key, { enumerable: true, configurable: true, get: function reactiveGetter() { var value = getter ? getter.call(obj) : val if (Dep.target) { dep.depend() if (childOb) { childOb.dep.depend() if (Array.isArray(value)) { dependArray(value) } } } return value }, set: function reactiveSetter(newVal) { var value = getter ? getter.call(obj) : val // 后半部分诡异的条件是用于判断新旧值都是 NaN 的情况 if (newVal === value || (newVal !== newVal && value !== value)) { return } // customSetter 用于提醒你设置的值可能存在问题 if ('development' !== 'production' && customSetter) { customSetter() } if (setter) { setter.call(obj, newVal) } else { val = newVal } childOb = !shallow && observe(newVal) dep.notify() }, }) }
우선, 각 반응형 값은 "종속성"이므로 첫 번째 단계에서는 클로저 기능을 사용하여 각 값에 대한 Dep를 생성합니다. (Vue 3에서는 클로저가 필요하지 않습니다.)
그런 다음 세 가지 핵심 매개변수를 살펴보세요.
obj 값이 현재 반응적으로 처리되어야 하는 개체
key 값의 키
val Current
값에는 이전에 정의된 자체 getter 및 setter가 있을 수 있으므로 Vue의 반응형 처리를 수행할 때 원래 getter 및 setter를 먼저 처리해야 합니다.
핵심 프로세스에서 위에서 언급한 것처럼 getter 함수는 특히 dep.dependent()에 의존하여 Dep과 Watcher 간의 관계를 설정합니다.
아래에는 Dep과 Watcher가 서로 전화를 걸 수 있는 몇 가지 방법이 게시되어 있습니다.
Dep.prototype.depend = function depend() { if (Dep.target) { Dep.target.addDep(this) } } Watcher.prototype.addDep = function addDep(dep) { var id = dep.id if (!this.newDepIds.has(id)) { this.newDepIds.add(id) this.newDeps.push(dep) if (!this.depIds.has(id)) { dep.addSub(this) } } } Dep.prototype.addSub = function addSub(sub) { this.subs.push(sub) }
通过这几个函数,可以领略到了 Dep 和 Watcher 错综复杂的关系……不过看起来迂回,简单来说,其实做的就是上面说的互相添加到多对多列表。
你可以在 Dep 的 subs 找到所有订阅同一个 Dep 的 Watcher,也可以在 Watcher 的 deps 找到所有该 Watcher 订阅的所有 Dep。
但是里面还有一个隐藏问题,就是 Dep.target 怎么来呢?先放一放,后会作出解答。先接着看看 setter 函数,其中的关键是 dep.notify()。
Dep.prototype.notify = function notify() { // stabilize the subscriber list first var subs = this.subs.slice() for (var i = 0, l = subs.length; i < l; i++) { subs[i].update() } }
不难理解,就是 Dep 提醒他的订阅者列表(subs)里的所有人更新,所谓订阅者都是 Watcher,subs[i].update() 调用的也就是 Watcher.prototype.update。
那么来看一下 Watcher 的 update 做了什么——
Watcher.prototype.update = function update() { if (this.lazy) { this.dirty = true } else if (this.sync) { this.run() } else { queueWatcher(this) } }
在这里我觉得有两个点比较值得展开,所以挖点坑
위 내용은 Vue의 반응성 원칙은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

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

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

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

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

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

뜨거운 주제











PHP와 Vue: 프론트엔드 개발 도구의 완벽한 조합 오늘날 인터넷이 빠르게 발전하는 시대에 프론트엔드 개발은 점점 더 중요해지고 있습니다. 사용자가 웹 사이트 및 애플리케이션 경험에 대한 요구 사항이 점점 더 높아짐에 따라 프런트 엔드 개발자는 보다 효율적이고 유연한 도구를 사용하여 반응형 및 대화형 인터페이스를 만들어야 합니다. 프론트엔드 개발 분야의 두 가지 중요한 기술인 PHP와 Vue.js는 함께 사용하면 완벽한 도구라고 볼 수 있습니다. 이 기사에서는 독자가 이 두 가지를 더 잘 이해하고 적용할 수 있도록 PHP와 Vue의 조합과 자세한 코드 예제를 살펴보겠습니다.

프론트엔드 개발 인터뷰에서 일반적인 질문은 HTML/CSS 기초, JavaScript 기초, 프레임워크 및 라이브러리, 프로젝트 경험, 알고리즘 및 데이터 구조, 성능 최적화, 크로스 도메인 요청, 프론트엔드 엔지니어링, 디자인 패턴, 새로운 기술 및 트렌드. 면접관 질문은 후보자의 기술적 능력, 프로젝트 경험, 업계 동향에 대한 이해를 평가하기 위해 고안되었습니다. 따라서 지원자는 자신의 능력과 전문성을 입증할 수 있도록 해당 분야에 대한 충분한 준비를 갖추어야 합니다.

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

Django는 빠른 개발과 깔끔한 방법을 강조하는 Python으로 작성된 웹 애플리케이션 프레임워크입니다. Django는 웹 프레임워크이지만 Django가 프런트엔드인지 백엔드인지에 대한 질문에 답하려면 프런트엔드와 백엔드의 개념에 대한 깊은 이해가 필요합니다. 프론트엔드는 사용자가 직접 상호작용하는 인터페이스를 의미하고, 백엔드는 HTTP 프로토콜을 통해 데이터와 상호작용하는 서버측 프로그램을 의미합니다. 프론트엔드와 백엔드가 분리되면 프론트엔드와 백엔드 프로그램을 독립적으로 개발하여 각각 비즈니스 로직과 인터랙티브 효과, 데이터 교환을 구현할 수 있습니다.

프론트엔드 ESM이란 무엇입니까? 프론트엔드 개발에서 ESM은 ECMAScript 사양을 기반으로 한 모듈식 개발 방법인 ECMAScriptModules를 참조합니다. ESM은 더 나은 코드 구성, 모듈 간 격리, 재사용성과 같은 많은 이점을 제공합니다. 이 기사에서는 ESM의 기본 개념과 사용법을 소개하고 몇 가지 구체적인 코드 예제를 제공합니다. ESM의 기본 개념 ESM에서는 코드를 여러 모듈로 나눌 수 있으며 각 모듈은 다른 모듈에 대한 일부 인터페이스를 노출합니다.

빠르고 효율적인 프로그래밍 언어인 Go 언어는 백엔드 개발 분야에서 널리 사용됩니다. 그러나 Go 언어를 프런트엔드 개발과 연관시키는 사람은 거의 없습니다. 실제로 프런트엔드 개발에 Go 언어를 사용하면 효율성이 향상될 뿐만 아니라 개발자에게 새로운 지평을 열어줄 수도 있습니다. 이 기사에서는 프런트엔드 개발에 Go 언어를 사용할 수 있는 가능성을 살펴보고 독자가 이 영역을 더 잘 이해할 수 있도록 구체적인 코드 예제를 제공합니다. 전통적인 프런트엔드 개발에서는 사용자 인터페이스를 구축하기 위해 JavaScript, HTML, CSS를 사용하는 경우가 많습니다.

JavaScript에서 HTTP 상태 코드를 얻는 방법 소개: 프런트 엔드 개발에서 우리는 종종 백엔드 인터페이스와의 상호 작용을 처리해야 하며 HTTP 상태 코드는 매우 중요한 부분입니다. HTTP 상태 코드를 이해하고 얻는 것은 인터페이스에서 반환된 데이터를 더 잘 처리하는 데 도움이 됩니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTTP 상태 코드란 무엇입니까? HTTP 상태 코드는 브라우저가 서버에 요청을 시작할 때 서비스가

Django: 프론트엔드와 백엔드 개발을 모두 처리할 수 있는 마법의 프레임워크! Django는 효율적이고 확장 가능한 웹 애플리케이션 프레임워크입니다. MVC, MTV를 포함한 다양한 웹 개발 모델을 지원할 수 있으며 고품질 웹 애플리케이션을 쉽게 개발할 수 있습니다. Django는 백엔드 개발을 지원할 뿐만 아니라 프런트엔드 인터페이스를 빠르게 구축하고 템플릿 언어를 통해 유연한 뷰 표시를 구현할 수 있습니다. Django는 프론트엔드 개발과 백엔드 개발을 완벽한 통합으로 결합하므로 개발자가 전문적으로 학습할 필요가 없습니다.
