[Vue]Provide / Inject

chaewonΒ·2024λ…„ 7μ›” 24일
0
post-thumbnail
post-custom-banner

πŸ’» Provide

ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈ ν•­λͺ©μ— 데이터λ₯Ό μ œκ³΅ν•˜λ €λ©΄ provider 역할을 ν•˜λŠ” μƒμœ„ μ»΄ν¬λ„ŒνŠΈ setup() ν•¨μˆ˜ 내뢀에 μ“Έ 수 μžˆλ‹€.

<script>
  import { provide } from 'vue';
 
  export default {
  	setup(){
  		provide('message', 'hello!')
  	},
  };
</script>

provide() ν•¨μˆ˜λŠ” 두 개의 νŒŒλΌλ―Έν„°λ₯Ό λ°›λŠ”λ‹€.

  • 첫 번째 νŒŒλΌλ―Έν„°λŠ” μ£Όμž… ν‚€:λ¬Έμžμ—΄ λ˜λŠ” Symbol이 될 수 μžˆλ‹€. μ£Όμž… ν‚€λŠ” ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ£Όμž…λœ 값을 μ‘°νšŒν•˜λŠ”λ° μ‚¬μš©λœλ‹€.
  • 두 번째 νŒŒλΌλ―Έν„°λŠ” 제곡된 κ°’: 값은 refs와 같은 λ°˜μ‘μ„± 데이터λ₯Ό ν¬ν•¨ν•˜μ—¬ λͺ¨λ“  μœ ν˜•μ΄ 될 수 μžˆλ‹€.

1-1. Reactivity

Provide / Injectλ₯Ό λ°˜μ‘μ„± λ°μ΄ν„°λ‘œ μ œκ³΅ν•  λ•Œ κ°€λŠ₯ν•œ λͺ¨λ“  변경을 provider λ‚΄λΆ€μ—μ„œ ν•˜λŠ” 것이 μ’‹λ‹€. μ΄λ ‡κ²Œ Provider 내뢀에 배치되면 ν–₯ν›„ μœ μ§€κ΄€λ¦¬κ°€ μš©μ΄ν•˜λ‹€.
λ§Œμ•½μ— Injector λ‚΄λΆ€ μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ°˜μ‘μ„± 데이터λ₯Ό λ³€κ²½ν•΄μ•Ό ν•˜λŠ” 경우 데이터 변경을 μ œκ³΅ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν•¨κ»˜ μ œκ³΅ν•˜λŠ” 것이 μ’‹λ‹€.

<script>
  // Provider
  const message = ref('Hi two');
  const updateMessage = () => {
  	message.value = 'world!';
  };
  provide('message', {message, updateMessage});
</script>
<script>
  // Injector
  const { message, updateMessage } = inject('message');

그리고 μ£Όμž…λœ μ»΄ν¬λ„ŒνŠΈμ—μ„œ 제곡된 값을 λ³€κ²½ν•  수 없도둝 ν•˜λ €λ©΄ readonly() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

<script>
  import { provide, readonly, ref } from 'vue';
  provide('count', readonly(count));
</script>

1-2. Symbol ν‚€ μ‚¬μš©

λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ‹€λ₯Έ κ°œλ°œμžμ™€ ν•¨κ»˜ μž‘μ—…ν•  λ•Œ 잠재적 μΆ©λŒμ„ ν”Όν•˜κΈ° μœ„ν•΄ Symbol μ£Όμž… ν‚€λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 κ°€μž₯ μ’‹λ‹€.

<script>
  // keys.js
  export const myInjectionKey = Symbol()
</script>
<script>
  // in provider component
  import { provide } from 'vue'
  import { myInjectionKey } from './keys.js'
  
  provide(myInjectionKey, {
   /* data to provide */
  })
</script>
<script>
  // in injector component
  import { inject } from 'vue'
  import { myInjectionKey } from './keys.js'
  
  const injected = inject(myInjectionKey)
</script>

1-3. App-level Provide

μ»΄ν¬λ„ŒνŠΈμ—μ„œ 데이터λ₯Ό μ œκ³΅ν•˜λŠ” 것 외에 App-levelμ—μ„œ μ œκ³΅ν•  μˆ˜λ„ μžˆλ‹€.

<script>
  import { createApp } from 'vue';
  import App from './App.vue'
  const app = createApp(App);
  app.provide('appMessage', 'hello app message')
  app.mount('#app');
</script>

πŸ”¨ Provide / Inject μ‚¬μš© 예

App-levelμ—μ„œμ˜ ProvideλŠ” μ•±μ—μ„œ λ Œλ”λ§λ˜λŠ” λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€. 이것은 Plugin을 μž‘μ„±ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€. Vue2μ—μ„œ μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€ 객체λ₯Ό μΆ”κ°€ν•  λ•Œ global property에 μΆ”κ°€ ν–ˆμœΌλ‚˜, Vue3μ—μ„œ Composition API setup ν•¨μˆ˜μ—μ„œλŠ” μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•  수 μ—†λ‹€. μ΄λ•Œ λŒ€μ‹ ν•˜μ—¬ Provide / Injectλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

profile
μ˜λ¬Έμ€ 'μ‚Άμ˜ μˆ˜μ€€'을 κ²°μ •ν•˜κ³ , μ§ˆλ¬Έμ€ 'μ‚Ά 자체'λ₯Ό λ°”κΎΌλ‹€.
post-custom-banner

0개의 λŒ“κΈ€