Vue Object 의 변화 탐지 실현 코드
Vue 의 대상 변화 수 사 는 Object.define Porperty 를 통 해 이 루어 졌 지만 Object.define Porperty 의 방식 에 결함 이 있 습 니 다.예 를 들 어 전체 대상 을 직접 대리 할 수 없고 매번 대상 의 모든 속성 을 순환 해 야 합 니 다.특히 앞으로 ES6 의 프 록 시 를 사용 해 이 부분 을 다시 쓰 겠 다 고 말 했다.이 블 로 그 는 Object.define Porperty 가 실현 한 대상 조사 에 대해 소개 한다.
아래 코드 를 살 펴 보고 defineReactive 함 수 를 정의 합 니 다.Object.definePorperty 를 사용 하여 대상 의 속성 을 옮 겨 다 닐 때 get 과 set 를 설정 합 니 다.대상 속성 이 읽 힐 때 get 을 터치 하고 대상 속성 이 설정 되 었 을 때 set 를 터치 합 니 다.이렇게 해서 data 에 대한 데이터 납 치 를 완 성 했 습 니 다.Vue 의 사상 은 응답 식 이기 때문에 우 리 는 이런 변 화 를 수집 해 야 합 니 다.
function defineReactive(data,key,val){
Object.definePorperty(data,key,{
enumerable: true,
configurable: true,
get:function(){
return val;
}
set :function (newVal){
if(val === newVal){return}
val = newVal;
}
})
}
수집 에 의존 하 다Dep 클래스 를 만 들 고 get 에서 의존 도 를 수집 하 며 set 에 의존 도 를 추가 합 니 다.
class Dep{
constructor(){
this.arr = []
}
addSub(sub){
this.arr.push(sub)
}
removeSub(sub){
remove(this.arr,sub)
}
depend(){
if(window.target){
this.addSub(window.target)
}
}
notify(){
const arrs = this.arr.slice();
for(let i = 0; i< arrs.lenth ;i ++){
arrs[i].update();
}
}
}
function defineReactive(data,key,val){
let dep = new Dep()
Object.definePorperty(data,key,{
enumerable: true,
configurable: true,
get:function(){
dep.depend(); //
return val;
}
set :function (newVal){
if(val === newVal){return}
val = newVal;
dep.notify(); //
}
})
}
Observer 와 Watcher.define Reactive 함 수 는 하나의 속성 을 get/set 형식 으로 만 변환 할 수 있 음 을 발 견 했 습 니 다.따라서 모든 key 를 재 귀적 으로 조사 하 는 데 도움 을 줄 관찰자 Observer 가 필요 합 니 다.
class Observer{
constructor(value){
this.value = value
}
if(!Array.isArry(value)){
this.walk(value)
}
walk(obj){
const keys = Object.keys(obj)
for(let i = 0; i < keys.length ;i++){
defineReactive(data,keys[i],obj[keys[i])
}
}
}
이런 의존 수집 이 완 료 된 후에 우 리 는 누구 에 게 알려 야 합 니까?어떻게 하면 보기 에 변화 업데이트 가 있 음 을 알 수 있 습 니까?우 리 는 구독 자 Watcher 를 실현 해 야 한다.get 을 터치 할 때마다 dep 를 자신 에 게 가리 키 면 의존 도 를 수집 할 수 있 습 니 다.
set 할 때마다 Watcher 의 update 방법 을 반복 적 으로 호출 합 니 다.
class Watcher{
constructor(vm,exp,cb){
this.vm = vm;
this.cb = cb;
this.exp = exp;
this.value = this.get();
}
get(){
Dep.target = this; //
var value = this.vm[exp]; // getter,
Dep.target = null; // ,
return value;
}
update(){
const oldVal = this.value;
this.value = this.get();
this.cb.call(this.vm,this.value,oldVal)
}
}
Vue 인 스 턴 스 가 마 운 트 되면 템 플 릿 은 Watcher 를 연결 합 니 다.누구의 속성 이 바 뀌 면 응답 하 는 Watcher 를 알 리 고 Watcher 는 컴 파일 러 Compile 에 게 보기 업 데 이 트 를 알 립 니 다.수사 에 서 는 대상 의 속성 에 대한 추가 와 삭 제 를 감청 할 방법 이 없다.
Vue 는 Object.definePorperty 를 통 해 대상 의 key 를 getter setter 형식 으로 바 꾸 어 검색 하지만 속성의 추가 와 삭 제 를 추적 할 수 없 기 때문에 Vue 에서 vm.get 을 제공 합 니 다.
Vue Object 의 변화 탐지 실현 코드 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Vue Object 변화 탐지 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Vue Render 함수로 DOM 노드 코드 인스턴스 만들기render에서createElement 함수를 사용하여 DOM 노드를 만드는 것은 직관적이지 않지만 일부 독립 구성 요소의 디자인에서 특수한 수요를 충족시킬 수 있습니다.간단한 렌더링 예는 다음과 같습니다. 또한 v...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.