provideprovide는 부모 컴포넌트가 자식 컴포넌트에게 데이터를 제공하는 기능입니다.
구문:
provide는 일반적으로 함수로 정의되며, 이 함수는 객체를 반환합니다.예시:
// ParentComponent.vue
<template>
<div>
<h1>부모 컴포넌트</h1>
<ChildComponent />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent,
},
data() {
return {
counter: 0,
};
},
provide() {
return {
message: '안녕하세요, 자식 컴포넌트!',
increment: () => this.counter++,
getCounter: () => this.counter,
};
},
};
</script>
위 예시에서 provide는 message, increment, getCounter 세 가지를 제공하고 있습니다. increment는 카운터를 증가시키는 메소드이며, getCounter는 현재 카운터 값을 반환하는 메소드입니다.
injectinject는 자식 컴포넌트가 부모 컴포넌트에서 제공한 데이터나 메소드를 사용할 수 있게 해주는 기능입니다.
구문:
inject는 배열이나 객체 형태로 정의할 수 있습니다.예시:
// ChildComponent.vue
<template>
<div>
<h2>자식 컴포넌트</h2>
<p>{{ message }}</p>
<button @click="increment">카운터 증가</button>
<p>현재 카운터: {{ getCounter() }}</p>
</div>
</template>
<script>
export default {
inject: ['message', 'increment', 'getCounter'], // 제공된 값들을 주입
};
</script>
위의 ChildComponent에서 inject를 사용하여 ParentComponent에서 제공한 message, increment, getCounter 메소드를 주입받고 있습니다. 이제 이 컴포넌트는 부모 컴포넌트에서 제공된 데이터와 메소드를 사용할 수 있습니다.
provide와 inject의 특징상위 계층에서 하위 계층으로의 데이터 제공: provide는 상위 컴포넌트에서 하위 컴포넌트로 데이터를 전달합니다. 이는 일반적인 props 전달과는 다르며, 여러 계층의 중간 컴포넌트를 건너뛰고 직접 데이터를 전달할 수 있습니다.
리액티브한 데이터: provide에서 제공하는 값이 리액티브하려면, Vue의 반응형 시스템을 따라야 합니다. 예를 들어, Vue의 data()에서 반환한 객체를 제공하면, 자식 컴포넌트에서 해당 값이 변화할 때 자동으로 반영됩니다.
provide와 inject는 여러 자식 컴포넌트에서 동일한 데이터를 사용할 수 있게 해줍니다. 예를 들어, 테마나 사용자 정보와 같이 애플리케이션 전역에서 필요로 하는 데이터에 유용합니다.
// ThemeProvider.vue
<template>
<div>
<h1>테마 프로바이더</h1>
<slot></slot> <!-- 자식 컴포넌트를 삽입할 수 있는 슬롯 -->
</div>
</template>
<script>
export default {
provide() {
return {
theme: 'dark',
toggleTheme: () => {
this.theme = this.theme === 'dark' ? 'light' : 'dark';
},
};
},
};
</script>
위의 ThemeProvider는 theme와 toggleTheme을 제공하여 여러 자식 컴포넌트에서 사용할 수 있도록 합니다.
복잡한 컴포넌트 구조를 가진 애플리케이션에서, 여러 레벨의 자식 컴포넌트가 상위 컴포넌트의 데이터를 필요로 할 때 유용합니다.
// App.vue
<template>
<ThemeProvider>
<ChildComponent />
</ThemeProvider>
</template>
위와 같은 구조에서는 ChildComponent가 ThemeProvider에서 제공하는 데이터를 쉽게 사용할 수 있습니다.
직접적인 단방향 데이터 흐름: provide와 inject는 부모에서 자식으로의 데이터 흐름만을 지원합니다. 자식 컴포넌트에서 제공한 데이터를 부모 컴포넌트에서 직접 변경할 수는 없습니다. 이는 Vue의 단방향 데이터 흐름 원칙을 따릅니다.
이벤트 핸들링: 자식 컴포넌트에서 부모 컴포넌트의 메소드를 호출할 수는 있지만, 자식에서 부모로 데이터를 전달하고 싶다면 여전히 $emit를 사용해야 합니다.
provide: 부모 컴포넌트에서 자식 컴포넌트에 데이터를 제공하는 방법입니다. 데이터를 객체 형태로 반환하며, 리액티브한 데이터와 메소드를 제공할 수 있습니다.
inject: 자식 컴포넌트가 부모 컴포넌트에서 제공한 데이터를 사용할 수 있게 해주는 방법입니다. 제공된 값의 이름을 배열 또는 객체 형태로 지정합니다.
사용 사례: 데이터 공유가 필요할 때, 복잡한 컴포넌트 구조에서 데이터 관리를 간소화할 수 있습니다.
이와 같은 방식으로 provide와 inject를 활용하면 Vue 애플리케이션의 데이터 관리를 더 효과적으로 할 수 있습니다. 필요할 때마다 이 기능을 적절하게 활용하여 컴포넌트 간의 의존성을 줄이고, 코드의 가독성을 높이는 데 기여할 수 있습니다.