Seize your moment! πŸ‘Ύ

μ•ˆλ…•ν•˜μ„Έμš”. Ericμž…λ‹ˆλ‹€. 제 λΈ”λ‘œκ·Έμ— λ°©λ¬Έν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

πŸ’» κ°œλ°œκ³΅λΆ€/Vue

[Eric's Vue] ref, $refs μ΄μš©ν•΄μ„œ DOM μš”μ†Œ 및 μžμ‹ μ»΄ν¬λ„ŒνŠΈ μ ‘κ·Ό 방법 πŸ”—

Eric_ko 2023. 4. 20. 17:18

Vue.jsμ—μ„œλŠ” 일반적으둜 데이터λ₯Ό λ°”μΈλ”©ν•˜μ—¬ DOM μš”μ†Œλ₯Ό μ œμ–΄ν•©λ‹ˆλ‹€.
ν•˜μ§€λ§Œ κ²½μš°μ— λ”°λΌμ„œ, DOM μš”μ†Œλ‚˜ μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— 직접 μ ‘κ·Όν•΄μ•Ό ν•˜λŠ” 상황이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ΄λ•Œ Vue.jsμ—μ„œ μ œκ³΅ν•˜λŠ” ref $refsλ₯Ό μ‚¬μš©ν•˜λ©΄ μ›ν•˜λŠ” μš”μ†Œμ— μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. 
 

βœ… ref ?

refλŠ” Vue ν…œν”Œλ¦Ώ μ•ˆμ—μ„œ νŠΉμ • DOM μš”μ†Œλ‚˜ μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ μ†μ„±μž…λ‹ˆλ‹€. ref 속성을 μ‚¬μš©ν•˜λ €λ©΄ ν…œν”Œλ¦Ώμ˜ ν•΄λ‹Ή μš”μ†Œλ‚˜ μ»΄ν¬λ„ŒνŠΈμ— refλ₯Ό μΆ”κ°€ν•˜κ³ , κ³ μœ ν•œ 이름을 ν• λ‹Ήν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ ν•΄λ‹Ή μš”μ†Œλ‚˜ μ»΄ν¬λ„ŒνŠΈμ— λŒ€ν•œ μ°Έμ‘°κ°€ μƒμ„±λ˜λ©°, Vue μΈμŠ€ν„΄μŠ€ λ‚΄μ—μ„œ ν•΄λ‹Ή μ°Έμ‘°λ₯Ό μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€.

βœ… $refs ?

$refsλŠ” Vue μ»΄ν¬λ„ŒνŠΈμ—μ„œ νŠΉμ • DOM μš”μ†Œλ‚˜ μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό μ €μž₯ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. $refsλ₯Ό μ‚¬μš©ν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ§μ ‘μ μœΌλ‘œ DOM μš”μ†Œλ₯Ό μ‘°μž‘ν•˜κ±°λ‚˜, μžμ‹ μ»΄ν¬λ„ŒνŠΈμ˜ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
 
 

πŸ“„ ref $refs μ‚¬μš© 방법

 
1. DOM μš”μ†Œλ‚˜ μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— ref 속성을 μΆ”κ°€ν•©λ‹ˆλ‹€. 속성값은 κ³ μœ ν•œ λ¬Έμžμ—΄λ‘œ 지정해야 ν•©λ‹ˆλ‹€.

<input ref="inputElement" type="text" />
<child-component ref="childComponent"></child-component>

 
2. ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ this.$refs 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή μš”μ†Œμ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
 

mounted() {
  // DOM μš”μ†Œμ— μ ‘κ·Ό
  this.$refs.inputElement.focus();

  // μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— μ ‘κ·Ό
  this.$refs.childComponent.someMethod();
}

 
 

πŸ₯² $refs의 단점

 
1. λ°˜μ‘μ„±μ΄ μ—†μŒ
  $refsλŠ” Vue.js의 λ°˜μ‘μ„± μ‹œμŠ€ν…œμ—μ„œ μ œμ™Έλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 즉, $refsλ₯Ό μ‚¬μš©ν•˜μ—¬ μ°Έμ‘°λ₯Ό 변경해도 Vue.jsλŠ” 이λ₯Ό κ°μ§€ν•˜μ§€ λͺ»ν•˜λ©°, λ”°λΌμ„œ ν•΄λ‹Ή 참쑰와 κ΄€λ ¨λœ κ³„μ‚°μ΄λ‚˜ λ Œλ”λ§ μ—…λ°μ΄νŠΈκ°€ 이루어지지 μ•ŠμŠ΅λ‹ˆλ‹€.
μ΄λŸ¬ν•œ 이유둜 $refsλ₯Ό 주둜 DOM μš”μ†Œμ— 직접 μ ‘κ·Όν•˜κ±°λ‚˜, μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— μΌνšŒμ„±μœΌλ‘œ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” 것이 μ ν•©ν•©λ‹ˆλ‹€.
 
2. μ΄ˆκΈ°ν™” μ‹œμ μ— μ°Έμ‘°κ°€ 없을 수 있음
  $refs μ°Έμ‘°λŠ” μ»΄ν¬λ„ŒνŠΈκ°€ 마운트되고 DOM이 λ Œλ”λ§λœ μ΄ν›„μ—λ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ»΄ν¬λ„ŒνŠΈμ˜ 생성 κ³Όμ • μ€‘μ—λŠ” $refsλ₯Ό μ‚¬μš©ν•˜μ—¬ μ°Έμ‘°ν•˜λ €λŠ” μš”μ†Œμ— μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄, 일반적으둜 mounted 라이프사이클 ν›…μ—μ„œ $refsλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
 
3. κ³Όλ„ν•œ μ‚¬μš©μœΌλ‘œ μΈν•œ μ½”λ“œ 가독성 μ €ν•˜
  $refsλ₯Ό κ³Όλ„ν•˜κ²Œ μ‚¬μš©ν•˜λ©΄ Vue.js의 데이터 흐름과 κ΄€λ ¨λœ μ½”λ“œ 가독성이 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€. Vue.jsλŠ” 데이터 흐름을 λͺ…ν™•ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ 데이터 바인딩을 μ‚¬μš©ν•˜λŠ”λ°, $refsλ₯Ό μ‚¬μš©ν•˜λ©΄ μ΄λŸ¬ν•œ 데이터 흐름이 뢈λͺ…ν™•ν•΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ $refs μ‚¬μš©μ€ μ΅œμ†Œν™”ν•˜κ³ , ν•„μš”ν•œ κ²½μš°μ—λ§Œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.
 
 

βœ… κ²°λ‘ 

  Vue.js의 $refsλ₯Ό μ‚¬μš©ν•˜λ©΄ DOM μš”μ†Œλ‚˜ μžμ‹ μ»΄ν¬λ„ŒνŠΈμ— μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆμ§€λ§Œ, λ°˜μ‘μ„±μ΄ μ—†κ³  μ΄ˆκΈ°ν™” μ‹œμ μ— μ°Έμ‘°κ°€ 없을 수 있으며 μ½”λ“œ 가독성이 μ €ν•˜λ  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 단점을 κ³ λ €ν•˜μ—¬ $refsλ₯Ό μ μ ˆν•˜κ²Œ μ‚¬μš©ν•˜λ©΄, Vue.jsμ—μ„œ DOM μ‘°μž‘ 및 μžμ‹ μ»΄ν¬λ„ŒνŠΈμ™€μ˜ μƒν˜Έμž‘μš©μ„ 보닀 효율적으둜 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.