Vue ์ปดํฌ๋ํธ
์ปดํฌ๋ํธ๋ ํ๋ฉด์ ์์ญ์ ์ผ์ ํ ๋จ์๋ก ์ชผ๊ฐ์ด ์ฌํ์ฉ ๊ฐ๋ฅํ ํํ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
Vue ์์ ์ต์์ ์ปดํฌ๋ํธ๋ root ๊ณ ์ด๋ฅผ ์์์ผ๋ก ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ํ์ฑ๋๋ค.
- ์ ์ญ ์ปดํฌ๋ํธ
์ฌ๋ฌ ์ธ์คํด์ค์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ, ๋ชจ๋ ์์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์ฃผ๋ก ํ๋ฌ๊ทธ์ธ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ ์ฑ ์ ์ญ์์ ์ฌ์ฉํ ๊ณตํต ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค.
vue ์ธ์คํด์ค ์์ฑ ์ ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ฃผ์ด์ผ ํ๋ค.
Vue.component('component-a', { template: '<div> hello world AAA !!!</div>'})
Vue.component('component-b', { template: '<div> hello world BBB !!!</div>'})
Vue.component('component-c', { template: '<div> hello world CCC !!!</div>'})
new Vue({
el: '#app'
})
<div id="app">
<component-a></component-a>
<component-b></component-b>
</div>
// ๋ ๋๋ง ํ ์ด์ ๊ฐ์ด ๊ตฌํ
<div id="app">
<div> hello world AAA !!!</div>
<div> hello world BBB !!!</div>
</div>
* root ์๋ฆฌ๋จผํธ๊ฐ ์๊ณ ๊ทธ ์์ ํ๊ทธ๋ค์ด ๋ค์ด๊ฐ์ผ ํจ
* ์ค ๋ฐ๊ฟ ์์ด ์ฌ์ฉํ๋ ค๋ฉด ' ', ์ค์ ๋ฐ๊ฟ๋ ์ฌ์ฉํ ์ ์์ผ๋ ค๋ฉด `` ์ฌ์ฉ
- ์ง์ญ ์ปดํฌ๋ํธ
vue ์ธ์คํด์ค ๋ด์ ์ง์ ์ฝ์ ํ๋ ๋ฐฉ์์ด๋ค. ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ ์ ์๊ณ ๋ถ๋ชจ-์์ ์ปดํฌ๋ํธ ๊ฐ ํต์ ์ด ๊ฐ๋ฅํ๋ค.
ํน์ ์ธ์คํด์ค ๋ด์์๋ง ์ ํจํ๊ณ ์์ ์ปดํฌ๋ํธ์์ ์๋์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
components ๋ก ์ ์ํ๊ณ , ์์ฑํ ์ปดํฌ๋ํธ๋ฅผ ํ ํ๋ฆฟ ๋ด์ ํ๊ทธ๋ก ์ง์ ํ๋ค.
์ ์ญ ์ปดํฌ๋ํธ์์๋ ์ฌ์ฉ๋์ง ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋น๋์ ํฌํจ๋๊ธฐ ๋๋ฌธ์ ๋ณดํธ์ ์ผ๋ก๋ ์ง์ญ ์ปดํฌ๋ํธ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
var ComponentD = { template: '<div> hello world DDD !!!</div>' }
var ComponentE = { template: '<div> hello world EEE !!!</div>' }
var ComponentF = { template: '<div> hello world FFF !!!</div>' }
new Vue({
el: '#app',
components: {
'component-d': ComponentD,
'component-e': ComponentE
}
})
<div id="app">
<component-d></component-d>
<component-e></component-e>
</div>
์ปดํฌ๋ํธ ํต์ ๋ฐฉ์
๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ์์ฒด์ ์ค์ฝํ๋ฅผ ๊ฐ์ง๊ณ ์์ด ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๊ฐ์ ๋ฐ๋ก ์ฐธ์กฐํ ์๋ ์๋ค.
vue๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ ์ ์ธ ํต์ ์ ๋ถ๊ฐ๋ฅํ ๊ตฌ์กฐ์ด๊ณ ๊ฐ ์ปดํฌ๋ํธ ๊ฐ ๋ฐ์ดํฐ ์ด๋์ ๋จ๋ฐฉํฅ๋ง ๊ฐ๋ฅํ๋ค.
๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋ฉด ํ์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์ง๋ง, ๋ฐ๋๋ก ํ์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์ง๋ ์๋๋ค.
๋ถ๋ชจ์์ ์์์ผ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ฆฌ๊ณ (props) ์์์์ ๋ถ๋ชจ๋ก๋ ์ด๋ฒคํธ๋ฅผ ์ฌ๋ฆฐ๋ค(event emit).
- props
์์ ์ปดํฌ๋ํธ์์ ํ์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉํ๋ค.
v-bind ๋ก ํด๋น ์ปดํฌ๋ํธ์ ์ ์๋ props ์์ฑ์ ์ ๊ทผํ ์ ์๊ณ props ์ ์ญํ ์ ๋ถ๋ชจ์ data ์์ญ์ ์ ๊ทผํ ์ ์๊ฒ ํด์ฃผ๋ ์์ฑ์ด๋ค.
// ์์ ์ปดํฌ๋ํธ
<div id="app">
<child-component v-bind:propsdata="message"></child-component> // ํ์ ์ปดํฌ๋ํธ์ ์์ ์ปดํฌ๋ํธ๊ฐ ๊ฐ๊ณ ์๋ message๋ฅผ ์ ๋ฌ
</div>
// ํ์ ์ปดํฌ๋ํธ
Vue.component("child-component", { // ์์ ์ปดํฌ๋ํธ์ data ์์ฑ์ธ message๋ฅผ propsdata๋ผ๋ ์์ฑ์ผ๋ก ๋๊ฒจ๋ฐ์
props: ["propsdata"],
template: '<p>{{ propsdata }}</p>'
});
// ์์ ์ปดํฌ๋ํธ
var app = new Vue({
el: "#app",
data: {
message: "Hello Vue! from Parent Component"
}
});
* props ๋ณ์๋ช ์ ์นด๋ฉ ๊ธฐ๋ฒ(myComp)์ผ๋ก ์ ์ํ๋ค๋ฉด html ํ๊ทธ์์ ์ฌ์ฉํ ๋๋ ์ผ๋ฐฅ ๊ธฐ๋ฒ(my-comp)์ผ๋ก ์ ์ธํด์ผ ํ๋ค.
- emit
ํ์ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉํ๋ค.
ํ์ ์ปดํฌ๋ํธ์์ input ์ด๋ฒคํธ์ $emit ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ๋๊ธด๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ถ๋ชจ์์ ์์์ ํธ์ถํ ๋ ์ ์ ์ด๋ฆ, ๋ ๋ฒ์งธ ์ธ์๋ ๋๊ธธ ๊ฐ์ด๋ค.
<input v-model="value" @change="updateData" />
<script>
...
props: [
'value',
],
methods : {
updateData(e) {
this.$emit('updatedData', e.target.value)
}
}
</script>
๋ถ๋ชจ ์ปดํฌ๋ํธ์์๋ ์์์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋๊ธด ๋ฉ์๋ ์ด๋ฆ์ ๋ฐ์ธ๋ฉ ์์ผ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ data ๋ฅผ ๋ฐ๊ฟ์ค๋ค.
<my-component value="1" @updatedData="onChanged" />
<script>
...
methods: {
onChanged(myData) {
this.parentData = myData
}
}
</script>
์ด๋ ๊ฒ props ์ emit ํ๋ ๊ณผ์ ์ ํฉ์ณ์ ๊ฐ๋จํ๊ฒ ๋ง๋ค์ด๋์ ๊ฒ์ด v-model ์ด๋ค.
์ emit ํ๋ ์์ ๋ฅผ v-model ์ ์ฌ์ฉํ๋๋ก ๋ฐ๊พธ๋ฉด ์๋์ ๊ฐ๋ค.
<input v-model="value" @change="updateData" />
<script>
...
props: [
'value',
],
methods : {
updateData(e) {
this.$emit('updatedData', e.target.value)
}
}
</script>
๋ถ๋ชจ์์ ์์ ์ปดํฌ๋ํธ ํ๊ทธ์ v-model ์ ์ฌ์ฉํ๋ฉด ํด๋น data ๊ฐ ์์์ props ๋ก ๋์ด๊ฐ๊ณ , ์์์์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ฉด ๋๊ธด ๋ฐ์ดํฐ๊ฐ ๋ณ์์ ํ ๋น๋๋ค.
<my-component v-model="parentData" />
๋ณ๋ ์ง์ ์ด ์์ ๊ฒฝ์ฐ ์์์ props๋ value๋ก ์ง์ ๋๊ณ , ์์์์ ๋ณด๋ด๋ ์ด๋ฒคํธ๋ input ์ด๋ฒคํธ๊ฐ ์ง์ ๋๋ค. props ๋ช ์ด๋ ์ด๋ฒคํธ๋ช ์ ์ปค์คํ ํ ์๋ ์๋ค. ์ด ๋, ์์์์ ๋ฐ๋ props๋ ๋ช ์์ ์ผ๋ก ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
์ฐธ๊ณ ์๋ฃ ๋ฐ ์ถ์ฒ ๐โ๏ธ
https://whitepro.tistory.com/255
https://icerabbit.tistory.com/120
'๊ฐ๋ฐ > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Vue3 Composition API (0) | 2022.04.06 |
---|---|
Vuex / ์ํ๊ด๋ฆฌ / Vuex ํจํด ๋ฐ ์์ (0) | 2022.04.05 |
Vue ๋ผ์ฐํฐ / SPA / Router ๊ฐ ์ ๋ฌ (0) | 2022.04.04 |
Vue ์ฌ์ฉ๋ฒ / ๋ฌธ๋ฒ / ์ต์ / ๋๋ ํฐ๋ธ (0) | 2022.03.28 |
Vue.js ๊ธฐ๋ณธ ๊ฐ๋ / ์ฌ์ฉํ๋ ์ด์ / ๊ฐ์ ๋ (0) | 2022.03.17 |
๋๊ธ