2022. 3. 19. 18:01ใFront-End ์์ ์ค/Vue.js
๐ ํ ํ๋ฆฟ 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`๊ฐ ์ถ๋ ฅ ๋ ๊ฒ์ด์์.
'Front-End ์์ ์ค > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] Vue-Cookies (0) | 2022.04.02 |
---|---|
[Vue.js] tiptap Editor ์ฐ๋ (0) | 2022.03.23 |
[Vue.js] Props (0) | 2022.03.19 |
[Vue.js] axios ์ค์น (0) | 2022.03.18 |
[Vue.js] vue-router.esm-bundler.js?ec2d:72 [Vue Router warn]: No match found for location with path "/support/devInquryList" (0) | 2022.03.15 |