[Vue.js] Template refs

2022. 3. 19. 18:01ใ†Front-End ์ž‘์—…์‹ค/Vue.js

728x90
๋ฐ˜์‘ํ˜•

 

 

๐Ÿš€ ํ…œํ”Œ๋ฆฟ refs๋ž€?

Props์™€ Event๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ, ์ž์‹ ์š”์†Œ์— JavaScript๋ฅผ ์ด์šฉํ•ด ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ๋•Œ `ref` ์†์„ฑ์„ ์ด์šฉํ•ด ์ฐธ์กฐ(Reference) ID๋ฅผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋‚˜, HTML ์š”์†Œ์— ๋ถ€์—ฌํ•จ์œผ๋กœ ์ง์ ‘ ์ ‘๊ทผํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

 

<input ref="input" />

 

์œ„์™€ ๊ฐ™์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ Mount ๋˜์—ˆ์„ ๋•Œ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ ์œผ๋กœ input์— focus๋ฅผ ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

const app = Vue.createApp({})

app.component('base-input', {
  template: `
    <input ref="input" />
  `,
  methods: {
    focusInput() {
      this.$refs.input.focus()
    }
  },
  mounted() {
    this.focusInput()
  }
})

 

ํ˜น์€ ๋‹ค๋ฅธ `ref`๋ฅผ ์ปดํฌ๋„ŒํŠธ ์ž์ฒด์— ์„ ์–ธํ•˜๊ณ , ๋ถ€๋ชจ ์š”์†Œ๋กœ๋ถ€ํ„ฐ `focusInput` Event๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

<base-input ref="usernameInput"></base-input>

 

this.$refs.usernameInput.focusInput()

 

 

๐Ÿ’ก ์ฐธ๊ณ  ์‚ฌํ•ญ :
`$refs`๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ Rendering๋œ ๋’ค ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.
ํ•ด๋‹น ์†์„ฑ์€ ์ž์‹ ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค.
์ฆ‰, ํ…œํ”Œ๋ฆฟ์ด๋‚˜, computed ์†์„ฑ์—์„œ `$refs`์— ์ ‘๊ทผํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

 

๋ถ€์—ฐ ์„ค๋ช…์„ ํ•ด๋ณด์ž๋ฉด `ref`๋กœ Tag ์ด๋ฆ„์„ ์ง€์–ด์ค€ ๋’ค ์ปค์„œ ์œ„์น˜๋ฅผ focus๋กœ input์— ์˜ฎ๊ฒจ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. `ref='์ด๋ฆ„'`์œผ๋กœ ํŠน์ • ํƒœ๊ทธ์— ์ด๋ฆ„์„ ์ง€์–ด์ฃผ๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด `$refs.์ด๋ฆ„`์œผ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด ์ง€๋Š” ๊ฒƒ์ด์—์š”.

 

Vue๋ฅผ ์ด์šฉํ•˜๋ฉด ์ง์ ‘ DOM Element์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ๊ฐ€ ๊ฑฐ์˜ ์—†๋Š” ๊ฒƒ์ด์—์š”. ํ•˜์ง€๋งŒ, ๊ฐ€๋” DOM์„ ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ์กฐ์ž‘ ํ•ด์ค˜์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ๋•Œ๊ฐ€ ํŠน์ • ์˜์˜๊ฒŒ focus๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด ๋งŽ์ด ์ด์šฉ๋˜๊ณ , ์ด ๋•Œ, ์ด์šฉ๋˜๋Š” ์†์„ฑ์ด `$ref`์ธ ๊ฒƒ์ด์—์š”.

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” querySelector๊ฐ€ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ต๋‹ˆ๋‹ค!

 

<template>
  <div>
    <input type="text" ref="target">
  </div>
</template>

<script>
export default {
  mounted(){
    console.log('target', this.$refs.target);
  }
}
</script>

 

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, ์ ‘๊ทผํ•˜๊ณ  ์‹ถ์€ ํƒœ๊ทธ์— `ref` ์†์„ฑ์„ ํ• ๋‹น ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ์ฐธ๊ณ ํ•  ๋งŒํ•œ ๊ฒƒ์€ `ref`๋Š” id์ฒ˜๋Ÿผ ์ค‘๋ณต ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด์—์š”.

์œ„์—์„œ console.log๋กœ ํ•ด๋‹น ๋‚ด์šฉ์„ ์ฐ๊ฒŒ ๋˜๋ฉด `$refs`๋กœ ํ•ด๋‹น ํƒœ๊ทธ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—์š”.
๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด Console์—๋Š” `<input type="text">` ๊ฐ€ ์ถœ๋ ฅ๋  ๊ฒƒ์ด์—์š”.

 

๋˜ํ•œ, `$refs`๋Š” component๊ฐ€ Rendering ๋œ ๋’ค์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด์—์š”.
๋งŒ์•ฝ, beforeCreate(), created()์—์„œ `$refs`๋กœ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด `undefined`๊ฐ€ ์ถœ๋ ฅ ๋  ๊ฒƒ์ด์—์š”.

 

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•