@yyx990803 ,
์๋
ํ์ธ์, vuejs ํต์ฌํ์
๋๋ค.
vuejs2.0์ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ ์์ ๊ตฌ์ฑ ์์ ๊ฐ์ ์ง์ ๊ฐ ํต์ ์ ์ํ ์ข์ ์๋ฃจ์
์ ์ฐพ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช๊ณ ์์ต๋๋ค.
vuejs2.0์ $broadcast,$dispatch API๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ vuejs2.0 ์ด๋ฒคํธ ๋ฒ์ค ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ $broadcast,$dispatch ๋์ฒด ์๋ฃจ์
์ ์ฐพ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค.
๋๋์ด ์ฃผ์ ์ ๋ํ ํฌ๋ผ์ ์ค๋ ๋๋ฅผ ์์ฑํ์ต๋๋ค ์ฌ๊ธฐ์ , ๋๋ ๋ ๋
ผ์ ์ฌ๊ธฐ๋ฅผ ๋ถ์ฌ ์ถ์ต๋๋ค.
vuejs2.0์ ๋ํ ์ข์ ์์ด๋์ด๋ ์๋ฃจ์ ์ด ์์ผ๋ฉด ๋ซ์ง ๋ง์ญ์์ค.
<pcom id=1>
<soncoma></soncoma>
<soncomb></soncomb>
</pcom>
<pcom id=2>
<soncoma></soncoma>
<soncomb></soncomb>
</pcom>
์์ ์ฝ๋์์ pcom1์ ์์์ด ์๋ฅผ ๋ค์ด, soncoma $emit ์ด๋ฒคํธ๊ฐ ์์ ๋,
bus.$emit('son-coma-event',somedata)
pcom์์ ์ฐ๋ฆฌ๋ ๊ทธ ์ด๋ฒคํธ๋ฅผ ๋ฃ์ต๋๋ค.
bus.$on('son-coma-event',function(){})
๋๋ pcom1์ด ๊ทธ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ์ํ์ง๋ง ๋ถํํ๋ pcom2๋ ์ฒ๋ฆฌํ ๊ฒ์
๋๋ค.
์ด ์ํ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ?
๋ด ์์ฉ ํ๋ก๊ทธ๋จ์ ํด๊ฒฐ ๋ฐฉ๋ฒ ์ค ํ๋๋ this.$parent๋ฅผ ์ด๋ฒคํธ ๋ฒ์ค๋ก ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
์ด๋ฆฐ์ด:
this.$parent.$emit('some-event',someData)
๋ถ๋ชจ์์:
{
created(){
this.$on('some-event',function(){})
}
์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํ ๋ถ์ ์ ์ธ ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ข ๋ ๋ณต์กํ ์กฐ๊ฑด์์๋ ์ฌ๊ท ๊ตฌ์ฑ ์์์ ๊ฐ์ ์ฌ์ฉ์ ์ง์ ์ด๋ฒคํธ ์์คํ ์ ๋ํ ์ข์ ์๋ฃจ์ ์ ์ฐพ๊ธฐ๊ฐ ๋ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค.
<pcom>
<recursivechild>
<recursivechild>
<recursivechild>
</recursivechild>
</recursivechild>
<recursivechild>
</pcom>
<pcom>
<recursivechild>
<recursivechild>
<recursivechild>
</recursivechild>
</recursivechild>
<recursivechild>
</pcom>
recursivechild๊ฐ ์ง์ pcom ๊ตฌ์ฑ ์์์ ํต์ ํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น?
์ด ์ฃผ์ ์ ๋ํ ๊ทํ์ ์๊ฐ์ด๋ ์์ ์ ์๋ ค์ฃผ์ญ์์ค.
๊ฐ์ฌํฉ๋๋ค~!
์ผ๋ฐ์ ์ธ ์ ์ ํ ๋ก ์ด๊ธฐ ๋๋ฌธ์ ์์ง ๋ฐ์ด์ฌ๋ฆฐ์ ๋ง๋ค์ง ์์์ต๋๋ค. ํ์ํ ๊ฒฝ์ฐ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ง๋ค๊ณ ์ถ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค~!
์ด๊ฒ์ ์ด๋ฏธ 2.0 ๋ณ๊ฒฝ ์ฌํญ ์์ ์ ๋นํ๋์์ต๋๋ค.
์ฌ๋ณธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$dispatch
๋ฐ$broadcast
์ฌ์ฉ ์ค๋จ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
$dispatch
๋ฐ$broadcast
๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๊ตฌ์ฑ ์์ ํธ๋ฆฌ ๊ตฌ์กฐ์ ์์กดํ๋ ์ด๋ฒคํธ ํ๋ฆ์ด ๊ตฌ์ฑ ์์ ํธ๋ฆฌ๊ฐ ์ปค์ง ๋ ์ถ๋ก ํ๊ธฐ ์ด๋ ค์ธ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํฐ ์ฑ์์ ์ ํ์ฅ๋๋ฉฐ ๋์ค์ ๊ณ ํต์ ๊ฒช์ ์ ์๋๋ก ์ค์ ํ๊ณ ์ถ์ง ์์ต๋๋ค.)$dispatch
๋ฐ$broadcast
๋ ํ์ ๊ตฌ์ฑ ์์ ๊ฐ์ ํต์ ์ ํด๊ฒฐํ์ง ์์ต๋๋ค. ๋์ Node.js ์var bus = new Vue()
// in component A's method bus.$emit('id-selected', 1)
// in component B's created hook bus.$on('id-selected', function (id) { // ... })
์ด ํจํด์ ๊ฐ๋จํ ์๋๋ฆฌ์ค์์
$dispatch
๋ฐ$broadcast
๋ฅผ ๋์ฒดํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ ๋ณต์กํ ๊ฒฝ์ฐ์๋ Vuex๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฉ ์ํ ๊ด๋ฆฌ ๊ณ์ธต์ ๋์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ๊ทธ๋ ์ด๋ ๊ฐ์ด๋์ ํ์๋ ์๋ ๊ทํ๊ฐ ๋งํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
์ฌ๊ท ํต์ ์ ๋ณด: ์ฌ๋ฌ ๊ตฌ์ฑ ์์๊ฐ ๋์ผํ ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ์ด ์ด๋ฒคํธ๋ ๋ชจ๋ ์ด๋ฆฐ์ด๊ฐ ์ ์ ์๋๋ก ๊ณตํต ๋ถ๋ชจ๊ฐ ์ธ์ํฉ๋๋ค.
@posva , ์ ๋ณด ๊ฐ์ฌํฉ๋๋ค. ๋ฒ์ค ํ๋ธ๋ ๋จ์ํ ๋จ์ผ ๊ตฌ์ฑ ์์ ์ง์ ๋ ๋จ์ผ ๊ตฌ์ฑ ์์ ์ง์ ํต์ ์์ ์ ์๋ํฉ๋๋ค. ๋์ผํ ๊ตฌ์ฑ ์์ ์ ํ์ ๊ฐ์ง ๊ตฌ์ฑ ์์๊ฐ ์ฌ๋ฌ ๊ฐ ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง ๋ถํํ๋ ์ด๊ฒ์ ์ ์์ ์ธ ๊ฒฝ์ฐ์
๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒ์ ํน์ ๊ตฌ์ฑ ์์์ ์ํ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ฒ์
๋๋ค. ํ์ฌ ์ด๋ฒคํธ ๋ฒ์ค ๊ตฌํ์ ๋ชฉ์ ์ง ๋๋ ๋ฐ์ ๋
ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค(๋ชจ๋ ๊ตฌ์ฑ ์์์ _uid๋ฅผ ๋ณด์๊ณ ์ด๋ฒคํธ ๋ฐฐ์ ์ ์ด ๊ณ ์ ํ _uid๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น? ). ๋ฐ๋ผ์ vuejs2.0์ ์ค์ ๋ก ์ง์ ๊ฐ ์ด๋ฒคํธ ํต์ ์ ์ง์ํ ์ ์์ต๋๋ค. . ์ ํํ ๋งํ๋ฉด vuejs2.0 ์ด๋ฒคํธ ๋ฒ์ค๋ ์ปดํฌ๋ํธ ํ์
์์ ์ปดํฌ๋ํธ ํ์
์ผ๋ก๋ง ํต์ ์ ์ง์ํ๋์? ํด๋น ์๊ตฌ ์ฌํญ์ ํด๊ฒฐํ ์ ์๋ ๊ฐ๋จํ ์๋ฃจ์
์ด ์์ต๋๊น? ํธ๋ฆฌ์ ์ด๋ฒคํธ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋๊ณ ITS OWN DATA ์
๋ฐ์ดํธ
vuex๋ ์์ฉ ํ๋ก๊ทธ๋จ ์์ค์ ์ ์ญ ์ ์ ์ํ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ์ ํฉํ์ง๋ง ๋ด๊ฐ ์ดํดํ๋ ๊ฒ์ฒ๋ผ ํน์ ๋ก์ปฌ ๊ตฌ์ฑ ์์ ๋ฐ์ดํฐ ๊ด๋ฆฌ์๋ ์ข์ง ์์ ์ ์์ต๋๊น?
์ด ๋ฌธ์ ์ ๋ํ ๋ ๋ง์ ์๊ฐ์ ํ์ํฉ๋๋ค.
@cnweibo ํฌ๋ผ์ ์๋ฅผ ๋ค์ด ๊ทํ์ ์ง๋ฌธ์ ๋ต๋ณํ์ต๋๋ค. ์ด ์๊ฐ ๊ทํ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑ์ํฌ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
http://forum.vuejs.org/topic/4832/vue2-0-event-bus-issue-how-to-deliver-event-to-parent-when-the-same-multiple-parent-children-in- ๋/6
ํด๋น ์๊ตฌ ์ฌํญ์ ํด๊ฒฐํ ์ ์๋ ๊ฐ๋จํ ์๋ฃจ์ ์ด ์์ต๋๊น?
ํธ๋ฆฌ์ ์ด๋ฒคํธ ๋ฐ ์์ฒด ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ
์ด๊ฒ์ ๋ณต์กํ ์ด๋ฒคํธ ์์คํ ์์ด ๋จ์ํ vuex๋ก ํด๊ฒฐ๋ฉ๋๋ค.
vuex๋ ์์ฉ ํ๋ก๊ทธ๋จ ์์ค์ ์ ์ญ ์ ์ ์ํ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ์ ํฉํฉ๋๋ค.
ํ์ง๋ง ๋ด๊ฐ ์ดํดํ๋ ๊ฒ์ฒ๋ผ ํน์ ๋ก์ปฌ ๊ตฌ์ฑ ์์ ๋ฐ์ดํฐ์๋ ์ข์ง ์์ ์ ์์ต๋๋ค.
๊ด๋ฆฌ
'๋ก์ปฌ'์ ๋จ์ผ ๊ตฌ์ฑ ์์๋ง์ ์๋ฏธํฉ๋๋ค. ์ฌ์ฉ ์ฌ๋ก๋ ์ ์ฒด ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ์์ต๋๋ค.
์ฌ๋ฌ ๊ตฌ์ฑ ์์๊ฐ ์์ผ๋ฏ๋ก ์ ์ญ์ ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ vuex๋ ๋ชจ๋(์ํ ํ์ ํธ๋ฆฌ)์ ๊ฐ์ง ์ ์์ผ๋ฏ๋ก '์ ์ญ ๋ณ์'๊ฐ ์๋๋๋ค.
์ผ์ข
์ '๊ธ๋ก๋ฒ'์ด๋ค. ์์ฒด vuex๋ก ๊ตฌ์ฑ ์์ ๊ทธ๋ฃน์ ๊ตฌ๋ํ ์ ์์ต๋๋ค.
๋ชจ๋.
์ด ์ ์ฒด '์ด๋ฒคํธ ๋ ๊ณต์ ์ํ' ํ ๋ก ์ ๋ช ๋ฌ ๋์ ํด๊ฒฐ๋์์ต๋๋ค.
์ ์ด๋ฉฐ ๊ฒฐ๋ก ์ ๊ธ๋ก๋ฒ ์ด๋ฒคํธ ๋ฒ์ค ๋๋ vuex๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋์ ๋๋
vuex์ ์๋ ๋ฐฉ์์ ๋ํด ์์ธํ ์ฝ์ด๋ณผ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
2016๋ 9์ 1์ผ ๋ชฉ์์ผ 16:17 cnweibo [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@posva https://github.com/posva , ์ ๋ณด ๊ฐ์ฌํฉ๋๋ค. ๋ฒ์ค
ํ๋ธ๋ ๋จ์ผ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋จ์ํ ๋จ์ผ ๊ตฌ์ฑ ์์์์ ์ ๋ง ์ ์๋ํฉ๋๋ค.
ํฌ์ธํธ ์ปค๋ฎค๋์ผ์ด์ . ๋์ผํ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ง ์ฌ๋ฌ ๊ตฌ์ฑ ์์๊ฐ ์๋ ๊ฒฝ์ฐ
์ ํ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ถํํ๋ ์ด๊ฒ์ ์ ์์ ์ธ ๊ฒฝ์ฐ์ ๋๋ค. ๋ง์
๊ฒฝ์ฐ์, ๋ด๊ฐ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๊ฒ์ ์ผ๋ถ์ ์ํ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ๋๋ค
ํน์ ๊ตฌ์ฑ ์์. ํ์ฌ ์ด๋ฒคํธ ๋ฒ์ค ๊ตฌํ์ ๋ค์์ ์ ๊ณตํ์ง ์์ต๋๋ค.
๋ชฉ์ ์ง ๋๋ ์ถ๋ฐ์ง ๋ ธ๋์ ๋ํ ์ ๋ณด(๋๋ ๋ชจ๋
์ด๋ฒคํธ ์ฐ๊ฒฐ์ ์ด ๊ณ ์ ํ _uid๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น? ), ๊ทธ๋์
vuejs2.0์ ์ฌ์ค point to point ์ด๋ฒคํธ ํต์ ์ ์ง์ํ์ง ์์ต๋๋ค. ๋๋ ค๊ณ
์ ํํ vuejs2.0 ์ด๋ฒคํธ ๋ฒ์ค๋ ๊ตฌ์ฑ ์์ ์ ํ์ ๋ํ ๊ตฌ์ฑ ์์ ์ ํ๋ง ์ง์ํฉ๋๋ค.
์์ฌ ์ํต? ํด๋น ์๊ตฌ ์ฌํญ์ ํด๊ฒฐํ ์ ์๋ ๊ฐ๋จํ ์๋ฃจ์ ์ด ์์ต๋๊น?
ํธ๋ฆฌ์ ์ด๋ฒคํธ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋๊ณ _ITS OWN DATA_ ์ ๋ฐ์ดํธ
vuex๋ ์์ฉ ํ๋ก๊ทธ๋จ ์์ค์ ์ ์ญ ์ ์ ์ํ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ์ ํฉํฉ๋๋ค.
ํ์ง๋ง ๋ด๊ฐ ์ดํดํ๋ ๊ฒ์ฒ๋ผ ํน์ ๋ก์ปฌ ๊ตฌ์ฑ ์์ ๋ฐ์ดํฐ์๋ ์ข์ง ์์ ์ ์์ต๋๋ค.
๊ด๋ฆฌ?์ด ๋ฌธ์ ์ ๋ํ ๋ ๋ง์ ์๊ฐ์ ํ์ํฉ๋๋ค.
โ
์ด ์ค๋ ๋์ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/vuejs/vue/issues/3581#issuecomment -244008699 ๋๋ ์์๊ฑฐ
์ค๋ ๋
https://github.com/notifications/unsubscribe-auth/AFTLl1bjHqWTVDAkr8Fqbx0WiTuH16n2ks5qlooBgaJpZM4JyUfJ
.
์ด์ ์ด ๋ฌธ์ ๋ฅผ ๋ซ๊ฒ ์ต๋๋ค.
@ktsn , ๋ฐ๋ชจ ๋ฐ์ด์ฌ๋ฆฐ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๊ฒ์ด ๋ฐ๋ก ๋ด๊ฐ ๊ฐ๋จํ ์๋ฃจ์
์ ์ํ๋ ๊ฒ์
๋๋ค!
@fnlctrl , ์์ ๋ชจ๋์ vuex ์ํ ๊ด๋ฆฌ์ ๋ ๋ง์ ์๊ฐ์ ํ ์ ํ ๊ฒ์
๋๋ค.
๋ค์ ํ๋ฒ ๊ฐ์ฌํฉ๋๋ค~!
๋ด ์๊ฐ์ $broadcast๋ ํ์ํ์ง ์๊ณ ๋จ์ด์ง๋ ์ํ ๋ฐ์ดํฐ ํ๋ฆ๋ง ํ์ํฉ๋๋ค.
๋ชจ๋ $dispatch๋ ๋ค์๊ณผ ๊ฐ์ด ๋จ์ผ ๋ ๋ฒจ v-on ๋ฐ $emit์ผ๋ก ๋ค์ ๊ตฌํํ ์ ์์ต๋๋ค(Vue 1์์).
๊ด๋ จ๋ ๊ฐ ๊ตฌ์ฑ ์์์ ๋ํ <child-component @select="$emit('select', $arguments[0])" />
๋ค๋ฅธ ์ํฉ์์๋ ์ฌ์ฉ์ ์ง์ ์ด๋ฒคํธ ๋ฒ์ค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ค์ ๋ก ๊ตฌ์ฑ ์์ ์์ฒด์ ์ฌ์ฉ์ ์ ์ ์ด๋ฒคํธ์ ๋ํ ๊ตฌ์ฑ ์์ ํ๊ทธ์ v-on์ ๊ตฌ์ฑ ์์ ์์ฒด์ $emit์์๋ ์๋ํฉ๋๋ค.
@cnweibo ๊ธฐ๋ก์ ๊ฒฝ์ฐ ์ด๋ฒคํธ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
{
template: `<foo @bar="dosomething">`,
methods: {
dosomething(params1, params2, ... and all the event data args) {}
}
}
ํ์ง๋ง vuejs2.0์์๋ ์ด๋ฒคํธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ฌผ๋ก ๊ทธ๋ด ์ ์์ต๋๋ค. ๋ค๋ฅธ ์๊ฐ์ ํ๊ฒ ๋ง๋๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@fnlctrl
@LinusBorg
์ฃ์กํฉ๋๋ค. ์ ๊ฐ ์คํด๋ฅผ ํด์ ๋ถ๋ช
ํํ๊ฒ ๋ง์๋๋ฆฝ๋๋ค. ์ ๊ณต๋ @fnlctrl ํจํด์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ค์ ๋ก ๊ฒ์ํ ์ ์์ต๋๋ค.
<comp @some-event-emitted-by-comp-internal-template="someFuncInParentScope"></comp>
๋ค๋ฅธ ๋ฌธ์ ์์ ๋ด ์์ ์ ์๊ฒฌ์ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ: https://github.com/vuejs/vue/issues/2760#issuecomment -250883407
$dispatch๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๋์ฐํ ์๊ฐ์ด์์ต๋๋ค. ์ด๊ฒ์ ์๊ฐ์ ํธ๋ฆฌ ์๋ก ๋ฒ๋ธ๋ง ์์ /์ด๋ฒคํธ์ ๊ฐ๋ ์ ๊ตฌํํ ์ต์ด์ UI ํ๋ ์์ํฌ/๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋๋ค. ์ ํ๋ฆฝ๋ ์์ด๋์ด์ ๋๋ค. "์ ์ ์๋ ์์ ํธ๋ฆฌ์์ ๋ถ์์ฉ์ ์ผ์ผํค๋ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ ์ ์๋ค๋ ๊ฒ์ด ๋์๊ฒ ๋ฌธ์ ์ ์ฒ๋ฐฉ์ฒ๋ผ ๋ค๋ฆฐ๋ค"๋ ์ ์ ํ์ ์ด ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ด ์ฑ ์์ ์ฌ์ฉ์์๊ฒ ๋งก๊ฒจ์ผ ํฉ๋๋ค. ๋๋ ๋๋ถ๋ถ์ด ์ด ๊ธฐ๋ฅ์ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ ์์์ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ์๋ก์ด ๊ฐ๋ ์ด ์๋๋๋ค!
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ DOM ๋ฐ DOM ์ด๋ฒคํธ์ ๊ฐ์ ์ค๋ซ๋์ ํ๋ฆฝ๋ ์น ๊ธฐ์ /๊ฐ๋ ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ ๋ ์ค์ ๋ก ์๊ฐ์ ํธ๋ฆฌ๋ฅผ ๋ฒ๋ธ๋งํ๊ณ ์๋ฌด๋ ์์ด ๊ทธ๋ ๊ฒ ํด์์ ๋ ์ด ๋ณ๊ฒฝ์ ์ด์ ์ ์ค์ ๋ก ๋ณผ ์ ์์ต๋๋ค. ๋ถํ. ์น ์ปดํฌ๋ํธ์ ๋ํ W3C ์ ์ ๋๋ถ์ ์ปดํฌ๋ํธ์ ๋ํ ์์ด๋์ด๊ฐ ์ต๊ทผ์ ์ฑํ๋ ๊ฒ์ด ์๋๊ฐ์? ์ ์๊ฐ์๋ Vue ๊ตฌ์ฑ ์์๊ฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ฐ ์ํ๋๋ ๋ฐฉ์๊ณผ ๊ด๋ จํ์ฌ ์ผ๋ฐ DOM ์์์ ์ ์ฌํ๊ฒ ๋์ํ๋ค๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ด๋ฒคํธ ๋ฒ์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ ์๋ ๋์์ ๋ ์ค์ฉ์ ์ด๊ณ ํจ๊ณผ์ ์ด๊ณ ์ดํดํ๊ธฐ ์ฌ์ด(์๋ ๊ฐ ์ ํ๋ฆฝ๋ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ์) ์ด๋ฏธ ์กด์ฌํ์ ๋ ๋์๊ฒ ๋น๋ ผ๋ฆฌ์ ์ผ๋ก ๋ณด์ ๋๋ค.
์ด ์ค๋ ๋์ ๋ค๋ฅธ ์ ์์ EmberJS๊ฐ ์ํ๋ ๋ฐฉ์์ ์๊ฐ๋๊ฒ ํฉ๋๋ค. ๊ณ์ธต ๊ตฌ์กฐ์ ๊ฐ ์์ค ์๋์ ์๋ ๊ตฌ์ฑ ์์์ ์์ฑ์ผ๋ก ํด๋ก์ ์์ ์ ์ ๋ฌํฉ๋๋ค. ๋๋ฌด ์ง๋ฃจํ๊ณ ๋ถํ์ํ! Vuejs๋ ๋ด๊ฐ https://www.npmjs.com/package/ember-component-action-bubbling์ ์ด ์ด์ ์์ต๋๋ค
์ด๊ฒ ์ธ์๋ ๋๋ ๋น์ ์ ๋์๊ด์ ์ ๋ง ์ข์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ง์งํ๊ฒ, ๋๋ ์ด๊ฒ์ด ๋์ฐํ ๋ณํ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ฒคํธ ๋ฒ์ค ํจ๋ฌ๋ค์์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๊ฐ ์ข ์ข ์ ์ธ์ ์ํ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ณด๋ค ์ด๋ฑํ ๋ ์ ํํ ๋์ผํ ์์ ์ ์ํํ๋ ์๋ฃจ์ ์ผ๋ก ์ ์๋์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ์ ์๋ ์ฑ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒคํธ ๊ธฐ๋ฐ ์๋ฃจ์ ์ ๊ฒฝ์ฐ:
ํ์ง๋ง ์ฌ๊ธฐ์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ DOM์์ ๋ ๋๋ง๋์ง ์๋ ๊ตฌ์ฑ ์์๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์์ ํ์ง ์์ ๋ฟ๋ง ์๋๋ผ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ด๋ ๋ถ๋ถ์ด ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ง ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ํ ์ด๋ฒคํธ ์์ ์๋ ์ถ๊ฐ ์ ๋ณด๊ฐ ์ ๊ณต๋์ง ์์ผ๋ฉด ์ด๋ฒคํธ๊ฐ ์ด๋์์ ์ค๋์ง ์ ์ ์์ต๋๋ค. ๋ด ์ธ์ด๋ฅผ ์ค๋กํ์ง๋ง, ๊ทธ๊ฒ์ ๋ด๊ฐ ์ฒ๋ฆฌํ๊ณ ๋ค์ ์ฌ์ฉํ๋ ๋ฐ ์ ๊ฒฝ ์ฐ์ง ์๋ ๋๊ท๋ชจ ํด๋ฌ์คํฐ์ ๋๋ค.
์ํ ์ ์ฅ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
null
์ด๊ณ ๋ก๊ทธ์ธํ๋ฉด ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ์์ต๋๋ค.์ด ์ํ ๋ณ์์ ์์กดํ๋ ์ฑ์ ๋ชจ๋ ํญ๋ชฉ์ ๊ทธ์ ๋ฐ๋ผ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์ด๋ฒคํธ๊ฐ ์์ผ๋ฉฐ ํญ์ ์ฌ๋ฐ๋ฅธ ์ ๋ณด๋ฅผ ํ์ํ๋ฏ๋ก ๊ตฌ์ฑ ์์๊ฐ ์์ฑ๋๋ ์๊ธฐ ๋๋ ์์น๋ ์ค์ํ์ง ์์ต๋๋ค. ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ญ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ง๋ง ์ ๋ฐ์ดํธ๋ง ํ ์ ์๋๋ฐ ์ ๊ทธ๋ ๊ฒ ํฉ๋๊น?
์ ์ธ์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ํํ๋ ์์ ์ ๊ด๊ณ์์ด ์ํฉ์ ๋ฃ์ง ์๊ณ ๋ ๋ก์ปฌ/๊ธ๋ก๋ฒ ์ํ์ ๋ฐ๋ผ ํญ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ํ์๋๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด Vue๊ฐ ์ค๊ณง ์๋ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋๋ถ๋ถ์ ๊ฒ๋ค๊ณผ ์ ์ฌํ๊ฒ, ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์์๋ด๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ํด์ ์ ๋ง ๊ธฐ์ฉ๋๋ค.
ํธ์ง: ์, ๊ทธ๋ฆฌ๊ณ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ํ๊ณ AJAX ์์ฒญ์ ๋ณด๋ด๊ฑฐ๋ ๋ณ๊ฒฝ๋ ๋ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋ค๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ํ 'loggedIn' ๋ณ์๋ฅผ ๊ด์ฐฐํ๊ณ , ์ด๊ฒ์ด true์ด๋ฉด ํ๋กํ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๊ฑฐ๋ ์ด์ ์ ์ฌํ ๊ฒ์ ๋๋ค.
๋๋ ๋น์ ์ด ๋งํ๋ ๊ฒ์ ์ดํดํ์ง๋ง, ์ผ๋ถ ์์ ๊ตฌ์ฑ ์์๊ฐ ์ ์ญ ์ํ๋ฅผ ์์ ํ๋๋ก ํ๋ ๊ฒ์ ๊ทธ ์์ ๊ตฌ์ฑ ์์๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ ์ ์ด ์ด๋์ ์๋์ง ์ ์ ์๋๋ก ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ด ์ค์๋ก "๋๋ฌ์"์ง๋ ๊ฒ๊ณผ ๋์ผํ ์ํ์ด ์ฌ์ ํ ์กด์ฌํฉ๋๋ค.
๋ ํจ๋ฌ๋ค์์ ๊น๋ํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ ์์ํฌ ์ฌ์ฉ์์ ์ฑ ์์ด ๋ฉ๋๋ค.
ํ ๋ฉ์ปค๋์ฆ์ด ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ๋ณด๋ค ๋ ์ดํด๊ฐ ๋๋ ํน์ ์ํฉ์ด ์์ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ก๊ทธ์ธ ์ํ๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ ค์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ์ ์ญ ์ํ๊ฐ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ฉ ํ๋ก๊ทธ๋จ ์ฌ์ฉ์๊ฐ ํด๋ฆญํ๋ ๋ฒํผ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ค์ ๋ก ๋ก๊ทธ์ธํ๋ ๋ ผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. ์ด๋ ์์ ์ฒด์ธ์์ ์ฒ๋ฆฌ๋๋ ๊ฒ์ ๋๋ค. ๊ตฌ์ฑ ์์์ผ ์๋ ์๊ณ ๊ฒฝ๋ก์ผ ์๋ ์์ต๋๋ค. ๋ฒํผ์ ๊ฐ๋ฅ์ฑ ๋ง์ ๋ก๊ทธ์ธ ํ ์๋์ ๋ฌด์ธ๊ฐ๋ฅผ ํต์งํด์ผํฉ๋๋ค.์ด ๋ฒํผ์, ๊ทธ๋ฌ๋ฏ๋ก, ์ง์ ์ ์ญ ์ํ๋ฅผ ์์ ํ ํ์๊ฐ ์์ต๋๋ค.
์ด์ $dispatch๋ฅผ ์ ๊ฑฐํ๋ฉด ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ์ ์ธ์ ์ ๊ด๋ฆฌํ๊ณ ์๋๋ฅผ ์ง์ ์๋ฆฌ๋ ์ผ๋ถ ์ ์ญ ๊ฐ์ฒด์ ๋ํด ์๊ธฐ ์ํด ๋ฒํผ ๊ตฌ์ฑ ์์๊ฐ ํ์ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฒํผ์ด ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋จ๋จํ ๊ฒฐํฉ๋ฉ๋๋ค.
๋๋ ๋ฒํผ์ด 10๋จ๊ณ ๊น์ด๋ก ์ค์ฒฉ๋์ด ์๊ณ ์๋๊ฐ ๋ชฉ์ ์ ๋๋ฌํ๋๋ก ๋ชจ๋ ์์ค์์ v-on:login
์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ์ธํด์ผ ํ ์ ์์ต๋๋ค. ์์ ํ ๋ถํ์ํฉ๋๋ค.
์ค์ ๋ก ๋ชจ๋ ์์ค์์ v-on
๋ฅผ ์ํํด์ผ ํ๋ฉด ์ฝ๋๋ฅผ ์ ์ง ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋๋ค.
๋ถ๋ช ํ ์ํ๋ฅผ ์ง์ ๋ณ๊ฒฝํ๋ ๊ฒ๋ง์ผ๋ก๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์ง๋ง Vuex๋ ๋์ฐ๋ณ์ด์ ์ก์ ์ผ๋ก ๊ทธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ผ๋ถ ์๋ฃจ์ ์ด ๋ค๋ฅธ ์๋ฃจ์ ๋ณด๋ค ๋ ์ ๋ง๋ ๊ฒ๋ ์ฌ์ค์ด์ง๋ง ์ ์ธ์ ๋ ผ๋ฆฌ๊ฐ ๋ ๋์ ์ต์ ์ด ์๋ ์ํฉ์ ๋ณธ ์ ์ด ์์ต๋๋ค.
๊ทํ์ ํน์ ๊ฒฝ์ฐ์๋ ๋ก๊ทธ์ธ ์ ์ฉ ๋ฒํผ์ ๋ง๋ค์ง ์์ ๊ฒ์ ๋๋ค. ๋ถ๋ก์์ ๋ก๊ทธ์ธ ๊ด๋ จ ๊ตฌ์ฑ ์์๊ฐ ์ด๋ค ์ด์ ๋ก ๊ทธ๋ ๊ฒ ๊น๊ฒ ์ค์ฒฉ๋์ด ์์ผ๋ฉด ์ ์ญ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋๋ก ํ์ญ์์ค.
๋ก๊ทธ์ธ ๋ฒํผ์ ์์์ผ ๋ฟ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ vuex store๋ ์ ๊ฐ "some global object"๋ฅผ ์ธ๊ธํ ๋ ์ธ๊ธํ ๊ฒ์ ๋๋ค. vuex๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์กฐ์ฌํด์ผ ํ์ง๋ง ์คํ ์ด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ๋ง ํ๋ฉด ์ฑ ์ํ์ ๋๋จธ์ง ๋ถ๋ถ์ ์์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐ์ ํ๊ฒ ๊ฒฐํฉํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ก๊ทธ์ธ ๋ฒํผ์ด ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ์ธ ๊ฒฝ์ฐ์๋ ๋ฐ๋์งํ์ง ์์ต๋๋ค.
ํนํ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ๋๋ฆฌ ์ธ์๋์ด ํ๋ก์ ํธ์ ์๋ก์ด ๊ธฐ์ฌ์๊ฐ ์ดํดํ๊ธฐ ์ฌ์ด ๊ฒฝ์ฐ ๋ ํจ๋ฌ๋ค์์ ์ฌ์ฉํ๊ธฐ ์ํด *_choice *_๋ฅผ ์ ํํ์ง ์์์ผ๋ฉด ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ผ์ฐํฐ ๋ณด๊ธฐ ๊ตฌ์ฑ ์์์๋ ๋ด ์๊ฐ์ ์ ์ฅ์์ ์ก์ธ์คํ๊ณ ์ปค๋ฐํ ์ ์๋ ๋ชจ๋ ๊ถํ์ด ์๊ธฐ ๋๋ฌธ์ "์ผ๋ถ ์์ ๊ตฌ์ฑ ์์"๊ฐ ์๋ฏธํ๋ ๋ฐ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๊ทธ๋ฌ๋ ๋ฒํผ, ์์ ๋๋ ๊ธฐํ UI ์์์ ๊ฐ์ด ์ฌ์ฌ์ฉ์ ์ํ ๋ ์์ ๊ตฌ์ฑ ์์์ธ ๊ฒฝ์ฐ 10๋ฒ ์ค 9๋ฒ์ ์ํ ๋ฐ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅ์์ ์ก์ธ์คํ ๋ ผ๋ฆฌ์ ์ด์ ๊ฐ ์์ด์ผ ํฉ๋๋ค.
Vue ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ ํํฅ์์ด๋ฏ๋ก ๋ก์ปฌ ์ํ๋ฅผ ๊ฐ๋ฅํ ํ ์ต์์ ์์ค์ผ๋ก ์ ์งํ๋ ค๊ณ ํฉ๋๋ค. ๊น์ ๋ดํฌ ์์ฒด๋ ๊ฐ๋ฅํ ํ ํผํด์ผ ํ ๋ฌธ์ ์ ๋๋ค. ์ด๋ฒคํธ๋ฅผ ๋ ๋จ๊ณ ์๋๋ก ์ ํํ๋ ๊ฒ์ ๊ทธ๋ค์ง ๊ท์ฐฎ์ ์ผ์ด ์๋์ง๋ง, ๊ทธ๋ณด๋ค ๋ ๊น์ด ๋ค์ด๊ฐ๋ฉด ํ ํ๋ฆฟ ๊ตฌ์กฐ๋ฅผ ์ฌ๊ณ ํด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋๋ถ๋ถ ์ ์ ์ ๋๋ค. ์ข ์ข ์ดํดํ๊ธฐ ์ฌ์ด ํจ๋ฌ๋ค์์ ๊ฒฐ๊ตญ ์ง์ฅ ๋๊น์ง ๋จ์ฉ๋๊ณ ๋ค๋ฃจ๊ธฐ ์ด๋ ค์์ง๋ ํจ๋ฌ๋ค์์ ๋๋ค. ์ํ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ํ์ฌ 2.0์ ์ฌ์ฉํ๊ณ ์๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ๋์ํ ๊ฒ์ฒ๋ผ ํจ์ฌ ๋ ๊ฐ๋จํฉ๋๋ค. 1.0์ ๊ณ์ ์ฌ์ฉํ๊ฑฐ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ด ์ ํธํ์ง ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
10๋ฒ ์ค 9๋ฒ์ props์ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ์ด์ ์ ๊ทผํ ๋ ผ๋ฆฌ์ ์ด์ ๊ฐ ์์ด์ผ ํฉ๋๋ค.
์ ํํ ๋ด ์์ .
๋ฅ ๋ค์คํ ์์ฒด๊ฐ ์ต๋ํ ํผํด์ผ ํ ๋ฌธ์
๋๋ก๋ ์ด๊ฒ์ด ์ต์ ์ด ์๋๋๋ค.
์ด๋ฒคํธ๋ฅผ ๋ ๋จ๊ณ ์๋๋ก ์ ํํ๋ ๊ฒ์ ๊ทธ๋ค์ง ๊ท์ฐฎ์ ์ผ์ด ์๋๋๋ค.
์ด๋ฌํ ์์ค์ด ๋ ๊น์ด์ง๋ฉด ์ฌ์ค์ด ์๋๋๋ค.
์ดํดํ๊ธฐ ์ฌ์ด ํจ๋ฌ๋ค์์ ๊ฒฐ๊ตญ ์ง์ฅ ๋๊น์ง ํ๋๋นํ๊ณ ๋ค๋ฃจ๊ธฐ ํ๋ ํจ๋ฌ๋ค์์ด๋ค.
์ด๊ฒ์ ์ฌ์ฉ์์ ๊ท์จ์ ๋ฌ๋ ค ์์ต๋๋ค.
1.0์ ๊ณ์ ์ฌ์ฉํ๊ฑฐ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ด ์ ํธํ์ง ์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
์.
๋จ์ํจ๊ณผ ํธ๋ฆฌํจ์ด ๋ด๊ฐ Ember์์ Vue๋ก ์ ํ์ ๊ณ ๋ คํ ์ด์ ์
๋๋ค. $dispatch
๋ ๋ด๊ฐ Vue์์ ์ฆ๊ฒผ๋ ๊ฒ ์ค ํ๋์ด๋ฉฐ ๊ทธ๊ฒ์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋์๊ฒ ๋๋ฌด ์์์ ์ผ๋ก ๋ณด์
๋๋ค.
ํ์ 2.0 ๋ฆด๋ฆฌ์ค์์ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ์ต๋๋ค. ๋๋ ์์งํ ๊ทธ๋ค ๋ชจ๋์ ๋์ํฉ๋๋ค. ์ด๊ฒ๋ง์ ์๋๋๋ค.
๋ต๋ณํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@ktsn $broadcast ๋ฐ $dispatch์
@rhyek ๋น์ ์ด ์ ๊ธฐ ํ ๋ช ๊ฐ์ง ํฌ์ธํธ์ ๋ํด ๋ด
์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ ๋ถ๋ชจ์ ๊น์ด ์ค์ฒฉ๋ ์์์ด ์๋ ๊ฒฝ์ฐ ์ฝ๋์์ ์ด ๊ด๊ณ๋ฅผ ์ ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค(๋ฌผ๋ก $broadcast
๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค).
Vue 2.0์์ ๋์
ํ ๋ค๋ฅธ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ์ฌ์ฉ ์ค๋จ์ ์ดํด๋ณด๋ฉด ๋ช
์์ ๋์์ ์ํด ์์์ ๋์์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ์ฃผ์ ์ด๋ฉฐ $dispatch
์ฌ์ฉ์ ์ค๋จํ๋ ๊ฒ์ด ๋ฐ๋ก ๊ฑฐ๊ธฐ์ ๋ง์ต๋๋ค.
์์:
// parent
events: {
'some-event': function () { ... }
}
// deeply nested child:
$dispatch('some-event')
๋ถ๋ชจ์ ์ง๊ณ ์์์ด ํ๋๋ง ์๋ ๊ฒฝ์ฐ์๋ ๊ด์ฐฎ์ต๋๋ค. ํ์ง๋ง ์ด ๊ฒฝ์ฐ ํ
ํ๋ฆฟ์ ๋ฆฌ์ค๋๊ฐ ์๋ $emit()
๋ ์ค์ ์ถ๊ฐ ์์
์ด ์๋๋๋ค.
์ค์ฒฉ๋ ์์(ํนํ ๊น์ด ์ค์ฒฉ๋) ๋๋ ๋ ์ด์์ ์ง๊ณ ์์์ด ์๋ ์ฆ์ (ํนํ ํ์์) ๋ฐ๋ผ๊ฐ๊ธฐ๊ฐ ์ด๋ ค์์ง๋๋ค. ๋ชจ๋ ์์์ ์ดํด๋ณด๊ฑฐ๋ ์ฝ๋ ์ฃผ์์ ์์กดํ์ฌ ์ด๋ฒคํธ๊ฐ ๋ฌด์์ธ์ง ๋ฌธ์ํํด์ผ ํฉ๋๋ค. ์ถ๊ฐ ์์ฉ๊ตฌ์ด๊ธฐ๋ ํ ์์ ๊ตฌ์ฑ ์์์์ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ฅผ ํตํด ์ ๋ฌํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ $dispatch ๋ฐ $broadcast๋ฅผ ์ข์ํ๋ค๊ณ ๋งํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ด ๋ ์ฝ๋ค๋ ๋ฐ ๋์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ค์ ๋ก ํ์์ ์ธ ์ํฉ์ ๋ง์ด ๊ฒฝํํ์ง ๋ชปํ์ต๋๋ค. ์ถ๊ฐ๋จ/ ์ด ์ฌํ ๋์ ์ค๊ฐ ๊ตฌ์ฑ ์์์ ์ํด.
๊น๊ฒ ์ค์ฒฉ๋ ๊ตฌ์ฑ ์์์ ํจ๊ป $dispatch
๋ฅผ ์ฌ์ฉํ ๋ ์ด๋ฒคํธ์ ๋ค์์คํ์ด์ค๋ฅผ ๋งค์ฐ ๋ช
์์ ์ผ๋ก ์ง์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ถฉ๋ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
// parent
events: {
'close': function () { ... }
}
// deeply nested child 1:
$dispatch('close')
// deeply nested child 2:
$dispatch('close')
..๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ๊ทธ ์์ด๋ค์ด ์ 3์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ฉด, ๋น์ ์ ์ด์ ๋งํ์ต๋๋ค. ๋๋ ๋ถ๋ชจ์๊ฒ $dispatch()
๋ ๊ฐ๊ธฐ ์ ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ค๊ฐ์ ์๋ ์ผ๋ถ ๊ตฌ์ฑ ์์์์ ์ด๋ฒคํธ๋ฅผ ์ก์์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ฝ๋๋ฅผ ๋ณด๊ณ ์๋ ๋๊ตฐ๊ฐ๊ฐ ์ด๋ฒคํธ์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ๊ฒ ์ธ์๋ ์๋ฌด ๊ฒ๋ ํ์ง ์๋ ์ด์ ๋ฅผ ์๊ฐํ ์ ์์ผ๋ฏ๋ก ์ฃผ์์ ์ถ๊ฐํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
$emit ๋ฐ ํ
ํ๋ฆฟ ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ชจ๋ ๊ณณ์์ ๊ฐ๋จํ๊ณ ์งง์ ์ด๋ฒคํธ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ ์ด๋ฒคํธ์๋ @close="callback
"ํ
ํ๋ฆฟ์ ์ฐ๊ฒฐ๋ ๊ณ ์ ํ ์ฝ๋ฐฑ์ด ์์ผ๋ฏ๋ก ์ถฉ๋ํ์ง ์์ต๋๋ค.
๋๋ ์ ๋ง๋ก ๋น์ ์ด ๋ ํจ๋ฌ๋ค์์ ์ฌ์ฉํ๊ธฐ ์ํด *์ ํ*์ ๋ฐํํ์ง ์์์ผ๋ฉด ํฉ๋๋ค.
๋ ํจ๋ฌ๋ค์์ด ๋๊ฐ์ด ์ ์๋ํ ์ ์๋ค๊ณ ์๊ฐํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ๋๋ฑํ๊ฒ ์ทจ๊ธํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์์ ์ด์ ๋ฑ์ผ๋ก ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ "๊ธ๋ก๋ฒ ๋ฒ์ค" ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ฐํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋จ๊ฒจ๋๊ณ ๊ฐ์ฅ ์ ์๋ํ๋ ๊ฒ์ผ๋ก ์ฌ์ฉ์๋ฅผ ์๋ดํ๋ ค๊ณ ํฉ๋๋ค.
๋ํ ๊ธ๋ก๋ฒ ์ํฉ์ ๋ํ ์ฐ๋ ค์ ๋ํด์๋ ๋ง์๋๋ฆฌ๊ณ ์ถ์ง๋ง ์์ง ๊ทํ์ ์ ์ฅ์ ์ถฉ๋ถํ ์ดํดํ๊ณ ์์ง๋ ์์ต๋๋ค.
$dispatch ๋ฐ $broadcast๊ฐ ๊ฐ์ฅ ์ ํฉํ๋ค๊ณ ์๊ฐํ๋ ์๋ฅผ ์ ๊ณตํ ์ ์์ผ๋ฉฐ "์ฐ๋ฆฌ" ์ ๊ทผ ๋ฐฉ์์ด ์ํฉ์ ๊ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ค๊ณ ํฉ๋๋ค.
$dispatch/$broadcast ์ ์ด๋ฒคํธ ๋ฒ์ค๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฝ๋๋ฅผ ์ฝ๊ฒ ์ ์ง ๊ด๋ฆฌํ๊ณ ๋ค์ํ ์๋๋ฆฌ์ค์์ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ ๋ค ์ ์ง ํ ์ ์๋ค๋ฉด ๊ทธ๊ฒ์ ์ข์ ๊ฒ์
๋๋ค.
๋ชจ๋ ๊ฒฝ์ฐ์ ํ๋๊ฐ ๋ค๋ฅธ ๊ฒ๋ณด๋ค ๋ซ๋ค๊ณ ๋งํ๊ธฐ๋ ๋งค์ฐ ์ด๋ ต์ต๋๋ค.
@cnweibo ์์ธก์ ์๋นํ ์ฒ ์ ํ ๋ ผ์์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์งํ "์๋ก ๋ค๋ฅธ ๋ฌธ์ ํด๊ฒฐ"์ ๋ํ ๊ทํ์ ์์ ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์์ ๋กญ๊ฒ ๋ ๋ง์ ์ฃผ์ฅ์ ํผ์น ์ ์์ง๋ง ์ด๋ฐ ์ผ์ ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ผ๋ ์ ์ ๋ถ๋ช ํ ๋ง์๋๋ฆด ์ ์์ต๋๋ค.
์ ๋ง ์ํ๋ค๋ฉด ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ง์ ๊ตฌํํ๋ ๊ฒ์ ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ต๋๋ค.
@LinusBorg ๋ต๋ณ์ ์์ฑํ๋ ๋ฐ ์๊ฐ์ ํ ์ ํด ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ ๊ทํ์ ์ฃผ์ฅ์ ์ดํดํฉ๋๋ค.
$dispatch์ $broadcast๋ฅผ ์ข์ํ๋ค๊ณ
๋๋ ์์งํ $dispatch
์ข์ํฉ๋๋ค. $broadcast
ํ์คํ ์ด์ํด ๋ณด์์ต๋๋ค. ๋ด๊ฐ ๋งํ๋ฏ์ด $dispatch
๋ ํ์ฌ ๋ง์ ํ๋ซํผ์์ ๋ณดํธ์ ์ธ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์
๋๋ค. $broadcast
... ๋ณ๋ก. ๋ด๊ฐ ๋ง๋ ๊ฒ๊ณผ ์ ์ฌํ ์ ์ผํ ๊ฒ์ ์ผ๋ฐ ์ด๋ฒคํธ์ ์์ ์ด๋ฃจ๋ WPF์ "๋ฏธ๋ฆฌ๋ณด๊ธฐ" ์ด๋ฒคํธ์
๋๋ค. ๊ทธ๋ค์ ์ต์์ ์์์์ ์๋ ์ด๋ฒคํธ์ ์์ค๋ก ์๊ฐ์ ํธ๋ฆฌ๋ฅผ "ํต๊ณผ"ํ์ง๋ง ๊ด๋ จ ์์์ ์ฒด์ธ ์๋๋ก ์ง์ ์ ์ก๋ ๋ฟ ๋ชจ๋ ๊ฒ์ผ๋ก _ํ์ฐ๋์ง๋ ์์ต๋๋ค.
์ด๋ฒคํธ์ ์ด๋ฆ์ ์ง์ ํ ๋ ๋งค์ฐ ๋ช ์์ ์ด์ด์ผ ํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๋์ํ๊ณ , ์ด์จ๋ ๊ทธ๊ฒ์ ๋ณดํต ๋ด๊ฐ ํ๋ ์ผ์ด๋ค. ๋ํ ์ฌ๋๋ค์ด jQuery์์ ํ๋ ๋ฐ ์ต์ํฉ๋๋ค. ๋ํ ์ผ๋ถ ํ๋ซํผ์ "์์ค" ๊ฐ์ฒด๋ฅผ ํธ๋ค๋ฌ์ ๋ํ ์ธ์๋ก ๋ณด๋ด๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ
์คํธ๋ฅผ ํํฐ๋งํ ์ ์์ต๋๋ค(ํํธ: instanceof
). ์๋ฅผ ๋ค์ด DOM ์ด๋ฒคํธ์๋ event.target
์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ํ๋ซํผ์ ์ ์ ์ ํ์ผ๋ก ์์
ํ๋ ์ด์ ์ด ์์ผ๋ฏ๋ก ์ด "์ถฉ๋"์ด ๋ฐ์ํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค(์ด๋ฒคํธ๋ ํด๋์ค์ ์ธ์คํด์ค์).
์ด์จ๋ ์ด๊ฒ์ด VueJS ํ์ ์ ๊ทธ๋ ๊ฒ ์ฐ๋ ค๋๋์ง ์์งํ ์ดํด๊ฐ ๋์ง ์์ต๋๋ค. ์ฌ๋๋ค์ด $dispatch
์ฌ์ฉ์ ๋ํด ์ถฉ๋ถํ ์ฃผ์ํ ์ ์๋ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ค์ด ์๋ชปํ๊ณ ์๋ ๋ค๋ฅธ ๋ง์ ๊ฒ๋ค์ ์ฐพ์ ์ ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ถ์ฃผ์ํ์ง ์๋๋ก "๋ณดํธ"ํ๊ธฐ ์ํด ์ด๋๊น์ง ๊ฐ ๊ฒ์
๋๊น?
๋ถ๋ชจ์๊ฒ ์ง๊ณ ์์์ด ํ๋๋ง ์๋ ๊ฒฝ์ฐ์๋ ๊ด์ฐฎ์ต๋๋ค. ํ์ง๋ง ์ด ๊ฒฝ์ฐ ํ ํ๋ฆฟ์ ๋ฆฌ์ค๋๊ฐ ์๋ $emit()๋ ์ค์ ์ถ๊ฐ ์์ ์ด ์๋๋๋ค.
์ ์งํ ์ง๋ฌธ(์ ๋ Vue๋ฅผ ์ฒ์ ์ ํ๊ธฐ ๋๋ฌธ์) ๋ชจ๋ ์์ค์์ ๋ฆฌ์ค๋๋ฅผ ์ ์ธํ๋ ๊ฒ ์ธ์๋ ์ฒด์ธ์ ๋ชจ๋ ๊ตฌ์ฑ ์์์ ๋ํด ์ด๋ฒคํธ๋ฅผ $emit
ํด์ผ ํ์ง ์์ต๋๊น? ๋๋ฌด ์ง์ฆ๋๋ค์.
๊ฒฐ๋ก ์ ์ผ๋ก, ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์ํ "๊ณต์ ํ ํ๋ฆฟ" ๋์ ์ ๋ํด vue-cli ์ ๋ฌธ์ ์ ๋ํด ๋๊ตฐ๊ฐ๊ฐ ๋งํ ๊ฒ์ ์ธ์ฉํ๊ฒ ์ต๋๋ค(https://github.com/vuejs/vue-cli/issues/123#issuecomment-233071630).
๊ณต์ ํ ํ๋ฆฟ์ ์ฝ๋งค์ด์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ๊ณ์ค ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๋น์ ์๊ฒ ์์ ๋ฅผ ์ฃผ์ง๋ง ๋์์ ๋ ๋ง์ ๊ฒฐ์ ์ ์ค์ค๋ก ํด์ผ ํ๋ ์์ธ์ด ๋ฉ๋๋ค.
๋๋ ๊ฒฐ๊ตญ ๋ชจ๋ ๊ฒ์ด ๊ท ํ์ ๋ฏธํฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฌํ ๊ฒฐ์ ์ค ์ฐ๋ฆฌ๋ ๋ชจ๋ (๋๋ถ๋ถ) ์ฌ์ฉ์๋ฅผ ์ํด ์ผ๋ง๋ ๋ง์ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ผ๋ฉฐ ์ฌ์ฉ์๊ฐ ์ค์ค๋ก ํ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฐ์ ์ ์ ๋๋ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค.
๋๋ ๊ทธ ์ฒ ํ์ ๋์ํ์ง๋ง, ์ด์ํ๊ฒ๋ _์ด_ ๋ฌธ์ ์ ๋ํด ๋ด๊ฐ ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ํ๋๊ฐ ์๋๋๋ค. ๊ทธ ๋๊ธ๊ณผ ์ฌ๊ธฐ ๋๊ธ ์ฌ์ด์ ๋์กฐ๋ ์์ ๋ก ๊ท๊ฒฐ๋ฉ๋๋ค. ๋น์ ์ ๋น๋ก ์ข๊ธด ํ์ง๋ง ๊ถ๊ทน์ ์ผ๋ก ๊ฒฐํจ์ด ์๋ ์๋์ ๋ฐ๋ผ ์ ํ์ ์ทจ์ํ๊ณ ์์ต๋๋ค.
์ ๋ง ์ํ๋ค๋ฉด ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ง์ ๊ตฌํํ๋ ๊ฒ์ ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ต๋๋ค.
@yyx990803 ๊ทธ๊ฒ ์๋ง _๋ด๊ฐ ํ๊ฒ ๋ _ ์ผ... ์๋ง๋.
@LinusBorg ๋ํ:
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ "๊ธ๋ก๋ฒ ๋ฒ์ค" ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ฐํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋จ๊ฒจ๋๊ณ ๊ฐ์ฅ ์ ์๋ํ๋ ๊ฒ์ผ๋ก ์ฌ์ฉ์๋ฅผ ์๋ดํ๋ ค๊ณ ํฉ๋๋ค.
๋น์ ์ "์กฐ์ข ํ๋ ค๊ณ "ํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค. :)
dispatch
๋ฐ EventBus ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ๊ธฐ๋ฅ์ ๊ตฌํํด ๋ณด์
จ์ต๋๊น?
๋์์ด ๋ ์ ์์ต๋๋ค
@posva ํ ๊ณํ์ด์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ๋ถ ๋ชจ๋์์ ์ด๋ฒคํธ ๋ฒ์ค ๊ฐ์ฒด๋ฅผ ์ ์ธํ๊ณ $emit
์ํ๋ ๋ค๋ฅธ ๊ณณ์ผ๋ก ๊ฐ์ ธ์ต๋๋ค. ์๋์? ๋ ๊ทธ๊ฒ ์ซ์ด, tbh. ๋๋ ๋ถ๋ช
ํ ๊ทธ๊ฒ์ ์ด๋ค ์ผ์ ์ฌ์ฉํ ๊ฒ์ด์ง๋ง, ๋งค๋ฒ ํ๊ณ ์ถ์ ๊ฒ์ ์๋๋ผ๊ณ ๊ตณ๊ฒ ๋ฏฟ์ต๋๋ค.
์ด์จ๋ ์ด๊ฒ์ด VueJS ํ์ ์ ๊ทธ๋ ๊ฒ ์ฐ๋ ค๋๋์ง ์์งํ ์ดํด๊ฐ ๋์ง ์์ต๋๋ค. ์ฌ๋๋ค์ด
$dispatch
์ฌ์ฉ์ ๋ํด ์ถฉ๋ถํ ์ฃผ์ํ ์ ์๋ค๋ฉด,
์, ์์ ์ ํ์์ ์๋ฌด๋์ ์ค์ ์ฐ์์๋ฅผ ์ง์ ํ ์ ์๋ค๊ณ ์
๋๋ค $dispatch()
๊ฐ (๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์๋ฃจ์
์ ๋ฐ๋์ง์ด์๋ค์ $emit()
๋ฟ๋ง ์๋๋ผ, ๋ฒ์ค, ๋๋ global state), ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ๋ต๋ณํ ์๋ง์ ํฌ๋ผ ๊ฒ์๋ฌผ์์๋ ์ด์ ๋ํด ๋ณผ ์ ์์์ต๋๋ค.
์ด๊ฒ์ ์ฃผ๊ด์ ์ธ ๊ฒฌํด์ผ ์ ์์ง๋ง ์ ์ฒด ํ์ด "์ด๊ฒ์ ์ฐ๋ฆฌ ๊ฒฝํ์ ํญ์ ์ด๋ฑํ ์๋ฃจ์ "์ด๋ผ๊ณ ์๊ฐํ๋ฉด ํต์ฌ์์ ์ญ์ ํ๋ค๋ ๊ฒ์ ์ดํดํ ์ ์์ต๋๋ค.
์ด ์์ ์์ ์ค์ ์ฌ๋ก๋ฅผ ๋ ผ์ํ๊ธฐ ์ํด ์ ์์ ๊ฐฑ์ ํ๊ณ ์ถ์ต๋๋ค.
๋๋ ๊ทธ๋ค์ด ๋น์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ชปํ๊ณ ์๋ ๋ค๋ฅธ ๋ง์ ๊ฒ๋ค์ ์ฐพ์ ์ ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ถ์ฃผ์ํ์ง ์๋๋ก "๋ณดํธ"ํ๊ธฐ ์ํด ์ด๋๊น์ง ๊ฐ ๊ฒ์ ๋๊น?
์ด๊ฒ์ ๋ฌผ๋ก ๋ฏธ๋ฌํ ์ง๋ฌธ์ด๋ฉฐ ์ฐพ๊ธฐ ์ด๋ ค์ด ๊ท ํ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํ๋จํด์ผ ํ ๊ฒ์ ๋๋ค.
๋ถ๋ชจ์๊ฒ ์ง๊ณ ์์์ด ํ๋๋ง ์๋ ๊ฒฝ์ฐ์๋ ๊ด์ฐฎ์ต๋๋ค. ํ์ง๋ง ์ด ๊ฒฝ์ฐ ํ ํ๋ฆฟ์ ๋ฆฌ์ค๋๊ฐ ์๋ $emit()๋ ์ค์ ์ถ๊ฐ ์์ ์ด ์๋๋๋ค.
์ ์งํ ์ง๋ฌธ(์ ๋ Vue๋ฅผ ์ฒ์ ์ ํ๊ธฐ ๋๋ฌธ์), ๋ชจ๋ ์์ค์์ ๋ฆฌ์ค๋๋ฅผ ์ ์ธํ๋ ๊ฒ ์ธ์๋ ์ฒด์ธ์ ๋ชจ๋ ๊ตฌ์ฑ ์์์์ ์ด๋ฒคํธ๋ฅผ $emitํด์ผ ํ์ง ์์ต๋๊น? ๋๋ฌด ์ง์ฆ๋๋ค์.
์ง์ ์ ์ธ ๋ถ๋ชจ-์์ ๊ด๊ณ์ ๋ํด ์ด์ผ๊ธฐํ๊ธฐ ๋๋ฌธ์ $emit() ํ ๋ฒ๋ง ์ํํ๋ฉด ๋ฉ๋๋ค.
๊น์ด ์ค์ฒฉ๋ ์์์ด ์๋ ๊ฒฝ์ฐ ๋ฌผ๋ก ๋ชจ๋ ์์ค์์ ๋ค์ ๋ด๋ณด๋ด์ผ ํ์ง๋ง ๋ฐ๋ณตํฉ๋๋ค. ๋ง์ ์ค์ฒฉ๋ ์์์ ๊ฑธ์ณ ํ๊ฒฌ๋๋ ์ํฉ์ด ์ค์ ๋ก ํ์ํ๊ฑฐ๋ ๋ค๋ฅธ ์๋ฃจ์ ๋ณด๋ค ์ ํธ๋๋ ์ํฉ์ ๋ฐ๊ฒฌํ๊ฑฐ๋ ์ ์ํ์ง ๋ชปํ์ต๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ "๊ธ๋ก๋ฒ ๋ฒ์ค" ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ฐํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋จ๊ฒจ๋๊ณ ๊ฐ์ฅ ์ ์๋ํ๋ ๊ฒ์ผ๋ก ์ฌ์ฉ์๋ฅผ ์๋ดํ๋ ค๊ณ ํฉ๋๋ค.
๋น์ ์ "์กฐ์ข ํ๋ ค๊ณ "ํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ํ๋ ๊ฒ์ ๋๋ค. :)
๋๋ ์ฐ๋ฆฌ๊ฐ ๋น์ ์ ์ถ์ ์กฐ๊ธ ๋ ์ด๋ ต๊ฒ ๋ง๋ ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค - ๋น์ ์ ํ ์ ์์ต๋๋ค
์ฐ๋ฆฌ๋ ๋น์ ์๊ฒ $emit()
๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ง ๋น์ ์ ๊ธธ์ ์กฐ๊ธ ๋ ์ด๋ ต๊ฒ ๋ง๋ค๊ณ ์์ต๋๋ค.
๋ชจ๋ Vue ์ธ์คํด์ค์ ์ถ๊ฐํ ์๋ ์์ต๋๋ค. Vue.prototype.$bus = new Vue()
๋ญ๊ฐ๋ฅผ ์ข์ํ์ง ์๋ ๊ฒ์ ๊ทธ๋ค์ง ๊ฑด์ค์ ์ด์ง ์์ต๋๋ค ...
๐ ์ฌ๋ฌ๋ถ์ ์ฌ๋ก๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ์ต๋๋ค.
@posva
๋ชจ๋ Vue ์ธ์คํด์ค์ ์ถ๊ฐํ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. Vue.prototype.$bus = new Vue()
๋๋ ๊ทธ๊ฒ์ ์ข์ํ๋ค. ๊ฝค ๋๋ํ๋ค.
๋ฌด์ธ๊ฐ๋ฅผ ์ข์ํ์ง ์๋ ๊ฒ์ ๊ทธ๋ค์ง ๊ฑด์ค์ ์ด์ง ์๋ค
๋๋ ๊ทธ๊ฒ์ด ์ ์ด๋ ๋๋ฅผ ์ํด ๋ฌด์ธ๊ฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ์ ํํ๋ ๊ฝค ์ ํจํ ๊ธฐ์ค์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด์จ๋ ๋๋ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ๊ทธ ์๋ฆฌ์ ์๋ค๊ณ ์๊ฐํ๋ ์ด์ ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋งํ์ต๋๋ค.
๐ ์ฌ๋ฌ๋ถ์ ์ฌ๋ก๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ์ต๋๋ค.
๋ด ๋ง์, ๋ด๊ฐ ์ ๋ง๋ก ํ์ํฉ๋๊น? ์ด๋ฒคํธ ๋ฒ์ค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ชจ๋ ์์ค์์ ๋ฆฌ์ค๋๋ฅผ ์ ์ธํ๋ ์์ด๋์ด๊ฐ ๋ง์์ ๋ค์ง ์๋ ์ํฉ์ ๋ํ ์๋ฅผ ๋ค์์ต๋๋ค. ์ฝ๋๋ฅผ ๋ณด๊ณ ์ถ์ต๋๊น? ๋ด ์์ ์ ์ข ๋ ๋ช ํํ๊ฒ ํ๊ธฐ ์ํด ๋ญ๊ฐ๋ฅผ ์๊ฐํด๋ผ ์๋ ์์ง๋ง ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ์ ์ฉํ ๊ฒ์ผ๋ก ํ๊ฐํ ์ ์๋ ๊ฝค ํ์ค์ ์ธ ๊ฒ์ด๋ฉฐ ์ด๋ฒคํธ ๋ฒ์ค ๋๋ ์ํ ๊ด๋ฆฌ์๋ ์ ์ด๋ ๋์๊ฒ ์ผ์ข ์ ์ผ์ข ์ ์๋ฌด๋ฆฌ ๋ด๋ ์ดํดํ๊ธฐ ์ด๋ ต์ง๋ง ํ์คํฐ์ ์์ญ์ฒ๋ผ ๋ณด์ด๋ ํจ๋ฌ๋ค์ ์ ํ. ๐
๋ฌผ๋ก ๋๋ ๊ทธ ๋ง์ง๋ง ๋๊ธ์ ๋ํด ๋๋ด์ ํ๊ณ ์๋ค. ๋ด๊ฐ ์ ์ ๋งํ๋ฏ์ด, ๋๋ ๊ทธ๋ค์ ์ฉ๋๋ฅผ ๋ณด๊ณ ํ์คํ ๊ทธ๋ค๊ณผ ํจ๊ป ํด๊ฒฐํ ๋ฌธ์ ๋ฅผ ์ฐพ์ ๊ฒ์ ๋๋ค. ์ค์ ๋ก Ember๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ ์ผ๋ถ ํ๋ก์ ํธ์์๋ ๊ธ๋ก๋ฒ ์ํ ๊ด๋ฆฌ์์ ์ ํํ ๊ฐ์ ์ญํ ์ ํ๋ "์๋น์ค"๋ฅผ ์์ฑํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ ๊ณ ์๋ก ๊ณ ์งํ์ง ์์ต๋๋ค.
์ ๋ ๋ทฐ๋ฅผ ์ ๋ง ์ข์ํฉ๋๋ค. ๋ ๊ทธ๋ฅ _์ฌ๋_ํ๊ณ ์ถ์ด, ์์ง?
๋ํ ๋ชจ๋ ๊ตฌ์ฑ ์์์์ ์ด๋ฒคํธ๋ฅผ $emitํด์ผ ํ์ง ์์ต๋๊น?
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ๊ด์ ์์ ์๊ฐํ๋ฉด ๊ทธ๋ ๊ฒ ํฉ๋๋ค. ๊ตฌ์ฑ ์์ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
์:
<div>
<a-button @click="modalShown = true">Open modal</a-button>
<a-modal v-if="modalShown">
<a-button @click="modalShown = false">Close modal</a-button>
</a-modal>
</div>
a-modal
a-modal
๋ฐ ๋ ๊ฐ์ a-button
์ธ์คํด์ค๊ฐ ๋จ์ผ ์ธ์คํด์ค์ "์ง์ ๋
ผ๋ฆฌ์ ์์"์ด๊ธฐ ๋๋ฌธ์ a-modal
๊ตฌ์ฑ ์์๋ a-button
๊ตฌ์ฑ ์์์ ์ด๋ฒคํธ์ ๋ํด ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ต๋๋ค a-modal
, ์ค์ฒฉ์ด ์๋ ๋ณต์กํ ๋ทฐ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์์๋ ๋ถ๊ตฌํ๊ณ .
๋๋ ์ง๊ธ ์ด ์์ ์์ ๋ ์์ ์ ๋ฐ๋ณตํ๊ณ ์๋ค๊ณ ์๊ฐํ๋ค. ์ด๋ป๊ฒ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ก ํ๊ฒ ์ต๋๋ค. ์ด ๋ ผ์๊ฐ ์ด๋ค ์ด์ ๋ก๋ ๋ ์ด์ ์กด์ฌํ์ง ์๋ ๊ฝค ํ์ค์ ์ด๊ณ ์ค์ฉ์ ์ธ ๊ฒ์ ๋ํ ๋ช ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ ์ ์ธ๊ธํ๋ ๋ฐ ์ด์ ์ ๋ง์ถ์๋ค๋ ๊ฒ์ด ์ ๊ฒ๋ ์ด์ํ๊ฒ ๋ณด์ ๋๋ค.
@LinusBorg :
์, ์์ ์ ํ์ ๋๊ตฌ๋ $dispatch()์ ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๊ณ ์๋๋ก ์ถ๊ตฌ๋ฅผ ๋ซ์ง ๋ง์์ผ ํ ์ด์ ๋ฅผ ๋ฌป๋ ํ ๋ชฉ ๊ธฐ์ฌ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๊ทธ๋ ์ด๋ ๊ฒ ๋งํฉ๋๋ค. "์ด ๊ฒฝ์ฌ๋ก๋ ๊ต์ฐจ๋ก๋ก ์ด์ด์ ธ ์ฌ๋๋ค์ด ์ขํ์ ํ ์ง ์ฐํ์ ํ ์ง ํผ๋์ค๋ฌ์ํฉ๋๋ค. ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๋ช ๋ ๋์ ์ด๊ณณ์์ ์ด์์๊ธฐ ๋๋ฌธ์ ๊ธธ์ ์์ง๋ง ์๋ก์ด ์๋ฏผ์ ์ข ์ข ๋ช ๋ ๋์ ๊ธธ์ ์์ต๋๋ค. ๋ถ์ด๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํผํ๊ณ ์ถ์ต๋๋ค."
"์ข์์. ๋ซ์ ์ ์์ต๋๋ค. ๋ฉ์ง๋๋ค. ๋ค์ ์ง์ ๋ก๊น์ง 10km๋ง ๋ ์ด๋ํ๋ฉด ๋ฉ๋๋ค. ์ ๊ฐ ์ฒ๋ฆฌํ๊ฒ ์ต๋๋ค."
:) ๋ต๋ณํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ ์ด๋ ํ ๋ก ์ ์ฌ์ง๊ฐ ์๋ค๋ ์ฌ์ค์ด ๊ธฐ์ฉ๋๋ค. ์ข์ ํ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ๊ณ ์๋๋ก ์ถ๊ตฌ๋ฅผ ๋ซ์ง ๋ง์์ผ ํ ์ด์ ๋ฅผ ๋ฌป๋ ํ ๋ชฉ ๊ธฐ์ฌ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๊ทธ๋ ์ด๋ ๊ฒ ๋งํฉ๋๋ค. "์ด ๊ฒฝ์ฌ๋ก๋ ๊ต์ฐจ๋ก๋ก ์ด์ด์ ธ ์ฌ๋๋ค์ด ์ขํ์ ํ ์ง ์ฐํ์ ํ ์ง ํผ๋์ค๋ฌ์ํฉ๋๋ค. ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๋ช ๋ ๋์ ์ด๊ณณ์์ ์ด์์๊ธฐ ๋๋ฌธ์ ๊ธธ์ ์์ง๋ง ์๋ก์ด ์๋ฏผ์ ์ข ์ข ๋ช ๋ ๋์ ๊ธธ์ ์์ต๋๋ค. ๋ถ์ด๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํผํ๊ณ ์ถ์ต๋๋ค."
๋ด ๋์ ๋น์ ๋ ์ถ๊ฐํ๊ฒ ์ต๋๋ค. :) ๋ด ๊ฒฌํด๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฌด์ธ๊ฐ๋ฅผ ์ข์ํ์ง ์๋ ๊ฒ์ ๊ทธ๋ค์ง ๊ฑด์ค์ ์ด์ง ์๋ค
๋๋ ๊ทธ๊ฒ์ด ์ ์ด๋ ๋๋ฅผ ์ํด ๋ฌด์ธ๊ฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ์ ํํ๋ ๊ฝค ์ ํจํ ๊ธฐ์ค์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด์จ๋ ๋๋ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ๊ทธ ์๋ฆฌ์ ์๋ค๊ณ ์๊ฐํ๋ ์ด์ ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋งํ์ต๋๋ค.
๋ด ์๊ฐ์ @posva ๋ ๋ค์์ ์๋ฏธํ์ต๋๋ค. "๋๋ ์ด๊ฒ์ ์ข์ํ๋ค"๋ ๊ฒ์ ์ ์งํ๊ฑฐ๋ ๊ด๋ฒ์ํ ์ฌ์ฉ์์ ํจ๊ป ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌด์ธ๊ฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ํด ๋ ผ์ํ ๋ ๊ฑด์ค์ ์ธ ์ฃผ์ฅ์ด ์๋๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ธ์ ์ทจํฅ ๋์ ๋ ผ์ํ ํ๋นํ๊ณ ์ค์ ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณ์ ์์ฒญํฉ๋๋ค.
๋ค, ๋น์ ์ด ์๋ฒฝํ๊ฒ ์ข์ ๊ณ ์๋๋ก๋ฅผ ํญํํ๊ณ ๊ณ ๋ฌด ์์คํํธ๋ก ๋ค๋ฅธ ๊ณ ์๋๋ก๋ฅผ ๊ฑด์คํ๋ค๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ๋น์ ์ด ์ด๋์ ๊ฐ ๊ฝค ๊น๋ํ๋ค๋ ๊ฒ์ ์ฝ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ํ 10km๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. :)
์์ ์ ๋ณด: ์ฌ๊ท ๊ตฌ์ฑ ์์์ ๋ํ ์๋ ์ง๋ฌธ์ ๊ฒ์๋ ๊ฒ์ด ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฒคํธ๊ฐ ํฌ์ฐฉ๋๊ณ ์๋ฒฝํ๊ฒ ์ข์ ์๊ฐ ์์ ๋ ๋ชจ๋ ์์ค์์ ์์๋๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ๊ณ ์ถ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. $dispatch๋ก ์ด๋ฅผ ์ํํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
์ฝ๋๋ฅผ ๋ณด๊ณ ์ถ์ต๋๊น?
์, ๋ถํํฉ๋๋ค
@posva ์ด์ ๋๊ธ์์ ์๋ฅผ
์์ ์ ๋ณด: ์ฌ๊ท ๊ตฌ์ฑ ์์์ ๋ํ ์๋ ์ง๋ฌธ์ ๊ฒ์๋ ๊ฒ์ด ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฒคํธ๊ฐ ํฌ์ฐฉ๋๊ณ ์๋ฒฝํ๊ฒ ์ข์ ์๊ฐ ์์ ๋ ๋ชจ๋ ์์ค์์ ์์๋๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํ๊ณ ์ถ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. $dispatch๋ก ์ด๋ฅผ ์ํํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
$dispatch()
์ ํจ๊ป
// recursive-child
<template>
<recursive-child></recursive-child>
<button @click="dispatch">Do something</button>
<template>
<script>
export default{
methods: {
dispatch() { this.$dispatch('do-something') }
},
events: {
'do-something': function () {
// do something, or don't
return true // nessessary to make the event bubble up further. Don't like the un-expressivness of this
}
}
}
</script>
$emit()
์ ํจ๊ป
// recursive-child
<template>
<recursive-child @do-something="doSomething"></recursive-child>
<button @click="doSometing">Do something</button>
<template>
<script>
export default{
methods: {
doSomething() {
// do someting, or don't
this.$emit('do-something')
}
}
}
</script>
๊ทธ๊ฒ ์ ๋ง ๋ ๋์๊ฐ์?
ํ๋ ๋ ์์ด์? :)
์๊ฒ ์ต๋๋ค. ์ฌ๊ท์ ์ด์ง ์๊ณ ์ฌ์ ํ ๊ทธ๋ ๊ฒ ์ค์ฒฉ๋์ด ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๊ด์ฐฎ์. ์ฌ๊ธฐ๊ฐ ์๋ฒฝ 5์์ธ๋ฐ ๋ ๋๋ถ์ ํ๋ ํ๋ฃจ๋ฅผ ๋ณด๋ผ ๊ฑฐ์ผ. ๋์ค์ ๋ ์ข์ ๋ด์ฉ์ด ์๊ฐ๋๋ฉด ์ฌ๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค. ๊ทธ๋ผ ๋น์ฒจ์ด ๋์ จ๊ฑฐ๋ ์ ๊ฐ ๊ด์ฌ์ ์์ผ์ จ์ ๊ฒ๋๋ค. :)
์ฌ๊ท์ ์ด์ง ์๊ณ ์ฌ์ ํ ๊ทธ๋ ๊ฒ ์ค์ฒฉ๋์ด ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๋น์ ์ ์ถ๊ฐํด์ผํฉ๋๋ค @event=
๊ฐ ํ
ํ๋ฆฟ์ ๋ฆฌ์ค๋๋ฅผ $emit()
, ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒ์ ๋ํ $dispatch()
๊ทธ๊ฒ์ ๋ํด ๊ทธ์.
์ด๊ฒ์ ์ฅํฉํจ๊ณผ ํํ๋ ฅ์ ๊ฐ์กฐํ๋๋์ ๋ฐ๋ผ ์ข๊ฑฐ๋ ๋์๊ฒ ๋ณด์ผ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ btw. ์ํฉ์์ ๋ถ๋ชจ๊น์ง ์ด๋ฒคํธ๋ฅผ ์ฐ๊ฒฐํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
<child-comp @event="$emit('event', $arguments)>
์ด์จ๋ , ์ข์ ํ ๋ก , ๋น์ ์ ๊ฐ์น์๋ ์ ์ ์ฆ๊ธฐ์ญ์์ค.
@rhyek ์ฒ์๋ถํฐ $dispatch
๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๊ทธ๊ฒ์ด ๋ชฉํ๋ ์๋๋๋ค. ๋ชฉํ๋ ๊ตฌ์ฑ ์์๊ฐ ์ ์ ํ ์ ์ง ๊ด๋ฆฌ๋ก ์๋ก ํต์ ํ ์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค. ๊ทธ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ ๋ ์ ํธ๋๋ฅผ ์ ์ธํ ๋ชจ๋ ์ค์ฉ์ ์ธ ์ฅ๋จ์ ์ ๋์ดํ ๋ $dispatch
๋ ์ด๋ฑํ ์๋ฃจ์
์ด๋ฏ๋ก ์ญ์ ํ์ต๋๋ค.
๋ํ DOM ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ์ปดํฌ๋ํธ ๊ฐ ํต์ ๊ณผ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฆ ๋๋ค. "์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ๋๋ฆฌ ์๋ ค์ ธ ์๋ค"๋ ์ฃผ์ฅ์ด ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ์ ๋ํ ์ข์ ํด๊ฒฐ์ฑ ์ด์ด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค.
๋๋ "๋๋ ๋จ์ง ๊ทธ๊ฒ์ ์ข์ํ์ง ์๋๋ค"์ ๋ ผ์ํ๋ ๊ฒ์ด ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์ค๋ ๋์์ ๋ ผํ์ ๋ง์ณค์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@rhyek ๋น์ ์ด ์ ๊ธฐ ํ ๋ช ๊ฐ์ง ํฌ์ธํธ์ ๋ํด ๋ด
1. ์์์ ๊ฒฐํฉ.
์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ ๋ถ๋ชจ์ ๊น์ด ์ค์ฒฉ๋ ์์์ด ์๋ ๊ฒฝ์ฐ ์ฝ๋์์ ์ด ๊ด๊ณ๋ฅผ ์ ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค(๋ฌผ๋ก
$broadcast
๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค).Vue 2.0์์ ๋์ ํ ๋ค๋ฅธ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ์ฌ์ฉ ์ค๋จ์ ์ดํด๋ณด๋ฉด ๋ช ์์ ๋์์ ์ํด ์์์ ๋์์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ์ฃผ์ ์ด๋ฉฐ
$dispatch
์ฌ์ฉ์ ์ค๋จํ๋ ๊ฒ์ด ๋ฐ๋ก ๊ฑฐ๊ธฐ์ ๋ง์ต๋๋ค.์์:
๋ถ๋ชจ์ ์ง๊ณ ์์์ด ํ๋๋ง ์๋ ๊ฒฝ์ฐ์๋ ๊ด์ฐฎ์ต๋๋ค. ํ์ง๋ง ์ด ๊ฒฝ์ฐ ํ ํ๋ฆฟ์ ๋ฆฌ์ค๋๊ฐ ์๋
$emit()
๋ ์ค์ ์ถ๊ฐ ์์ ์ด ์๋๋๋ค.์ค์ฒฉ๋ ์์(ํนํ ๊น์ด ์ค์ฒฉ๋) ๋๋ ๋ ์ด์์ ์ง๊ณ ์์์ด ์๋ ์ฆ์ (ํนํ ํ์์) ๋ฐ๋ผ๊ฐ๊ธฐ๊ฐ ์ด๋ ค์์ง๋๋ค. ๋ชจ๋ ์์์ ์ดํด๋ณด๊ฑฐ๋ ์ฝ๋ ์ฃผ์์ ์์กดํ์ฌ ์ด๋ฒคํธ๊ฐ ๋ฌด์์ธ์ง ๋ฌธ์ํํด์ผ ํฉ๋๋ค. ์ถ๊ฐ ์์ฉ๊ตฌ์ด๊ธฐ๋ ํ ์์ ๊ตฌ์ฑ ์์์์ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ฅผ ํตํด ์ ๋ฌํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ $dispatch ๋ฐ $broadcast๋ฅผ ์ข์ํ๋ค๊ณ ๋งํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ด ๋ ์ฝ๋ค๋ ๋ฐ ๋์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ค์ ๋ก ํ์์ ์ธ ์ํฉ์ ๋ง์ด ๊ฒฝํํ์ง ๋ชปํ์ต๋๋ค. ์ถ๊ฐ๋จ/ ์ด ์ฌํ ๋์ ์ค๊ฐ ๊ตฌ์ฑ ์์์ ์ํด.
2. ์ด๋ฒคํธ๋ช
๊น๊ฒ ์ค์ฒฉ๋ ๊ตฌ์ฑ ์์์ ํจ๊ป
$dispatch
๋ฅผ ์ฌ์ฉํ ๋ ์ด๋ฒคํธ์ ๋ค์์คํ์ด์ค๋ฅผ ๋งค์ฐ ๋ช ์์ ์ผ๋ก ์ง์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ถฉ๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค...๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ๊ทธ ์์ด๋ค์ด ์ 3์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ฉด, ๋น์ ์ ์ด์ ๋งํ์ต๋๋ค. ๋๋ ๋ถ๋ชจ์๊ฒ
$dispatch()
๋ ๊ฐ๊ธฐ ์ ์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ค๊ฐ์ ์๋ ์ผ๋ถ ๊ตฌ์ฑ ์์์์ ์ด๋ฒคํธ๋ฅผ ์ก์์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ฝ๋๋ฅผ ๋ณด๊ณ ์๋ ๋๊ตฐ๊ฐ๊ฐ ์ด๋ฒคํธ์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ๊ฒ ์ธ์๋ ์๋ฌด ๊ฒ๋ ํ์ง ์๋ ์ด์ ๋ฅผ ์๊ฐํ ์ ์์ผ๋ฏ๋ก ์ฃผ์์ ์ถ๊ฐํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.$emit ๋ฐ ํ ํ๋ฆฟ ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ชจ๋ ๊ณณ์์ ๊ฐ๋จํ๊ณ ์งง์ ์ด๋ฒคํธ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ ์ด๋ฒคํธ์๋
@close="callback
"ํ ํ๋ฆฟ์ ์ฐ๊ฒฐ๋ ๊ณ ์ ํ ์ฝ๋ฐฑ์ด ์์ผ๋ฏ๋ก ์ถฉ๋ํ์ง ์์ต๋๋ค.๋ ํจ๋ฌ๋ค์์ด ๋๊ฐ์ด ์ ์๋ํ ์ ์๋ค๊ณ ์๊ฐํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ๋๋ฑํ๊ฒ ์ทจ๊ธํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์์ ์ด์ ๋ฑ์ผ๋ก ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ "๊ธ๋ก๋ฒ ๋ฒ์ค" ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ฐํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋จ๊ฒจ๋๊ณ ๊ฐ์ฅ ์ ์๋ํ๋ ๊ฒ์ผ๋ก ์ฌ์ฉ์๋ฅผ ์๋ดํ๋ ค๊ณ ํฉ๋๋ค.
๋ํ ๊ธ๋ก๋ฒ ์ํฉ์ ๋ํ ์ฐ๋ ค์ ๋ํด์๋ ๋ง์๋๋ฆฌ๊ณ ์ถ์ง๋ง ์์ง ๊ทํ์ ์ ์ฅ์ ์ถฉ๋ถํ ์ดํดํ๊ณ ์์ง๋ ์์ต๋๋ค.
$dispatch ๋ฐ $broadcast๊ฐ ๊ฐ์ฅ ์ ํฉํ๋ค๊ณ ์๊ฐํ๋ ์๋ฅผ ์ ๊ณตํ ์ ์์ผ๋ฉฐ "์ฐ๋ฆฌ" ์ ๊ทผ ๋ฐฉ์์ด ์ํฉ์ ๊ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ค๊ณ ํฉ๋๋ค.