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>
λ°μν
'μΈμ΄ > Vue.js' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
쑰건/λ°λ³΅ λ λλ§ (0) | 2024.03.29 |
---|---|
λ°μ΄ν°λ°μΈλ© (0) | 2024.03.29 |
λλ ν°λΈ (0) | 2024.03.28 |
LifeCycle (0) | 2024.03.28 |
Vue ꡬ쑰/λ€μ΄λ° κ·μΉ (0) | 2024.03.28 |