Vue Component - ChoDragon9/posts GitHub Wiki
- λ·°μ λ°μ΄ν° λ‘μ§μ μ¬μ¬μ©
- λ°μμ μ΄κ³ μ‘°ν©μ΄ κ°λ₯ν μ»΄ν¬λνΈ
- λΆλͺ¨-μμ μ»΄ν¬λνΈ κ°μ λͺ νν μΈν°νμ΄μ€ λΆλ¦¬
- μΆλ‘ μ΄ μ½κ³ μ μ§ κ΄λ¦¬κ° μ¬μ΄ μμ¬μν΅
- μΆλ‘ μ΄ μ½κ² λͺ νν μ½ν μΈ λ°°ν¬ νλ‘μΈμ€
- DOM λ³κ²½ λ¨μΌν(refs κ°μ²΄ μ¬μ©)
- μΈν°νμ΄μ€μ λ¨μν : Vue μΈμ€ν΄μ€λ₯Ό μ¬μ©νμ¬
λͺ¨λ μ΅μ κ°μ²΄
,λΌμ΄ν μ¬μ΄ν΄ ν
λ₯Ό μ¬μ©ν μ μλ€.
μΈ κ°μ μ»΄ν¬λνΈ μΈμ€ν΄μ€κ° λͺ¨λ κ°μ data
κ°μ²΄λ₯Ό 곡μ νλ―λ‘ νλμ μΉ΄μ΄ν°λ₯Ό μ¦κ° μν€λ©΄ λͺ¨λ μ¦κ°ν©λλ€.
κ·Έλμ μλ‘μ΄ λ°μ΄ν° κ°μ²΄
λ₯Ό λ°ννμ¬ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€.
Vue.component('my-component', {
template: '<span>{{ message }}</span>',
data: {message: 'hello'}
})
<div id="example-2">
<simple-counter></simple-counter>
<simple-counter></simple-counter>
<simple-counter></simple-counter>
</div>
μ»΄ν¬λνΈλ λΆλͺ¨-μμ κ΄κ³μμ κ°μ₯ μΌλ°μ μΌλ‘ ν¨κ» μ¬μ©νκΈ° μν κ²μ΄λ€. μ»΄ν¬λνΈ Aλ μ체 ν
νλ¦Ώμμ μ»΄ν¬λνΈ Bλ₯Ό μ¬μ©ν μ μλ€.
κ·Έλ€μ νμ°μ μΌλ‘ μλ‘ μμ¬μν΅
μ΄ νμν©λλ€. λΆλͺ¨λ μμμμΈ λ°μ΄ν°λ₯Ό μ λ¬
ν΄μΌ ν μλ μμΌλ©°, μμμ μμ μκ² μΌμ΄λ μΌμ λΆλͺ¨μκ² μ릴 νμ
κ° μμ΅λλ€.
κ·Έλ¬λ λΆλͺ¨μ μμμ΄ λͺ
ννκ² μ μλ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ κ°λ₯νν λΆλ¦¬λ μν
λ‘ μ μ§νλ κ²λ λ§€μ° μ€μν©λλ€.
μ΄λ κ²νλ©΄ κ° μ»΄ν¬λνΈμ μ½λλ₯Ό μλμ μΌλ‘ 격리
ν μ μλλ‘ μμ±νκ³ μΆλ‘
ν μ μμΌλ―λ‘ μ μ§ κ΄λ¦¬κ° μ½κ³
μ μ¬μ μΌλ‘ μ½κ² μ¬μ¬μ©
ν μ μμ΅λλ€.
VueJsμμ λΆλͺ¨-μμ μ»΄ν¬λνΈ κ΄κ³λ props
λ μλλ‘, events
μλ‘ λΌκ³ μμ½ν μ μμ΅λλ€. λΆλͺ¨λ props
λ₯Ό ν΅ν΄ μμμκ² λ°μ΄ν°λ₯Ό μ λ¬νκ³ μμμ events
λ₯Ό ν΅ν΄ λΆλͺ¨μκ² λ©μμ§λ₯Ό 보λ
λλ€.
λͺ¨λ μ»΄ν¬λνΈ μΈμ€ν΄μ€μλ μ체 격리 λ²μ
κ° μμ΅λλ€. μ¦, νμ μ»΄ν¬λνΈμ ν
νλ¦Ώμμ μμ λ°μ΄ν°λ₯Ό μ§μ μ°Έμ‘° ν μ μμΌλ©°
κ·Έλ κ² ν΄μλ μλ©λλ€. λ°μ΄ν°λ₯Ό props
μ μ¬μ©νμ¬ νμ μ»΄ν¬λνΈλ‘ μ λ¬ λ μ μμ΅λλ€.
prop
λ μμ μ»΄ν¬λνΈμ μ 보λ₯Ό μ λ¬νκΈ° μν μ¬μ©μ μ§μ νΉμ±μ
λλ€. νμ μ»΄ν¬λνΈλ props
μ΅μ
μ μ¬μ©νμ¬
μμ ν κ²μΌλ‘ κΈ°λλλ props
λ₯Ό λͺ
μμ μΌλ‘ μ μΈν΄μΌ ν©λλ€.
λ°μ΄ν°κ° μμμμ μ λ°μ΄νΈ λ λλ§λ€ νμ λ°μ΄ν°λ‘λ μ λ¬λ©λλ€.
νμ μμ±κ³Ό μμ μμ± μ¬μ΄μ λ¨λ°©ν₯ λ°μΈλ©
μ νμ±ν©λλ€. μμ μμ±μ΄ μ
λ°μ΄νΈλλ©΄ νμλ‘ νλ₯΄κ² λμ§λ§ κ·Έ λ°λλ μλ©λλ€.
μ΄λ κ²νλ©΄ νμ μ»΄ν¬λνΈκ° μ€μλ‘ λΆλͺ¨μ μνλ₯Ό λ³κ²½νμ¬ μ±μ λ°μ΄ν° νλ¦μ μΆλ‘ νκΈ° λ μ΄λ ΅κ² λ§λλ κ²μ λ°©μ§
ν μ μμ΅λλ€.
λλΆλΆμ μμ±μ κ²½μ° μ»΄ν¬λνΈμ μ 곡λ κ°μ μ»΄ν¬λνΈμμ μ€μ λ κ°μ λ체ν©λλ€. μλ₯Ό λ€μ΄, type="large"
κ° μ λ¬λλ©΄
type="data"
λ₯Ό λ체ν κ²μ΄κ³ μλ§λ λ§κ°λ¨λ¦΄ κ²μ
λλ€. class
μ style
μμ±μ λ κ°μ΄ ν©μ³μ Έμ μ΅μ’
κ°μΌλ‘ λ§λλλ€.
λΆλͺ¨ μ»΄ν¬λνΈλ μμ μ»΄ν¬λνΈκ° μ¬μ©λλ ν
νλ¦Ώμμ μ§μ v-on
μ μ¬μ©νμ¬ μμ μ»΄ν¬λνΈμμ 보λ΄μ§ μ΄λ²€νΈλ₯Ό μ²μ·¨ν μ μμ΅λλ€.
λΆλͺ¨-μμμ΄ μλ λ μ»΄ν¬λνΈκ° μλ‘ ν΅μ μ΄ νμν λ Vue μΈμ€ν΄μ€λ₯Ό μ€μ μ΄λ²€νΈ λ²μ€λ‘ μ¬μ©ν μ μμ΅λλ€.
var bus = new Vue()
// μ»΄ν¬λνΈ Aμ λ©μλ
bus.$emit('id-selected', 1)
// μ»΄ν¬λνΈ Bμ created ν
bus.$on('id-selected', function (id) {
// ...
})
μ»΄ν¬λνΈλ₯Ό μ¬μ©ν λ λ€μκ³Ό κ°μ΄ μ»΄ν¬λνΈλ₯Ό ꡬμ±νλ κ²μ΄ μ’μ΅λλ€.
<app>
<app-header></app-header>
<app-footer></app-footer>
</app>
μ£Όλͺ©ν΄μΌν λκ°μ§ μ¬νμ΄ μμ΅λλ€.
-
<app>
μ»΄ν¬λνΈλ μ΄λ€ 컨ν μΈ λ₯Ό λ°μ μ§ λͺ¨λ¦ λλ€. κ·Έκ²μ<app>
μ΄ μ¬μ©νλ μ»΄ν¬λνΈμ μν΄ κ²°μ λ©λλ€. -
<app>
μ»΄ν¬λνΈμλ μ체 ν νλ¦Ώμ΄ μμ κ°λ₯μ±μ΄ ν½λλ€.
μ ꡬμ±μΌλ‘ μλνλλ‘ νλ €λ©΄ λΆλͺ¨ μ½ν
μΈ μ μ»΄ν¬λνΈμ μ체μ ν
νλ¦Ώμ μλ λ°©λ²μ΄ νμν©λλ€. μ΄κ²μ μ½ν
μΈ λ°°ν¬ νλ‘μΈμ€
μ
λλ€.
VueJSλ νμ¬ μΉ μ»΄ν¬λνΈ μ¬μ μ΄μμ
λͺ¨λΈλ‘ ν μ½ν
μΈ λ°°ν¬ APIλ₯Ό ꡬννλ©° μλ³Έ μ½ν
μΈ μ λ°°ν¬ν μν νκΈ° μν΄ νΉμν <slot>
μ리먼νΈλ₯Ό μ¬μ©ν©λλ€.
μ»΄νμΌλλ λ²μλ₯Ό λͺ νν ν΄μΌ ν©λλ€. λ€μκ³Ό κ°μ ν νλ¦Ώμ΄ μλ€κ³ μμν΄λ³΄κ² μ΅λλ€.
<child-component>{{message}}</child-component>
message
κ° λΆλͺ¨ λ°μ΄ν° λλ μμ λ°μ΄ν° μ€ λΆλͺ¨μ λ°μΈλ©λμ΄μΌ ν©λλ€. μ»΄ν¬λνΈ λ²μμ λν κ°λ¨ν λ²μΉμ λ€μκ³Ό κ°μ΅λλ€.
- μμ ν νλ¦Ώμ λͺ¨λ λ΄μ©μ μμ λ²μλ‘ μ»΄νμΌλ©λλ€.
- νμ ν νλ¦Ώμ λͺ¨λ λ΄μ©μ νμ λ²μμμ μ»΄νμΌλ©λλ€.
μΌλ°μ μΈ μ€μλ λΆλͺ¨ ν νλ¦Ώμ νμ μμ±/λ©μλμ λλ ν°λΈλ₯Ό λ°μΈλ©νλ €κ³ νλ κ²μ λλ€.
<child-component v-show="someChildProperty"></child-component>
someChildProperty
κ° μμ μ»΄ν¬λνΈμ μμ±μ΄λΌκ³ κ°μ νλ©΄, μμ μμ λ μλνμ§ μμ κ²μ
λλ€.
νμ μ»΄ν¬λνΈ ν
νλ¦Ώμ μ΅μν νλμ <slot>
μ½ν
μΈ κ° ν¬ν¨λμ΄ μμ§ μμΌλ©΄ λΆλͺ¨ μ½ν
μΈ κ° μμ λ©λλ€.
μμ±μ΄ μλ μ¬λ‘―μ΄ νλ λΏμΈ κ²½μ° μ 체 λ΄μ© μ‘°κ°μ΄ DOMμ ν΄λΉ μμΉμ μ½μ
λμ΄ μ¬λ‘― μ체λ₯Ό λ체ν©λλ€.
μλ <slot>
νκ·Έ μμ μλ λ΄μ©μ λ체 μ½ν
μΈ
λ‘ κ°μ£Όλ©λλ€. λ체 μ½ν
μΈ λ νμ λ²μμμ μ»΄νμΌ λλ©° νΈμ€ν
μ리먼νΈκ° λΉμ΄ μκ³
μ½μ
ν μ½ν
μΈ κ° μλ κ²½μ°μλ§ νμλ©λλ€.
my-component
λΌλ μ»΄ν¬λνΈκ° μλ€κ³ κ°μ
<div>
<h2>λλ μμ μ»΄ν¬λνΈμ μ λͺ©μ
λλ€</h2>
<slot>
μ 곡λ 컨ν
μΈ κ° μλ κ²½μ°μλ§ λ³΄μ€ μ μμ΅λλ€.
</slot>
</div>
μ»΄ν¬λνΈλ₯Ό μ¬μ©νλ λΆλͺ¨ μ»΄ν¬λνΈ
<div>
<h1>λλ λΆλͺ¨ μ»΄ν¬λνΈμ μ λͺ©μ
λλ€</h1>
<my-component>
<p>μ΄κ²μ μλ³Έ 컨ν
μΈ μ
λλ€.</p>
<p>μ΄κ²μ μλ³Έ μ€ μΆκ° 컨ν
μΈ μ
λλ€</p>
</my-component>
</div>
μλμ²λΌ λ λλ§ λ©λλ€.
<div>
<h1>λλ λΆλͺ¨ μ»΄ν¬λνΈμ μ λͺ©μ
λλ€</h1>
<div>
<h2>λλ μμ μ»΄ν¬λνΈμ μ λͺ© μ
λλ€</h2>
<p>μ΄κ²μ μλ³Έ 컨ν
μΈ μ
λλ€.</p>
<p>μ΄κ²μ μλ³Έ μ€ μΆκ° 컨ν
μΈ μ
λλ€</p>
</div>
</div>
μ¬λ‘―μ μ΄λ¦μ μ§μ νμ¬ μ΄λ»κ² λ΄μ©μ λ°°ν¬ν΄μΌ νλ μ§λ₯Ό 컀μ€ν°λ§μ΄μ§μ ν μ μλ€. λͺ λͺ λμ§ μμ μ¬λ‘―μ νλλ§ μ¬μ©λκ³ μ½ν μΈ μ ν¬κ΄μ μΈ μ»¨ν μΈ μν μ ν©λλ€.
μ΄λ €μμ μμ±μν¨...
κ°μ λ§μ΄νΈ ν¬μΈνΈλ₯Ό μ¬μ©νκ³ μμ½λ <component>
μ리먼νΈλ₯Ό μ¬μ©νμ¬ μ΄λ¬ μ»΄ν¬λνΈ κ°μ λμ μΌλ‘ νΈλμ§μ
νκ³
is
μμ±μ λμ μΌλ‘ λ°μΈλ ν μ μμ΅λλ€.
var vm = new Vue({
el: '#example',
data: {
currentView: 'home'
},
components: {
home: { /* ... */ },
posts: { /* ... */ },
archive: { /* ... */ }
}
})
<component v-bind:is="currentView">
<!-- vm.currentViewκ° λ³κ²½λλ©΄ μ»΄ν¬λνΈκ° λ³κ²½λ©λλ€! -->
</component>
μ»΄ν¬λνΈλ₯Ό μμ±ν λ λμ€μ λ€λ₯Έ κ³³μμ λ€μ μ¬μ©ν κ²μΈμ§μ λν μ¬λΆλ₯Ό λͺ
μ¬νλ κ²μ΄ μ’μ΅λλ€.
μΌνμ© μ»΄ν¬λνΈκ° λ¨λ¨ν κ²°ν© λμ΄λ μκ΄ μμ§λ§ μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈλ κΉ¨λν κ³΅μ© μΈν°νμ΄μ€λ₯Ό μ μ ν΄μΌνλ©°
μ¬μ©λ 컨ν
μ€νΈμ λν κ°μ μ νμ§ μμμΌν©λλ€.
Vue μ»΄ν¬λνΈμ APIλ Props
, Event
, Slot
μ μΈ λΆλΆμΌλ‘ λλ©λλ€.
-
Props
λ μΈλΆ νκ²½μ΄ λ°μ΄ν°λ₯Ό μ»΄ν¬λνΈλ‘ μ λ¬νλλ‘ νμ©ν©λλ€. -
Event
λ₯Ό ν΅ν΄ μ»΄ν¬λνΈκ° μΈλΆ νκ²½μμ μ¬μ΄λ μ΄ννΈλ₯Ό λ°μν μ μλλ‘ ν©λλ€. -
Slot
μ μ¬μ©νλ©΄ μΈλΆ νκ²½μμ μΆκ° 컨ν μΈ κ° ν¬ν¨ λ μ»΄ν¬λνΈλ₯Ό μμ±ν μ μμ΅λλ€.
props
λ event
κ° μμμμλ λΆκ΅¬νκ³ λλλ‘ Javascriptλ‘ νμ μ»΄ν¬λνΈμ μ§μ μ‘μΈμ€ ν΄μΌ ν μλ μμ΅λλ€.
μ΄λ₯Ό μν΄ ref
λ₯Ό μ¬μ©νμ¬ μ°Έμ‘° μ»΄ν¬λνΈ IDλ₯Ό μμ μ»΄ν¬λνΈμ ν λΉν΄μΌ ν©λλ€.
ref
λ μλ¦¬λ¨ΌνΈ λλ μμ μ»΄ν¬λνΈμ λν μ°Έμ‘°λ₯Ό λ±λ‘
νλ λ° μ¬μ©ν©λλ€. μΌλ° DOM μ리먼νΈμ μ¬μ©λλ κ²½μ°
μ°Έμ‘°λ ν΄λΉ μ리먼νΈμ
λλ€. νμ μ»΄ν¬λνΈμμ μ¬μ©λλ κ²½μ° μ°Έμ‘°λ μ»΄ν¬λνΈ μΈμ€ν΄μ€μ
λλ€.
μ°Έμ‘° μ체λ λ λλ§ ν¨μμ κ²°κ³Ό
λ‘ μμ±λκΈ° λλ¬Έμ μ΄κΈ° λ λλ§μμ μ°Έμ‘° μ체λ₯Ό μμΈμ€ ν μ μμ΅λλ€. 그리κ³
λ°μμ΄ μμΌλ―λ‘ λ°μ΄ν° λ°μΈλ©μ μν΄ ν
νλ¦Ώμμ μ¬μ©ν΄μλ μλ©λλ€.
λκ·λͺ¨ μμ© νλ‘κ·Έλ¨μμ μμ© νλ‘κ·Έλ¨μ λ μμ λ©μ΄λ¦¬λ‘ λλκ³ μ€μ λ‘ νμν λλ§ μλ²μμ μ»΄ν¬λνΈλ₯Ό λ‘λν΄μΌ ν μλ μμ΅λλ€.
Vueλ₯Ό μ¬μ©νλ©΄ μ»΄ν¬λνΈ μ μλ₯Ό λΉλκΈ°μμΌλ‘ ν΄κ²°νλ ν©ν 리 ν¨μ
λ‘ μ»΄ν¬λνΈλ₯Ό μ μ ν μ μμ΅λλ€. Vueλ μ»΄ν¬λνΈκ° μ€μ λ‘ λ λλ§λμ΄μΌ ν λλ§ ν©ν 리 κΈ°λ₯μ νΈλ¦¬κ±°νκ³ μ΄νμ 리λ λλ§μ μν΄ κ²°κ³Όλ₯Ό μΊμ
ν©λλ€.
Vue.component('async-example', function (resolve, reject) {
setTimeout(function () {
// μ»΄ν¬λνΈ μ μλ₯Ό resolve μ½λ°±μ μ λ¬ν©λλ€.
resolve({
template: '<div>I am async!</div>'
})
}, 1000)
})
μΌλ° HTML μ리먼νΈλ₯Ό λ λλ§νλ κ²μ Vueμμ λ§€μ° λΉ λ₯΄μ§λ§ κ°λ μ μ μ½ν
μΈ κ° λ§μ΄
ν¬ν¨λ μ»΄ν¬λνΈκ° μμ μ μμ΅λλ€.
μ΄λ° κ²½μ°, v-once
λλ ν°λΈλ₯Ό λ£¨νΈ μ리먼νΈμ μΆκ°ν¨μΌλ‘μ¨ μΊμκ° νλ²λ§
μ€νλλλ‘ ν μ μμ΅λλ€.
Vue.component('terms-of-service', {
template: '\
<div v-once>\
<h1>Terms of Service</h1>\
... a lot of static content ...\
</div>\
'
})