μ–Έμ–΄/Vue.js

특수 μ—˜λ¦¬λ¨ΌνŠΈ

MellowHoney 2024. 3. 29. 01:15
728x90
λ°˜μ‘ν˜•

<component>

μ„€λͺ…

<aside> πŸ”– 동적 μ»΄ν¬λ„ŒνŠΈ λ˜λŠ” μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό λ Œλ”λ§ν•˜κΈ° μœ„ν•œ "메타 μ»΄ν¬λ„ŒνŠΈ" λ Œλ”λ§ ν•  μ‹€μ œ μ»΄ν¬λ„ŒνŠΈλŠ” is 속성(prop)에 μ˜ν•΄ κ²°μ •

</aside>

Type

interface DynamicComponentProps {
  is: string | Component // 쑰건에 ν•΄λ‹Ήν•˜λŠ” λ¬Έμžμ—΄μ΄λ‚˜ μ»΄ν¬λ„ŒνŠΈ(ν•„μˆ˜)
}

μ‚¬μš©λ²•

// λ“±λ‘λœ μ΄λ¦„μœΌλ‘œ λ Œλ”λ§(option api)
<component :is="μ»΄ν¬λ„ŒνŠΈ 이름"></component>
// μ •μ˜μ— λ”°λ₯Έ μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§(<script setup> μ»΄ν¬μ§€μ…˜ API)q 
<component :is="쑰건 ? 'true μ»΄ν¬λ„ŒνŠΈ 이름' : 'false μ»΄ν¬λ„ŒνŠΈ 이름'"></component>

<template>

μ„€λͺ…

<aside> πŸ”– DOM에 λ Œλ”λ§μ—†μ΄ μ‚¬μš©ν•  μ•¨λ¦¬λ¨ΌνŠΈλ“€μ— λŒ€ν•œ μœ„μΉ˜κΈ°μˆ  HTML 문법을 μ λŠ” 곡간 λ””λ ‰ν‹°λΈŒλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터 바인딩이 κ°€λŠ₯

HTML, CSS λ“±μ˜ λ§ˆν¬μ—… 속성과 λ·° μΈμŠ€ν„΄μŠ€μ—μ„œ μ •μ˜ν•œ 데이터 및 λ‘œμ§λ“€μ„ μ—°κ²°ν•˜μ—¬ μ‚¬μš©μžκ°€ λΈŒλΌμš°μ €μ—μ„œ λ³Ό 수 μžˆλŠ” ν˜•νƒœμ˜ HTML둜 λ³€ν™˜ν•΄μ£ΌλŠ” 속성

</aside>

세뢀사항

  • <template> μ˜ 이런 νŠΉμˆ˜ν•œ 취급은 λ‹€μŒ λ””λ ‰ν‹°λΈŒλ“€κ³Ό ν•¨κ»˜ μ‚¬μš©λ λ•Œλ§Œ 적용
    • 쑰건이 뢙은 λžœλ”λ§μœΌλ‘œ μ—¬λŸ¬κ°œμ˜ μš”μ†Œλ₯Ό λŒ€μƒμœΌλ‘œ ν•˜λŠ” 경우(v-if)
    • 리슀트 λžœλ”λ§μœΌλ‘œ μ—¬λŸ¬κ°œμ˜  μš”μ†Œλ₯Ό λŒ€μƒμœΌλ‘œ ν•˜λŠ” 경우 (v-for)
    • 이름이 뢙은 μŠ€μ½”ν”„ (v-slot)
    • 단일 파일의 μ»΄ν¬λ„ŒνŠΈ
  • <template> νƒœκ·Έ μžμ²΄λŠ” λžœλ”λ§λ˜μ§€ μ•ŠλŠ”λ‹€

μ‚¬μš©λ²•

// λ“±λ‘λœ μ΄λ¦„μœΌλ‘œ λ Œλ”λ§(option api)
<component :is="μ»΄ν¬λ„ŒνŠΈ 이름"></component>
// μ •μ˜μ— λ”°λ₯Έ μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§(<script setup> μ»΄ν¬μ§€μ…˜ API)
<component :is="쑰건 ? 'true μ»΄ν¬λ„ŒνŠΈ 이름' : 'false μ»΄ν¬λ„ŒνŠΈ 이름'"></component>

예제

  • 쑰건이 뢙은 λžœλ”λ§μœΌλ‘œ μ—¬λŸ¬ 개의 μš”μ†Œλ₯Ό λŒ€μƒμœΌλ‘œ ν•˜λŠ” 경우 (v-if)
<template v-if="ok"> <!-- okκ°€ true일 λ•Œ λ Œλ”λ§ -->
  <h1>Title</h1>
  <p>Paragraph 1</p>
  <p>Paragraph 2</p>
</template>

λžœλ”λ§μ‹œ

<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
  • 리슀트 λžœλ”λ§μœΌλ‘œ μ—¬λŸ¬ 개의 μš”μ†Œλ₯Ό λŒ€μƒμœΌλ‘œ ν•˜λŠ” 경우 (v-for)
<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider" role="presentation"></li>
  </template>
</ul>

λ Œλ”λ§ μ‹œ

<ul>
    <li>foo</li>
    <li class="divider" role="presentation"></li>
    <li>bar</li>
    <li class="divider" role="presentation"></li>
    <li>baz</li>
    <li class="divider" role="presentation"></li>
</ul>
  • 이름이 뢙은 μŠ€μ½”ν”„ (v-slot, Named Scope)

ν˜ΈμΆœλ˜λŠ” μ»΄ν¬λ„ŒνŠΈ

<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
<!-- name이 μ—†λŠ” <slot>은 μ•”μ‹œμ μœΌλ‘œ "default"λΌλŠ” 이름 ν• λ‹Ή-->
    <slot></slot> 
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>
  • ν˜ΈμΆœν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ

<script>
import BaseLayout from "/src/component/BaseLayout"
</script>

<BaseLayout>
  <template #header>
    <h1>λ‹€μŒμ€ νŽ˜μ΄μ§€ 제λͺ©μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.</h1>
  </template>

  <template #default>
    <p>μ£Όμš” λ‚΄μš©μ— λŒ€ν•œ λ‹¨λ½μž…λ‹ˆλ‹€.</p>
    <p>그리고 또 ν•˜λ‚˜.</p>
  </template>

  <template #footer>
    <p>λ‹€μŒμ€ μ—°λ½μ²˜ μ •λ³΄μž…λ‹ˆλ‹€.</p>
  </template>
</BaseLayout>
<!-- ν˜Ήμ€ -->
<BaseLayout>
  <template #header>
    <h1>λ‹€μŒμ€ νŽ˜μ΄μ§€ 제λͺ©μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.</h1>
  </template>

  <!-- implicit(μ•”μ‹œμ ) default slot -->
  <p>μ£Όμš” λ‚΄μš©μ— λŒ€ν•œ λ‹¨λ½μž…λ‹ˆλ‹€.</p>
  <p>그리고 또 ν•˜λ‚˜.</p>

  <template #footer>
    <p>λ‹€μŒμ€ μ—°λ½μ²˜ μ •λ³΄μž…λ‹ˆλ‹€.</p>
  </template>
</BaseLayout>
  • λ Œλ”λ§ μ‹œ
<div class="container">
  <header>
    <h1>λ‹€μŒμ€ νŽ˜μ΄μ§€ 제λͺ©μΌ 수 μžˆμŠ΅λ‹ˆλ‹€.</h1>
  </header>
  <main>
    <p>μ£Όμš” λ‚΄μš©μ— λŒ€ν•œ λ‹¨λ½μž…λ‹ˆλ‹€.</p>
    <p>그리고 또 ν•˜λ‚˜.</p>
  </main>
  <footer>
    <p>λ‹€μŒμ€ μ—°λ½μ²˜ μ •λ³΄μž…λ‹ˆλ‹€.</p>
  </footer>
</div>

is (속성)

동적 μ»΄ν¬λ„ŒνŠΈ λ°”인딩에 μ‚¬μš©

<!-- currentTab이 λ³€κ²½λ˜λ©΄ μ»΄ν¬λ„ŒνŠΈκ°€ λ³€κ²½λ©λ‹ˆλ‹€ -->
<component :is="tabs[currentTab]"></component>

μœ„μ˜ μ˜ˆμ—μ„œ :is에 μ „λ‹¬λœ 값은 λ‹€μŒ 쀑 ν•˜λ‚˜λ₯Ό 포함

  • λ“±λ‘λœ μ»΄ν¬λ„ŒνŠΈμ˜ 이름 λ¬Έμžμ—΄
  • μ‹€μ œ κ°€μ Έμ˜¨ μ»΄ν¬λ„ŒνŠΈ 객체
πŸ’‘ <component :is="...">λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈ 간에 μ „ν™˜ν•  λ•Œ, λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈλ‘œ μ „ν™˜λ˜λ©΄ μ»΄ν¬λ„ŒνŠΈκ°€ 마운트 ν•΄μ œ → <KeeyAlive>μ»΄ν¬λ„ŒνŠΈ μ‚¬μš©ν•˜μ—¬ λΉ„ν™œμ„± μ»΄ν¬λ„ŒνŠΈλ₯Ό ν™œμ„±μƒνƒœλ‘œ μœ μ§€ κ°€λŠ₯

<KeepAlive> | <keep-alive>

μ„€λͺ…

πŸ”– μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈ 간에 λ™μ μœΌλ‘œ μ „ν™˜λ  λ•Œ, μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€λ₯Ό μ‘°κ±΄λΆ€λ‘œ μΊμ‹œν•  수 μžˆλŠ” 빌트인 μ»΄ν¬λ„ŒνŠΈ

μ‚¬μš©λ²•

<!-- μ»΄ν¬λ„ŒνŠΈκ°€ μ „ν™˜λ  λ•Œ λ§ˆμš΄νŠΈκ°€ ν•΄μ œλ˜μ–΄ ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈκ°€ λ³΄μœ ν•œ λͺ¨λ“  λ³€κ²½λœ μƒνƒœ 손싀(μ΄ˆκΈ°ν™”) -->
<component :is="activeComponent" />
<!-- KeepAlive둜 λ§€ν•‘μ‹œ μ»΄ν¬λ„ŒνŠΈκ°€ μ „ν™˜λ˜μ–΄λ„ μƒνƒœ μœ μ§€ -->
<KeepAlive>
  <component :is="activeComponent" />
</KeepAlive>

속성

속성  μ„€λͺ…
include μΊμ‹±λ˜μ–΄ μœ μ§€λ  μ»΄ν¬λ„ŒνŠΈ μ§€μ •
속성에 μ§€μ •λœ μ»΄ν¬λ„ŒνŠΈλ“€μ€ λ°”λ€Œμ—ˆμ„ λ•Œ μΊμ‹±λ˜μ§€ μ•Šμ•„ 마운트 ν•΄μ œ
exclude μΊμ‹±λ˜μ§€ μ•Šμ•„ 마운트 ν•΄μ œλ  μ»΄ν¬λ„ŒνŠΈ μ§€μ •
속성에 μ§€μ •λœ μ»΄ν¬λ„ŒνŠΈλ“€μ€ λ°”λ€Œμ–΄λ„ μΊμ‹±λ˜μ–΄ μœ μ§€
:max 캐싱 μ΅œλŒ€μΉ˜ μ§€μ • (maxκ°’ 만큼만 μ»΄ν¬λ„ŒνŠΈ 캐싱)
<!-- μ‰Όν‘œλ‘œ κ΅¬λΆ„λ˜λŠ” λ¬Έμžμ—΄ -->
<KeepAlive include="a,b">
  <component :is="view" />
</KeepAlive>

<!-- μ •κ·œμ‹ (`v-bind`λ₯Ό μ‚¬μš©ν•΄μ•Ό 함) -->
<KeepAlive :include="/a|b/">
  <component :is="view" />
</KeepAlive>

<!-- λ°°μ—΄ (`v-bind`λ₯Ό μ‚¬μš©ν•΄μ•Ό 함) -->
<KeepAlive :include="['a', 'b']">
  <component :is="view" />
</KeepAlive>

<!-- exclude -->
<KeepAlive :exclude="a">
  <component :is="view" />
</KeepAlive>

<!-- λ™μ‹œ μ‚¬μš© -->
<!-- Compκ°€ λ“€μ–΄κ°„ μ»΄ν¬λ„ŒνŠΈ 쀑에 CompA만 λΉΌκ³  μœ μ§€λ˜κ²Œ ν•˜λŠ” 예제 -->
<KeepAlive :include="/b.*/" exclude="a">
  <component :is="view" />
</KeepAlive>

<!-- 캐싱 μ΅œλŒ€μΉ˜ μ •ν•˜κΈ° -->
<KeepAlive :max="4">
  <component :is="view" />
</KeepAlive>
λ°˜μ‘ν˜•