Front

Vue 컴포넌트의 데이터 효율적으로 다루기

Z00_HWAN_99 2024. 10. 16. 17:04
728x90
반응형

"App 컴포넌트의 데이터 전달"의 문제점

  • 불필요한 컴포넌트도 데이터를 전달받아야함.
  • 컴포넌트 트리 구조가 깊게 연결되어 있을수록 데이터 전달이 매우 번거로움.

provide

  • 컴포넌트에서 정의 데이터를 자신과 컴포넌트 트리 구조로 연결된 하위 컴포넌트에 공유하는 기능.

inject

  • provide 기능으로 공유한 데이터를 가져올 때 사용하는 기능.
  • default 속성으로 기본값을 따로 지정할 수도 있음.

컴포넌트 구분 없이 모든 컴포넌트에 데이터를 공유하고 싶으면 App-Level provide 기능을 사용해야 한다.

main.js 파일에서 provide 기능을 사용한다는 의미임.(모든 컴포넌트에서 provide()함수로 정의한 데이터를 공유함)

 

App.vue

<script>
import FirstChild from './components/FirstChild.vue';

export default{
components : {
FirstChild,
},
provide(){
return{
message : this.message,
reversedMessage : this.reversedMessage,
};
},
data(){
return{
message : 'Hello Firstchild Component',
};
},
computed : {
reversedMessage(){
return this.message.split('').reverse().join('');
},
},
}
</script>

<template>
<FirstChild></FirstChild>
</template>

<style scoped>
 
</style>

 

FirstChild.vue

<script>
export default{
inject : ['message', 'reversedMessage'],
}
</script>
<template>
<h1>{{ message }}</h1>
<h1>{{ reversedMessage }}</h1>
</template>
<style scoped>
</style>

 

App.vue

<script>
import FirstChild from './components/FirstChild.vue';

//provide 속성의 키를 symbol 값으로 사용하여 데이터를 주입
import{message, reversedMessage} from '@/keys.js';
export default{
components : {
FirstChild,
},
provide(){
return{
[message] : this.message,
[reversedMessage] : this.reversedMessage,
};
},
data(){
return{
message : 'Hello Firstchild Component',
};
},
computed : {
reversedMessage(){
return this.message.split('').reverse().join('');
},
},
}
</script>

<template>
<FirstChild></FirstChild>
</template>

<style scoped>
 
</style>

FirstChild.vue

<script>
import{message, reversedMessage} from '@/keys.js';

export default{
inject : {
customMessage : {
from : message,//import로 불러온 symbol 값
default : 'default hello!',
},
customReversedMessage : {
from : reversedMessage,//import로 불러온 symbol 값
default : 'default hello!'
},
},
}
</script>
<template>
<h1>{{ customMessage }}</h1>
<h1>{{ customReversedMessage }}</h1>
</template>
<style scoped>
</style>

keys.js

export const message = Symbol();
export const reversedMessage = Symbol();

 

728x90
반응형

'Front' 카테고리의 다른 글

컴포넌트 슬롯(Slot)  (0) 2024.10.17
컴포넌트의 데이터 참조방법 - ref  (0) 2024.10.17
Vue component에 속성과 이벤트 정의  (0) 2024.10.16
Vue 컴포넌트 생명주기 이해하기  (2) 2024.10.16
Vue 컴포넌트 다루기  (2) 2024.10.16