Vue 구성 요소 간 데이터 전달 방식(3가지)
vue에서 데이터를 전달하는 방식은 어떤 것들이 있습니까?
데이터 흐름의 방식으로 데이터를 전달하다
props를 통해 속성 전달
데모2 구성 요소에 msg 데이터 연결
상위 어셈블리
<template>
<div class='container'>
<demo2 :msg="msg" @change="change" />
</div>
</template>
<script>
import demo2 from './demo2'
export default {
data(){
return {
msg:' '
}
},
methods:{
change(value){
this.msg = value
}
},
components: {
demo2
}
}
</script>
하위 구성 요소는props를 정의하여 msg를 사용하고 $emit는 외부의 함수를 터치하여 상위 전송된 값을 변경합니다서브어셈블리
<template>
<div class='container'>
{{msg}}
<button @click="change"> </button>
</div>
</template>
<script>
export default {
props:['msg'],
methods:{
change(){
this.$emit('change',' ')
}
}
}
</script>
$attrs를 통해 속성 수집$attrs는 구성 요소에 연결된 속성을 수집합니다.class와style은 처리하지 않습니다.만약props와 함께 사용한다면,props의 우선순위는attrs보다 높다
상위 어셈블리
<template>
<div class="container">
<demo2 class="demo" style="color:red" :msg="msg" />
</div>
</template>
<script>
import demo2 from "./demo2";
export default {
data() {
return {
msg: " "
};
},
components: {
demo2
}
};
</script>
서브어셈블리에서this.$attrs는 구성 요소에 연결된 속성을 수집합니다서브어셈블리
<template>
<div class="container">{{$attrs.msg}} </div>
</template>
<script>
export default {
// inheritAttrs:true,
//
// props:['msg'],
// props $attrs , props, msg data , $attrs msg
created(){
console.log(this.$attrs)
// msg
}
};
</script>
$listeners를 통해 수집 방법$listeners는 구성 요소에 연결된 방법을 수집합니다.상위 어셈블리의 값을 실수로 전달할 수 있습니다.
상위 어셈블리
<template>
<div class='container'>
{{msg}}
<demo2 class="demo" style="color:red" @msgChange="change"/>
</div>
</template>
<script>
import demo2 from './demo2'
export default {
data () {
return {
msg: ' '
}
},
methods: {
change(newvalue){
this.msg = newvalue;
}
},
components: {
demo2
}
}
</script>
서브어셈블리에서this.$listeners는 구성 요소에 연결된 방법을 수집합니다.this.$를 통해listeners.상위 구성 요소 데이터의 값을 수정하기 위해 XXX () 를 직접 호출할 수 있습니다.서브어셈블리
<template>
<div class="container">
<button @click="change"> </button>
</div>
</template>
<script>
export default {
// inheritAttrs:true,
created(){
console.log(this)
},
methods:{
change(){
// this.$emit('msgChange')
// this.$parent.change()
// $emit ,$parent
this.$listeners.msgChange(' ')
}
}
};
</script>
provide를 통해 의존을 제공하고, inject 주입 의존을 통해 데이터의 다단계 서브어셈블리 전달을 실현합니다.부모 레벨의provide에 의존 대상을 제공하여 하위 구성 요소가 이 대상에 접근할 수 있도록 합니다
“
provide와 inject 연결은 응답할 수 있는 것이 아닙니다.이것은 애써 한 것이다.그러나, 만약 당신이 감청 가능한 대상에 전송된다면, 그 대상의property는 응답할 수 있습니다.
”
사실provide와inject 귀속 자체는 별도의 일(데이터 귀속 등)을 하지 않고 제공된 데이터를 하위 구성 요소에 노출시킨다는 것이다.그러면 노출된 데이터가 상응하는지 여부는 데이터 자체에 달려 있다
상위 어셈블리
<template>
<div class='container'>
<demo2 class="demo" style="color:red" :msg="msg" @msgChange="change"/>
</div>
</template>
<script>
import demo2 from './demo2'
export default {
provide(){
return {
msg:this.msg,
msgChange:this.change,
// this 。
// this vue ,
app:this
}
},
data () {
return {
msg: ' '
}
},
methods: {
change(){
this.msg += 1;
}
},
components: {
demo2
}
}
</script>
후손의 하위 구성 요소는reject를 통해 상응하는 의존을 주입할 수 있다서브어셈블리
<template>
<div class="container">
<!-- msg -->
<div>{{msg}} </div>
<!-- msg , vue -->
<div>{{app.$data.msg}}</div>
<button @click="msgChange"> </button>
</div>
</template>
<script>
export default {
inject:['msg','msgChange','app']
};
</script>
구성 요소 실례에 직접 접근하여 데이터를 얻다
ref를 통해 구성 요소 실례 가져오기
ref 속성 정의는 구성 요소에서 가져온 vue 실례이며, 원본 탭에서 가져온 것은 대응하는dom
마운트 후에 $refs의 내용을 받을 수 있습니다
상위 어셈블리
<template>
<div class='container'>
{{msg}}
<demo2 ref="test"/>
</div>
</template>
<script>
import demo2 from './demo2'
export default {
data () {
return {
msg: ''
}
},
// $refs 。
//
mounted(){
this.msg = this.$refs.test.msg
},
components: {
demo2
}
}
</script>
서브어셈블리
<script>
export default {
data(){
return {
msg:' '
}
}
}
</script>
\$parent/$children을 통해 구성 요소 인스턴스 가져오기같은 것도 mounted 이후에야 대응하는 실례를 얻을 수 있습니다.
여기는 부모 구성 요소가 하위 구성 요소의 msg를 보여 주고, 하위 구성 요소가 부모 구성 요소의 msg를 보여 줍니다.
상위 어셈블리에서 $children을 통해 하위 어셈블리 인스턴스 가져오기
상위 어셈블리
<template>
<div class='container'>
{{msg}}
<demo2/>
</div>
</template>
<script>
import demo2 from './demo2'
export default {
data () {
return {
msg: '',
fatherMsg:" "
}
},
mounted(){
console.log(this.$children)
// sonMsg,$children
this.msg = this.$children[0].sonMsg;
},
components: {
demo2
}
}
</script>
하위 구성 요소 $paren을 통해 상위 구성 요소 인스턴스 가져오기서브어셈블리
<template>
<div class='container'>
{{msg}}
</div>
</template>
<script>
export default {
data () {
return {
msg:'',
sonMsg: ' '
}
},
mounted(){
// fatherMsg
this.msg = this.$parent.fatherMsg;
}
}
</script>
공공 창고 공유 데이터 정의
eventBus 공유 데이터 정의
Vue 원형에 $bus를 추가하면 새로운 vue 대상입니다. 전역적인 vue 실례에서 $bus를 통해 이 vue 대상을 얻을 수 있습니다. 이 대상의 속성과 방법을 얻을 수 있습니다.
메인js에서 정의
Vue.prototype.$bus = new Vue({
data:{
a:1,
b:2
},
methods:{
log(){
console.log(this.a)
}
}
})
$bus에 정의된 속성과 방법을 글로벌 Vue 인스턴스에서 확인할 수 있습니다.Vuex를 통한 데이터 공유
정부에서 제시한 다중 구성 요소로 데이터를 전달하는 해결 방안
store index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
test:'123123123',
test2:'123123123',
},
mutations: {
changeTest(state,payload){
console.log(state,payload)
state.test = payload.value
},
changeTest2(state,payload){
console.log(state,payload)
state.test2 = payload.value
}
},
actions: {
asyncChageTest({commit},payload){
setTimeout( ()=>{
commit('changeTest2',payload)
},2000)
}
},
modules: {
}
})
어셈블리에서 사용
<template>
<div class='container'>
{{this.$store.state.test}}
{{test}}
{{this.$store.state.test2}}
{{test2}}
<button @click="change"> </button>
<button @click="asyncChange"> </button>
</div>
</template>
<script>
// mapState state
import { mapState,mapMutations,mapActions } from 'vuex'
export default {
data(){
return {
msg:' '
}
},
computed:{
...mapState(['test','test2'])
},
methods:{
//
...mapMutations(['changeTest']),
...mapActions(['asyncChageTest']),
change(){
// state
this.$store.commit('changeTest',{value:' test '});
// this.changeTest({value:' '})
},
asyncChange(){
// state
this.$store.dispatch('asyncChageTest',{value:' test2 '})
// this.asyncChageTest({value:' test2 '})
}
},
}
</script>
이상은 Vue에서 구성 요소 간의 데이터 전달 방식에 대해 정리한 것이다. 일상적인 개발에서 사용하는 장면에 따라 적당한 방식으로 데이터의 전달을 해야 한다.Vue 구성 요소 간의 데이터 전달 방식(3가지)에 대한 이 글을 소개합니다. 더 많은 Vue 구성 요소 간의 데이터 전달 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.