VueJS 데이터 구동 및 추적 분석 의존
이전에 자신의 Mvvm 에서 setter 로 model 을 관찰 하고 인터페이스의 모든 view Model 을 model 에 연결 합 니 다.model 이 바 뀌 면 모든 view Model 을 업데이트 하고 새 값 을 인터페이스 에 렌 더 링 합 니 다.동시에 감청 인터페이스 에서 v-model 로 연 결 된 모든 input 를 감청 하고 addEventListener 이 벤트 를 통 해 새 값 을 model 에 업데이트 하여 양 방향 연결 을 완성 합 니 다.
그러나 그 프로그램 은 define Property 를 이해 하 는 것 외 에는 한 푼 의 가치 도 없다.
데이터 정의 getter&setter
class Observer {
constructor(data) {
this._data = data;
this.walk(this._data);
}
walk(data) {
Object.keys(data).forEach((key) => { this.defineRective(data, key, data[key]) })
};
defineRective(vm, key, value) {
var self = this;
if (value && typeof value === "object") {
this.walk(value);
}
Object.defineProperty(vm, key, {
get: function() {
return value;
},
set: function(newVal) {
if (value != newVal) {
if (newVal && typeof newVal === "object") {
self.walk(newVal);
}
value = newVal;
}
}
})
}
}
module.exports = Observer;
이렇게 하면 모든 속성 에 getter 와 setter 를 추가 합 니 다.속성 이 하나의 대상 이 라면 재 귀적 으로 추가 합 니 다.속성 값 을 가 져 오 거나 속성 값 을 부여 하면 get 이나 set 를 촉발 합 니 다.set,즉 model 변 화 를 촉발 하면 모든 view Model 업 데 이 트 를 알 리 는 메 시 지 를 발표 할 수 있 습 니 다.
defineRective(vm, key, value) {
// 。
var dep = new Dep();
var self = this;
if (value && typeof value === "object") {
this.walk(value);
}
Object.defineProperty(vm, key, {
get: function() {
return value;
},
set: function(newVal) {
if (value != newVal) {
if (newVal && typeof newVal === "object") {
self.walk(newVal);
}
value = newVal;
// viewModel
dep.notify();
}
}
})
}
그럼 Dep 는 어떻게 정의 하나 요?
class Dep {
constructor() {
//
this.dependences = [];
}
//
addDep(watcher) {
if (watcher) {
this.dependences.push(watcher);
}
}
//
notify() {
this.dependences.forEach((watcher) => {
watcher.update();
})
}
}
module.exports = Dep;
이곳 의 모든 의존 은 하나의 Watcher 이다.Watcher 를 어떻게 정의 하 는 지.
모든 Watcher 에는 하나의 표현 식 과 반전 함수 가 있 는 유일한 id 번호 가 있 습 니 다.
예 를 들 어 표현 식 a+b;get 에서 계산 할 때 a 와 b 를 방문 합 니 다.JavaScript 는 단일 스 레 드 이기 때문에 언제든지 한 곳 만 JavaScript 코드 가 실 행 됩 니 다.Dep.target 을 전역 변수 로 현재 Watcher 의 표현 식 을 표시 한 다음 coptute 를 통 해 a,b 를 방문 하여 a 와 b 의 getter 를 촉발 하여 getter 에 Dep.target 을 의존 으로 추가 합 니 다.
a 와 b 의 set 가 트리거 되면 update 함 수 를 호출 하여 의존 하 는 값 을 업데이트 합 니 다.
var uid = 0;
class Watcher {
constructor(viewModel, exp, callback) {
this.viewModel = viewModel;
this.id = uid++;
this.exp = exp;
this.callback = callback;
this.oldValue = "";
this.update();
}
get() {
Dep.target = this;
var res = this.compute(this.viewModel, this.exp);
Dep.target = null;
return res;
}
update() {
var newValue = this.get();
if (this.oldValue === newValue) {
return;
}
// callback Dom
this.callback(newValue, this.oldValue);
this.oldValue = newValue;
}
compute(viewModel, exp) {
var res = replaceWith(viewModel, exp);
return res;
}
}
module.exports = Watcher;
현재 표현 식 은 현재 model 아래 에서 실행 되 어야 하기 때문에 replace With 함수 로 with 를 대체 합 니 다.구체 적 으로 다른 수필 을 볼 수 있 습 니 다javascript 에서 with 의 대체 문법get 으로 의존 도 추가
Object.defineProperty(vm, key, {
get: function() {
var watcher = Dep.target;
if (watcher && !dep.dependences[watcher.id]) {
dep.addDep(watcher);
}
return value;
},
set: function(newVal) {
if (value != newVal) {
if (newVal && typeof newVal === "object") {
self.walk(newVal);
}
value = newVal;
dep.notify();
}
}
})
이런 의존 을 첨가 하 는 방식 은 정말 교묘 하 다.여기 제 가 그림 을 하나 그 려 서 설명 을 했 어 요.
마지막 으로 코드 를 통 해 간단하게 테스트 해 보 겠 습 니 다.
const Observer = require('./Observer.js');
const Watcher = require('./watcher.js');
var data = {
a: 10,
b: {
c: 5,
d: {
e: 20,
}
}
}
var observe = new Observer(data);
var watcher = new Watcher(data, "a+b.c", function(newValue, oldValue) {
console.log("new value is " + newValue);
console.log("oldValue is " + oldValue);
});
console.log("\r
");
console.log("a has changed to 50,then the expr should has value 55");
data.a = 50;
console.log("\r
");
console.log("b.c has changed to 50,then the expr should has value 122");
data.b.c = 72;;
console.log("\r
");
console.log("b.c has reseted an object,then the expr should has value 80");
data.b = { c: 30 }
OK.대성 공.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Fastapi websocket 및 vue 3(Composition API)1부: FastAPI virtualenv 만들기(선택 사항) FastAPI 및 필요한 모든 것을 다음과 같이 설치하십시오. 생성main.py 파일 및 실행 - 브라우저에서 이 링크 열기http://127.0.0.1:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.