function provide<T>(key: InjectionKey<T> | string, value: T): void
provide 함수는 문자열 key와 T 타입 value를 갖는다. value는 반응형을 포함한 모든 값을 사용할 수 있다. 반응형을 사용하면 자식 컴포넌트도 당연히 반응성을 이용할 수 있어서 양방향 소통이 가능하다. props가 단방향의 readonly로 사용되는 것이 권장되는 것과는 좀 다른 양상이다.
다음으로 inject 함수에 대해 알아보자. inject 함수는 provide된 key를 이용해 value를 사용할 수 있다.
// 기본 값 없음
function inject<T>(key: InjectionKey<T> | string): T | undefined
// 기본 값 정의 있음
function inject<T>(key: InjectionKey<T> | string, defaultValue: T): T
// 팩토리 함수
function inject<T>(
key: InjectionKey<T> | string,
defaultValue: () => T,
treatDefaultAsFactory: true
): T
key에 해당하는 값이 provide되지 않았을 때 대응하기 위해 여러 가지 타입의 함수가 재정의 되어있다. 첫 번째 함수는 기본값이 설정되지 않은 형태로 값이 없을 때 udefined가 반환된다. 두 번째 함수는 defaultValue를 설정하고 반환한다. 세 번째 factory 함수는 반환 값을 생성할 factory 함수를 등록해서 사용할 수 있다.
inject를 component에서 사용할 때에는 setup 영역에서만 가능하고 다른 함수 내부에서는 사용할 수 없다.
router에서는 최근 버전에서 사용 가능해졌다.
import {inject} from "vue"
const num1 = inject("num1");
const num2 = inject("num2");
const num3 = inject("num3", 100); // provide 값 없을 때 기본값 100 제공
const num4 = inject("num4", ()=> { // provide 없을 때 동작할 생성 함수 제공
return Math.random()
}, true);
반응성 값 사용 시 문제점
props를 readonly로 사용하기로 결정한 이유는 조상의 값을 자식들이 일관성 있게 사용하기 위해서였다. 그런데 provide/inject에 반응성 값이 전달되면 손쉽게 자식들이 편집할 수 있어서 최초의 의도대로 사용되지 않을 수 있다.
이를 위해서 Vue는 2가지 안정장치를 제공하는데 첫 번째는 readonly 함수 사용이다.