์ปดํฌ๋ํธ๋ก ๊ตฌํํ๋ ์น ํ์ด์ง์ ๊ตฌ์ฑ๊ณผ ๊ณ์ธต๊ตฌ์กฐ
pinia ๋ฅผ ํตํด ์ฌ๋ฌ ์ ๋ณด๋ฅผ ๊ณต์ ํ๋ค.
ref ๊ฐ์ ๋ณ๊ฒฝํ ๋๋ ๋ณ์๋ช .value ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋๋ค. reactive๋ ๊ฐ์ฒด์ ์์ฑ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
๋ถ๋ชจ์์๋ ํธ๋ค๋ฌ๋ฅผ ํตํด ๋ฏธ๋ฆฌ ๊ตฌํํด๋จ๋ค๊ฐ emit์ด๋ผ๋ ํจ์์ ์ํด์ ์ค์ ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋คํ ๋ ์์์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋๋๋ก ํ ์ ์๋ค.
Vue 3์ ์ปดํฌ๋ํธ ๊ฐ์ ํต์ ๋ฐฉ๋ฒ : (1) props ๋ถ๋ชจ์์ ์์์ผ๋ก (2) emit ์์์ด ๋ถ๋ชจ์๊ฒ (3) v-model (4) slots (5) provide/inject (6) pinia
toRefs : ๋ฐ์์ฑ์ ๊ทธ๋๋ก ๊ฐ์ ธ๊ฐ๊ณ ์ถ์ ๋.. ๋ฐ์์ฑ ๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ฒ๋ฆฌํ๊ฒ ๋ค ๋ผ๋ ๋ป..
์์ ์ปดํฌ๋ํธ.
<template>
<button type="button" @click="childFunc" ref="btn">์์๋ฒํผ</button>
</template>
<script setup>
const childFunc = function () {
window.alert('์์ ์ปดํฌ๋ํธ์ ๋ฒํผํ๊ทธ์์ ๋ฐ์๋ ํด๋ฆญ์ด๋ฒคํธ!!');
}
</script>
๋ถ๋ชจ ์ปดํผ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ์ง์ ์ก์ธ์คํ๊ฒ ๋คํ ๋ $refs๋ฅผ ์ด๋ค. $๊ฐ ๋ถ์ด์์ผ๋ฉด ์๋์ผ๋ก ์์ฑ๋๋ ๊ฐ์ฒด.
$refs.child1์ด๋ผ๊ณ ์ ๊ทผํ๋ค. ์๋๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ.
<template>
<button @mouseover="sendMessage">๋ถ๋ชจ๋ฒํผ</button>
<child-component ref="child1" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: { ChildComponent },
methods: {
sendMessage: function () {
alert("child1์ด๋ผ๋ ์์ ์ปดํฌ๋ํธ์ ๋ฒํผ์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ฒ ์ต๋๋ค.");
this.$refs.child1.$refs.btn.click(); // ์์ DOM ๊ฐ์ฒด์ ์ด๋ฒคํธ ๋ฐ์
}
}
};
this.$refs.child1.$refs.btn.click(); ์ด ์ฝ๋๋ child-component์์ ref๊ฐ child1์ด๋ฏ๋ก this.$refs.child1์ด๋ฐ์์ผ๋ก ์ ๊ทผํ ํ์ child1์ด๋ผ๋ ์์๊ฐ์ฒด์ ref์ btn์ด ํด๋ฆญ๋๋๋กํ๋ ์ฝ๋๋ค. ํด๋น ํ๊ทธ์๋ ๋ฐ๋์ ref๊ฐ ์์ด์ผ ์ฐพ์๊ฐ ์ ์๋ค.
<template>
<child-component2 ref="child2">
์ด๊ฑด slot ๊ธฐ๋ฅ ํ
์คํธ์ฉ ์ปจํ
ํธ~~
</child-component2>
</template>
์ด๋ฐ์์ผ๋ก ์์ ๊ฐ์ฒด๋ก ๋๊ฒจ์ค์ ์๋ค. ์ ์ฝ๋๋ ๋ถ๋ชจ ์ปจํฌ๋ํธ์์ ์ฐ์ธ๊ฑฐ
<template>
<h3>์์์ปดํฌ๋ํธ</h3>
<slot></slot>
</template>
์์ ์ปดํฌ๋ํธ์์ ์ด๋ฐ์์ผ๋ก ๋ฃ๊ณ ์ถ์ ์๋ฆฌ์ slot์ ์์ฑํ ์๋ ์๋ค. ์ฌ๋กฏ์ ํ ํ๋ฆฟ ์กฐ๊ฐ์ ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๊ณ ์์ ์ปดํฌ๋ํธ๊ฐ ์์ฒด ํ ํ๋ฆฟ ๋ด์์ ์ ๋ฌ๋ ํ ํ๋ฆฟ ์กฐ๊ฐ์ ๋ ๋๋งํ๋๋ก ํ๋ ๊ธฐ๋ฅ.
๋ถ๋ชจ ์ปดํฌ๋ํธ์์
mounted() {
this.$refs.child2.callFromParent();
}
์ด๋ฐ์์ผ๋ก ์์ ์ปดํฌ๋ํธ์ ์ ์๋ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค.
<script>
export default {
data() {
return {
msg: 'Option API๋ฅผ ์ฌ์ฉํ ์์ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋ณด๋ด๋ ๋ฉ์์ง'
};
},
mounted() {
this.$emit('send-message', this.msg)
}
}
</script>
์ด๋ฐ์์ผ๋ก Option API ๋ฐฉ์์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ์์ ์ปดํฌ๋ํธ์์ ์์ฑํ๊ณ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ๋ณด๋ผ ์ ์๋ค. ๋ฐ์ํ ์ด๋ฒคํธ ์ด๋ฆ, ์ ๋ฌํ ๋ฉ์ธ์ง๋ฅผ ์๊ท๋จผํธ๋ก ์ฃผ๋ฉด ๋๋ค.
<child-component-option @send-message="sendMessage" />
๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ํ ํ๋ฆฟ์ ์ด๋ฐ์์ผ๋ก ์์ฑํ ํ์(send-message๋ผ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด sendMessage๋ผ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ก ํ๋ค๋ผ๋ ๋ป. ์ฌ๊ธฐ์ child-component-option์ ์์ ์ปดํฌ๋ํธ ์ด๋ฆ..)
methods: {
sendMessage(data) {
console.log("@@ : " + data);
}
}
์คํฌ๋ฆฝํธ ๋ถ๋ถ์์ ์ด๋ฐ์์ผ๋ก ์์ฑํ๋ฉด ์ ๋ฌ๋ ๋ฉ์ธ์ง๊ฐ ์ฝ์์ฐฝ์์ ๋ณด์ด๊ฒ ๋๋ค.
Composition API๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์์ ์ปดํฌ๋ํธ์ ์คํฌ๋ฆฝํธ ๋ถ๋ถ์์
import { onMounted } from 'vue'
export default {
emits: ['send-message'],
setup(props, context) {
const msg = 'Composition API๋ฅผ ์ฌ์ฉํ ์์ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋ณด๋ด๋ ๋ฉ์์ง';
const { emit } = context;
onMounted(() => {
emit('send-message', msg)
})
}
}
๋ฐ๋์ emits ๋ผ๋ ์์ฑ์ ๋ฃ์ด์ฃผ๊ณ , emit์ด๋ผ๋ ํจ์๋ก ๋ฐ์์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค. $emit์ ํ๋ก์์ ๋ด๊ธด ๊ฑธ ๋ค์ด๋ ํธ๋ก ์ฐ๋ ๋ฐฉ๋ฒ์ด์๋ค.
script๋ค์ setup์์ฑ์ ์ค์ ๊ตฌํํ๋ค๋ฉด
<script setup>
import { onMounted, defineEmits } from 'vue';
const emit = defineEmits(["send-message"]);
const msg = 'Composition Setup API๋ฅผ ์ฌ์ฉํ ์์ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋ณด๋ด๋ ๋ฉ์์ง';
onMounted(() => {
emit('send-message', msg)
})
</script>
defineEmitsํ๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ํจ์๋ฅผ ๋ฆฌํดํด์ค๋ค. ์ฌ๊ธฐ์๋ emit์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ฐ์๋ค.
provide์ inject
'๐ผ Full-Stack Study โก (feat. KOSA)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Docker (1) | 2023.11.29 |
---|---|
Vue.js (Pinia, Spring Security JWT) (0) | 2023.11.13 |
Vue.js (3) (0) | 2023.11.09 |
Vue.js (watch) (0) | 2023.11.08 |
Vue.js (0) | 2023.11.06 |