Vue 의 서로 다른 장면 에서 구성 요소 간 의 데이터 교 류 를 깊이 분석 하 다.
Vue 서로 다른 장면 에서 구성 요소 간 의 데이터'교류'에 대해 논 하 다.
Vue 의 공식 문 서 는 매우 상세 하 다 고 할 수 있다.내 가 보기에 이것 은 react 등 다른 프레임 워 크 문서 와 마찬가지 로 이야기 하 는 방식 은'방법론'이지'장면 론'이 아니다.이것 은 우리 가 문 서 를 여러 번 읽 은 후에 코드 를 쓰 는 것 은 많은 곤혹 을 느 낄 수 밖 에 없다.왜냐하면 우 리 는 그 중의 일부 지식 점 의 활용 장면 을 모 르 기 때문이다.이것 이 바로 제 가 이 글 을 쓰 는 목적 입 니 다.서로 다른 장면 에서 구성 요소 간 의 데이터'교류'의 Vue 실현 을 연구 하 는 것 입 니 다.
부자 구성 요소 간 데이터 교류
부자 구성 요소 간 의 데이터 교 류 는 두 가지 로 나 눌 수 있다.
1.부모 구성 요소 가 하위 구성 요소 에 데 이 터 를 전달 합 니 다.
2.하위 구성 요소 가 부모 구성 요소 에 데 이 터 를 전달 합 니 다.
부모 구성 요소 가 하위 구성 요소 에 데 이 터 를 전달 합 니 다.props
이것 은 구성 요소 데이터 소통 에서 가장 흔히 볼 수 있 는 장면 입 니 다.부모 구성 요소 에 게 데이터 원본 을 파악 한 다음 에 하위 구성 요소 에 전달 하여 하위 구성 요소 가 사용 하도록 합 니 다.
많은 사람들 이 이것 은 매우 간단 하 다 고 말 할 것 이다.소품 쓰 잖 아!맞 아,그 렇 기 때문에 그것 은 내 가 말 하고 자 하 는 주요 내용 이 아니 지만 우 리 는 코드 로 간단하게 한 번 보 았 다.
부모 구성 요소
<template>
<div id="father">
{{ ' ' }}
<son :text = "text"></son>
</div>
</template>
<script>
import son from './son.vue'
export default {
data: function () {
return {
text: ' '
}
},
components: {
son: son
}
}
</script>
<style scoped>
</style>
하위 구성 요소:
<template>
<div>
{{ ' , ' + text }}
</div>
</template>
<script>
export default {
props: {
text: { type: String, default: '' }
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
demo:이 demo 에서 우 리 는"부모 구성 요소 에서 전 달 된 데이터"라 는 문자열 을 props 를 통 해 하위 구성 요소 에 전달 합 니 다.
하위 구성 요소 에서 부모 구성 요소 의 데 이 터 를 바 꾸 려 면 부모 구성 요소 에서 부모 구성 요소 의 데 이 터 를 바 꿀 수 있 는 함 수 를 정의 한 다음 props 를 통 해 이 함 수 를 하위 구성 요소 에 전달 하고 하위 구성 요소 가 적당 한 시기 에 이 함 수 를 호출 하여 하위 구성 요소 에서 부모 구성 요소 데 이 터 를 바 꾸 는 효 과 를 낼 수 있 습 니 다.
하위 구성 요소 가 부모 구성 요소 에 데 이 터 를 전달 합 니 다.
하위 구성 요소 가 부모 구성 요소 에 데 이 터 를 전달 합 니 다. 방식 1:반전 인삼
부모 구성 요소:
<template>
<div id="father">
{{ ' , ' + componentName }}
<son :changeComponentName = "changeComponentName"></son>
</div>
</template>
<script>
import son from './son.vue'
export default {
data: function () {
return {
componentName: ' A'
}
},
methods: {
changeComponentName: function (newComponentName) {
this.componentName = newComponentName
}
},
components: {
son: son
}
}
</script>
<style scoped>
#father div{
padding: 10px;
margin: 10px;
border: 1px solid gray;
}
</style>
하위 구성 요소:
<template>
<div>
<p> : button</p>
<button @click="() => changeComponentName(newComponentName)">
:
</button>
</div>
</template>
<script>
export default {
data: function () {
return {
newComponentName: ' '
}
},
props: {
changeComponentName: {
type: Function,
default: () => { }
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
demo:클릭 전:
클릭 후:
도해:
하위 구성 요소(단추)를 누 르 면 부모 구성 요소 의 이름 을'A'에서'팽 호 만 구성 요소'로 변경 합 니 다.
부모 구성 요소 에서 하위 구성 요소 에 함수(changeComponentName)를 전 달 했 습 니 다.또한 하위 구성 요소 가 이 함 수 를 호출 할 때 하위 구성 요소 내부 의 데이터(new ComponentName)를 매개 변수 로 전달 합 니 다.부모 구성 요소 에서 정의 하 는 함수(changeComponentName)는 하위 구성 요소 가 전달 하 는 매개 변 수 를 가 져 올 수 있 습 니 다.
[PS]이름 이 길 어서 죄송합니다.
하위 구성 요소 가 부모 구성 요소 에 데 이 터 를 전달 합 니 다. 방식 2:사용자 정의 이벤트
부모 구성 요소:
<template>
<div id="father">
<div>
{{ ' , :' + fatherComponentName }}
<son v-on:changeComponentName = "changeComponentName"></son>
</div>
</div>
</template>
<script>
import son from './son.vue'
export default {
data: function () {
return {
fatherComponentName: 'A '
}
},
methods: {
changeComponentName: function (componentName) {
this.fatherComponentName = componentName
}
},
components: {
son: son
}
}
</script>
<style scoped>
#father div{
padding: 10px;
margin: 10px;
border:1px solid grey;
}
</style>
하위 구성 요소:
<template>
<div>
<p> : </p>
<button @click="clickCallback">
:
</button>
</div>
</template>
<script>
export default {
data: function () {
return {
fatherComponentName: ' '
}
},
methods: {
clickCallback: function () {
this.$emit('changeComponentName', this.fatherComponentName)
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
demo:클릭 전:
클릭 후:
도해:
$emit(event,[...매개 변수])를 통 해 모든 매개 변 수 는 모니터 에 전 달 됩 니 다.즉,부모 구성 요소 에서 정의 하 는 changeComponentName 방법 으로 하위 구성 요소 에서 부모 구성 요소 에 전 달 됩 니 다.
형제 구성 요소 간 데이터 교류(공통 부모 구성 요소 가 있 는 형제 구성 요소)
부모 구성 요소:
<template>
<div id="father">
<div>
{{ ' :father' }}
<eldest-son :text = "text"></eldest-son>
<youngest-son :changeText="changeText"></youngest-son>
</div>
</div>
</template>
<script>
import eldestSon from './eldestSon.vue'
import youngestSon from './youngestSon.vue'
export default {
data: function () {
return {
text: ' '
}
},
methods: {
changeText: function () {
this.text = ' '
}
},
components: {
eldestSon: eldestSon,
youngestSon: youngestSon
}
}
</script>
<style>
#father div{
border: 1px solid grey;
padding: 10px;
margin: 10px;
}
</style>
형제 구성 요소 1:
<template>
<div>
<p> :eldestSon</p>
<p> text:{{ text }}</p>
</div>
</template>
<script>
export default {
props: {
text: {
type: String,
default: ''
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
형제 구성 요소 2:
<template>
<div>
<p> :youngestSon</p>
<button @click="changeText"> eldestSon </button>
</div>
</template>
<script>
export default {
props: {
changeText: {
type: Function,
default: () => {}
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
클릭 전:클릭 후:
도해:
만약 두 형제 구성 요소 사이 에 이러한 데이터 관계 가 존재 한다 면,우 리 는 공 통 된 부모 구성 요 소 를 찾 아 데이터 와 관련 방법 을 부모 구성 요소 내부 로 향상 시 키 고,두 개의 하위 구성 요소 에 아래로 전달 할 수 있 습 니 다.
이렇게 해서 그 중의 한 하위 구성 요 소 는 데 이 터 를 얻 었 고 다른 하위 구성 요 소 는 데 이 터 를 바 꾸 는 방법 을 얻 으 면 상기 데이터 소통 을 실현 할 수 있다.
[주의]이런 장면 은 한계 가 존재 하 는데 두 구성 요소 에 공 통 된 부모 구성 요소 가 있어 야 합 니 다.이런 장면 이외 의 처리 방법 에 대해 서 는 다음 글 을 보십시오.
전역 구성 요소 간 데이터 교류-Vuex
제 가 상기 한 많은 장면 에서 props 나 함수 전달 방식 으로 구성 요소 간 의 데이터 소통 을 처리 합 니 다.그러나 약간의 대형 응용 에서 그것들 은 모두 약속 이나 한 듯 이 우리 에 게 매우 큰 번 거 로 움 을 가 져 왔 다.
예 를 들 면:
1.props 를 통 해 부모 구성 요소 에서 하위 구성 요소 로 데 이 터 를 전달 합 니 다.
직접적인 부자 관계 의 구성 요소 에 대해 데이터 흐름 은 매우 간결 하고 명확 해 보이 지만 대형 응용 프로그램 에서 우리 가 상하 에 많은 구성 요 소 를 끼 워 넣 을 때 이것 은 우리 의 코드 가 매우 번 거 롭 고 유지 하기 어렵다.
2.공통 적 인 부모 구성 요소 가 없 는 형제 구성 요소 에 대해 서 는 함수 가 전달 하 는 데이터 전달 방식 도 어 쩔 수 없습니다.Vue 문서 에 서 는$emit 와$on 함 수 를 기반 으로 하 는'이벤트 버스'를 통 해 데 이 터 를 소통 할 수 있 지만 더 큰 응용 에 대응 할 수 없습니다.
이때 Vuex 는 전체 구성 요소 간 데이터 교 류 를 실현 하 는 가장 좋 은 방안 이 되 었 다.
Vuex 는 모든 최상 위 상 태 를 포함 하 는 단일 데이터 원본(state)을 가지 고 있 습 니 다.
1.모든 구성 요 소 는 이 단일 데이터 원본 의 데 이 터 를 사용 할 수 있 습 니 다.
2.모든 구성 요 소 는 배포 동작(actions)을 통 해 이 단일 데이터 원본 의 데 이 터 를 수정 할 수 있 습 니 다.
'많은 시행 착 오 를 걸 어야 만 소통 이 가능 한 데이터 흐름 을 단번에 가장 짧 은 지름길 을 찾 았 다
View 층 의 데이터 와 model 층 의 결합 을 실현 합 니 다.
1,2 소절 에서 처리 되 는 데이터(Vue)와 3 소절 에서 처리 되 는 데이터(Vuex)는 두 가지 유형의 데이터 가 많 고 전 자 는 View 층 에 속 하 며 단순 한 UI 전시 만 담당 하 며 model 층 은 백 엔 드 에서 취득 한 후 주입 되 는 데이터 가 대부분이다.
한 가지 제안:
1.Vue 부분의 코드 는 View 층 구축 을 책임 집 니 다.
2.Vuex 부분의 코드 는 model 층 을 구축 하 는 것 을 책임 집 니 다.
(상기 Vue 는 Vuex 이외 의 프레임 시스템 을 말 합 니 다)
상기 두 가 지 를 바탕 으로 특정한 부분의 코드 를 Vue 에 쓸 지 Vuex 에 쓸 지 결정 하고 이들 을 최대한 분리 하여 View 층 과 model 층 의 디 결합 을 실현 하여 전단 코드 의 유지 가능성 과 확장 성 을 향상 시킨다.
총결산
위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 Vue 의 서로 다른 장면 에서 구성 요소 간 의 데이터 교류 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 님 께 서 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.