Vue Component - ChoDragon9/posts GitHub Wiki

μ»΄ν¬λ„ŒνŠΈλ₯Ό 톡해 ν•΄κ²°ν•˜κ³  싢은 문제

  • 뷰와 데이터 둜직의 μž¬μ‚¬μš©
  • λ°˜μ‘μ μ΄κ³  쑰합이 κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ
  • λΆ€λͺ¨-μžμ‹ μ»΄ν¬λ„ŒνŠΈ κ°„μ˜ λͺ…ν™•ν•œ μΈν„°νŽ˜μ΄μŠ€ 뢄리
  • 좔둠이 쉽고 μœ μ§€ 관리가 μ‰¬μš΄ μ˜μ‚¬μ†Œν†΅
  • 좔둠이 μ‰½κ²Œ λͺ…ν™•ν•œ μ½˜ν…μΈ  배포 ν”„λ‘œμ„ΈμŠ€
  • DOM λ³€κ²½ 단일화(refs 객체 μ‚¬μš©)
  • μΈν„°νŽ˜μ΄μŠ€μ˜ λ‹¨μˆœν™” : Vue μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  μ˜΅μ…˜ 객체, 라이프 사이클 ν›…λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

데이터 μΊ‘μŠν™” : dataλ₯Ό ν•¨μˆ˜λ‘œ μ‚¬μš©ν•˜λŠ” 이유

μ„Έ 개의 μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€κ°€ λͺ¨λ‘ 같은 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

λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€μ—λŠ” 자체 격리 λ²”μœ„κ°€ μžˆμŠ΅λ‹ˆλ‹€. 즉, ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ˜ ν…œν”Œλ¦Ώμ—μ„œ μƒμœ„ 데이터λ₯Ό 직접 μ°Έμ‘° ν•  수 μ—†μœΌλ©° κ·Έλ ‡κ²Œ ν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€. 데이터λ₯Ό 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>

μ£Όλͺ©ν•΄μ•Όν•  두가지 사항이 μžˆμŠ΅λ‹ˆλ‹€.

  1. <app> μ»΄ν¬λ„ŒνŠΈλŠ” μ–΄λ–€ 컨텐츠λ₯Ό 받을 지 λͺ¨λ¦…λ‹ˆλ‹€. 그것은 <app>이 μ‚¬μš©ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμ— μ˜ν•΄ κ²°μ •λ©λ‹ˆλ‹€.
  2. <app> μ»΄ν¬λ„ŒνŠΈμ—λŠ” 자체 ν…œν”Œλ¦Ώμ΄ μžˆμ„ κ°€λŠ₯성이 ν½λ‹ˆλ‹€.

μœ„ κ΅¬μ„±μœΌλ‘œ μž‘λ™ν•˜λ„λ‘ ν•˜λ €λ©΄ λΆ€λͺ¨ μ½˜ν…μΈ μ™€ μ»΄ν¬λ„ŒνŠΈμ˜ 자체의 ν…œν”Œλ¦Ώμ„ μ„žλŠ” 방법이 ν•„μš”ν•©λ‹ˆλ‹€. 이것은 μ½˜ν…μΈ  배포 ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€. VueJSλŠ” ν˜„μž¬ μ›Ή μ»΄ν¬λ„ŒνŠΈ 사양 μ΄ˆμ•ˆμ„ λͺ¨λΈλ‘œ ν•œ μ½˜ν…μΈ  배포 APIλ₯Ό κ΅¬ν˜„ν•˜λ©° 원본 μ½˜ν…μΈ μ˜ 배포판 μ—­ν•  ν•˜κΈ° μœ„ν•΄ νŠΉμˆ˜ν•œ <slot> μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

λ²”μœ„ 컴파일

μ»΄νŒŒμΌλ˜λŠ” λ²”μœ„λ₯Ό λͺ…ν™•νžˆ ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 ν…œν”Œλ¦Ώμ΄ μžˆλ‹€κ³  μƒμƒν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

<child-component>{{message}}</child-component>

messageκ°€ λΆ€λͺ¨ 데이터 λ˜λŠ” μžμ‹ 데이터 쀑 λΆ€λͺ¨μ— λ°”μΈλ”©λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. μ»΄ν¬λ„ŒνŠΈ λ²”μœ„μ— λŒ€ν•œ κ°„λ‹¨ν•œ 법칙은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. μƒμœ„ ν…œν”Œλ¦Ώμ˜ λͺ¨λ“  λ‚΄μš©μ€ μƒμœ„ λ²”μœ„λ‘œ μ»΄νŒŒμΌλ©λ‹ˆλ‹€.
  2. ν•˜μœ„ ν…œν”Œλ¦Ώμ˜ λͺ¨λ“  λ‚΄μš©μ€ ν•˜μœ„ λ²”μœ„μ—μ„œ μ»΄νŒŒμΌλ©λ‹ˆλ‹€.

일반적인 μ‹€μˆ˜λŠ” λΆ€λͺ¨ ν…œν”Œλ¦Ώμ˜ ν•˜μœ„ 속성/λ©”μ†Œλ“œμ— λ””λ ‰ν‹°λΈŒλ₯Ό λ°”μΈλ”©ν•˜λ €κ³ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

<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>\
  '
})
⚠️ **GitHub.com Fallback** ⚠️