vue 데이터 제어 보기 의 원리 분석 실현
제 가 여기 서 세 가지 방향 을 제공 합 니 다.이 세 가지 방향 에서 watcher 의 사용 을 볼 수 있 습 니 다.그리고 watcher 의 사용 과정 에서 observer 와 dep 가 섞 인 다음 에 점대 면 으로 전 체 를 정리 합 니 다.
초기 화 된 render 프로 세 스 를 보 러 갑 니 다.
lifecycle 이 파일 의 mount Component 방법 에서 watcher 를 만 들 었 습 니 다.코드 는 다음 과 같 습 니 다:
new Watcher(vm, updateComponent, noop, {
before () {
if (vm._isMounted && !vm._isDestroyed) {
callHook(vm, 'beforeUpdate')
}
}
}, true /* isRenderWatcher */)
이 인삼 을 통 해 하 나 를 정리 할 수 있다.이 문 제 는 사실 두 가지 측면 으로 나 누 어 볼 수 있다.
데이터 가 변 한 것 을 어떻게 압 니까?
어떤 보기 가 데이터 와 관련 이 있다 는 것 을 어떻게 알 고 데이터 변 화 를 어떻게 알 았 는 지 업데이트 합 니까?
데이터 납치
데이터 납치 의 두 가지 방식
Object.defineProperty
proxy
Vue 3.0 의 데이터 납 치 는 proxy 로 이 루어 졌 으 며,현재 읽 고 있 는 소스 코드 에 서 는 모두Object.defineProperty
이런 방식 으로 이 루어 졌 다.어떤 보기 가 데이터 와 관련 이 있다 는 것 을 어떻게 알 고 그 를 업데이트 합 니까?
정 답:수집 및 구독 업데이트 의존
상세 한 해석 과정:그림 으로 응답 식 원 리 를 알려 드 립 니 다.
여기 에는 단지 하나의 간단 한 예 와 그림 으로 전체 절 차 를 명확 하 게 한다.
<div id="app">
{{ message }}
{{ message1 }}
<input type="text" v-model="message">
<div @click="changeMessage"> message</div>
</div>
var app = new Vue({
el: '#app',
data: {
message: '1',
message1: '2',
},
methods: {
changeMessage() {
this.message = '2'
}
},
watch: {
message: function(val) {
this.message1 = val
}
}
})
수집 흐름 도 의존수집 에 의존 하 는 최종 결과:
구독 업데이트 흐름 도:
。
문 제 를 풀 고 지식 을 심화 시키다.
제목 은 다음 과 같다.
1.Vue 의 응답 식 원 리 를 약술 한다.
2.계산 속성 과 watch 의 차이
3.Vue 에서 data 의 대상 속성 에 새로운 속성 을 추가 할 때 발생 하 는 일 은 어떻게 해결 합 니까?
1 등 과 2 등 은 여기 서 설명 하지 않 는 다.
Vue 에서 data 의 대상 속성 에 새로운 속성 을 추가 할 때 발생 하 는 일 은 어떻게 해결 합 니까?
우 리 는 업 무 를 할 때 이런 상황 을 자주 만 나 는데 나 는 간단 한 예 를 들 었 다.
<template>
<div>
<ul>
<li v-for="value in obj" :key="value">
{{value}}
</li>
</ul>
<button @click="addObjB"> obj.b</button>
</div>
</template>
<script>
export default {
data () {
return {
obj: {
a: 'obj.a'
}
}
},
methods: {
addObjB () {
this.obj.b = 'obj.b'
console.log(this.obj)
}
}
}
</script>
<style></style>
수집 절차 의존:이 를 통 해 알 수 있 듯 이 renderWatch 는 수집
Dep(obj)
과Dep(Obj.a)
이 있 지만 우리 가 Obj 를 바 꾸 었 을 때 보기 의 업 데 이 트 를 촉발 하지 않 았 다.왜냐하면 우 리 는 obj 의 값 을 바 꿀 때 Dep(obj)를 촉발 하지 않 았 기 때문이다.문제 가 발생 하 는 본질 적 인 원인:
1.vue 는 state.js 파일 의 initData 방법 에서 data 속성 중의 모든 key 를 응답 식 속성 으로 바 꿉 니 다.
2.보 기 는 렌 더 링 과정 에서 renderWatcher 를 사용 하 는 값 의 dep 에 수집 하여 업데이트 에 의존 하기 편리 합 니 다(모 르 는 것 은 다시 가서 수집 절차 에 의존 하 는 것 을 보 세 요)
3.속성 을 추가 할 때 이 속성 은 응답 식 속성 이 아 닙 니 다.
그럼 어떻게 바 꿀 까?
addObjB () {
// this.obj.b = 'obj.b'
this.$set(this.obj, 'b', 'obj.b')
console.log(this.obj)
}
총결산이 글 은 년도 총결산 의 시작 으로 초기 화 부분,render 부분 과 patch 부분 을 계속 정리 할 것 이다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 주 실 겁 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.