๐Ÿ’ก์ธ์Šคํ„ด์Šค & ์ปดํฌ๋„ŒํŠธ

sujinยท2021๋…„ 11์›” 2์ผ
1

๋ทฐ

๋ชฉ๋ก ๋ณด๊ธฐ
1/6
post-thumbnail

01. ๋ทฐ ์ธ์Šคํ„ด์Šค

01-1. ๋ทฐ ์ธ์Šคํ„ด์Šค์˜ ์ •์˜์™€ ์†์„ฑ

  • ๋ทฐ๋กœ ํ™”๋ฉด์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์ƒ์„ฑํ•ด์•ผํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„

new Vue({
	...
});
  • ์ƒ์„ฑ์ž : ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜๊ณผ ๊ธฐ๋Šฅ๋“ค์„ ๋ฏธ๋ฆฌ ํŠน์ • ๊ฐœ์ฒด์— ์ €์žฅํ•ด ๋†“๊ณ , ์ƒˆ๋กœ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ์กด์— ํฌํ•จ๋œ ๊ธฐ๋Šฅ๊ณผ ๋”๋ถˆ์–ด ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ํ™•์žฅํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•

01-2. ๋ทฐ ์ธ์Šคํ„ด์Šค ์˜ต์…˜ ์†์„ฑ

  • template : ํ™”๋ฉด์— ํ‘œ์‹œํ•  HTML, CSS ๋“ฑ์˜ ๋งˆํฌ์—… ์š”์†Œ๋ฅผ ์ •์˜ํ•˜๋Š” ์†์„ฑ
  • method : ํ™”๋ฉด ๋กœ์ง ์ œ์–ด์™€ ๊ด€๊ณ„๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ์†์„ฑ, ๋งˆ์šฐ์Šค ํด๋ฆญ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์ด ํ™”๋ฉด์˜ ์ „๋ฐ˜์ ์ธ ์ด๋ฒคํŠธ์™€ ํ™”๋ฉด ๋™์ž‘๊ณผ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • created : ๋ทฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์ž๋งˆ์ž ์‹คํ–‰ํ•  ๋กœ์ง์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ

01-3. ๋ทฐ ์ธ์Šคํ„ด์Šค์˜ ์œ ํšจ ๋ฒ”์œ„

  • el ์†์„ฑ์œผ๋กœ ์ง€์ •ํ•œ
    ํƒœ๊ทธ ์•„๋ž˜ ์˜ค๋Š” ์š”์†Œ๋“ค๋กœ ์ œํ•œ,
    ๋ฐ”๊นฅ์— ์žˆ๋Š” {{ message }}๋Š” ์ธ์‹ํ•˜์ง€ ๋ชปํ•จ

new Vue({
	el : '#app',
  	data :  {
    	message : 'Hello Vue.js!'
  }
});
  <div id="app"></div>
  {{ message }}

01-4. ๋ทฐ ์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„ ์‚ฌ์ดํด

  • ๋ผ์ดํ”„ ์‚ฌ์ดํด: ์ธ์Šคํ„ด์Šค ์ƒํƒœ์— ๋”ฐ๋ผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ๋“ค
  • ๋ผ์ดํ”„ ์‚ฌ์ดํด ๋‹จ๊ณ„: ์ƒ์„ฑ -> ๋ถ€์ฐฉ -> ๊ฐฑ์‹  -> ์†Œ๋ฉธ

  • beforeCreate
    : ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋‚˜์„œ ๊ฐ€์žฅ ์ฒ˜์Œ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋ผ์ดํ”„ ์‚ฌ์ดํด ๋‹จ๊ณ„, data์†์„ฑ๊ณผ metods์†์„ฑ์ด ์•„์ง ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๊ณ , ๋”๊ณผ ๊ฐ™์€ ํ™”๋ฉด ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ

  • created
    : data์†์„ฑ๊ณผ metods์†์„ฑ์— ์ •์˜๋œ ๊ฐ’์— ์ ‘๊ทผํ•˜์—ฌ ๋กœ์ง์„ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ธ์Šคํ„ด์Šค๊ฐ€ ํ™”๋ฉด์š”์†Œ์— ๋ถ€์ฐฉ๋˜๊ธฐ ์ „์ด๊ธฐ ๋•Œ๋ฌธ์— template์†์„ฑ์— ์ •์˜๋œ ๋” ์š”์†Œ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ

  • beforeMount
    : template์†์„ฑ์— ์ง€์ •ํ•œ ๋งˆํฌ์—… ์†์„ฑ์„ render()ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜ ํ›„ el์†์„ฑ์— ์ง€์ •ํ•œ ํ™”๋ฉด ์š”์†Œ์— ์ธ์Šคํ„ด์Šค๋ฅผ ๋ถ€์ฐฉํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋˜๋Š” ๋‹จ๊ณ„

  • mounted
    : el์†์„ฑ์— ์ง€์ •ํ•œ ํ™”๋ฉด ์š”์†Œ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ถ€์ฐฉ๋˜๋ฉด ํ˜ธ์ถœ๋˜๋Š” ๋‹จ๊ณ„

  • beforeUpdate
    : el์†์„ฑ์—์„œ ์ง€์ •ํ•œ ํ™”๋ฉด ์š”์†Œ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ถ€์ฐฉ๋˜๊ณ  ๋‚˜๋ฉด ์ธ์Šคํ„ด์Šค์— ์ •์˜ํ•œ ์†์„ฑ๋“ค์ด ํ™”๋ฉด์— ์ง€ํ™˜

  • updated
    : ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ๋‚˜์„œ ๊ฐ€์ƒ ๋”์œผ๋กœ ๋‹ค์‹œ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋ฉด ์‹คํ–‰๋˜๋Š” ๋‹จ๊ณ„ (๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜ ํ™”๋ฉด์ด ๋‹ค์‹œ ๊ทธ๋ ค์กŒ์„ ๋•Œ ํ˜ธ์ถœ๋จ)

  • beforeDestroy
    : ๋ทฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ํŒŒ๊ดด๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋˜๋Š” ๋‹จ๊ณ„, ์•„์ง ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ

  • destroy
    : ๋ทฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ํŒŒ๊ดด๋˜๊ณ  ๋‚˜์„œ ํ˜ธ์ถœ๋˜๋Š” ๋‹จ๊ณ„, ๋ทฐ ์ธ์Šคํ„ด์Šค์— ์ •์˜๋œ ๋ชจ๋“  ์†์„ฑ์ด ์ œ๊ฑฐ๋˜๊ณ  ํ•˜์œ„์— ์„ ์–ธํ•œ ์ธ์Šคํ„ด์Šค๋“ค ๋˜ํ•œ ๋ชจ๋‘ ํŒŒ๊ดด๋œ๋‹ค



02. ๋ทฐ ์ปดํฌ๋„ŒํŠธ

02-1. ์ปดํฌ๋„ŒํŠธ ๋ž€?

  • ์กฐํ•ฉํ•˜์—ฌ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ธ”๋ก

02-2. ์ปดํฌ๋„ŒํŠธ ๋“ฑ๋กํ•˜๊ธฐ

  • ์ „์—ญ ์ปดํฌ๋„ŒํŠธ
Vue.component('์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„', {
	// ์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ
});
  • ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ : ์ธ์Šคํ„ด์Šค component ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋“ฑ๋กํ•  ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„๊ณผ ๋‚ด์šฉ์„ ์ •์˜
new Vue({
	components: {
		'์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„' :  ์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ
	}	
});

02-3. ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ์™€ ์ „์—ญ ์ปดํฌ๋„ŒํŠธ์˜ ์ฐจ์ด

<div id="app">
        <h3>์ฒซ ๋ฒˆ์งธ ์ธ์Šคํ„ด์Šค ์˜์—ญ</h3>
        <!-- ์ „์—ญ ์ปดํฌ๋„ŒํŠธ ํ‘œ์‹œ -->
        <my-component></my-component> 
        <!-- ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ ํ‘œ์‹œ -->
        <my-local-component></my-local-component> 
</div>
 <hr>
<div id="app2">
    <h3>๋‘๋ฒˆ์งธ ์ธ์Šคํ„ด์Šค ์˜์—ญ</h3>
    <!-- ์ „์—ญ ์ปดํฌ๋„ŒํŠธ ํ‘œ์‹œ -->
    <my-component></my-component> 
    <!-- ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ ํ‘œ์‹œ -->
    <my-local-component></my-local-component> 
</div>

<script>
    //์ „์—ญ ์ปดํฌ๋„ŒํŠธ ๋“ฑ๋ก
    Vue.component('my-component' ,{
        template: '<div>์ „์—ญ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค!</div>'
    });

    //์ง€์—ญ ์ปดํฌ๋„ŒํŠธ ๋“ฑ๋ก
    var cmp = {
        template:'<div>์ง€์—ญ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค!</div>' //์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ
    };

    new Vue({
        el:'#app',
        components:{ // ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ ๋“ฑ๋ก
            'my-local-component': cmp
        }
    });
    new Vue({
        el:'#app2' 
    });
</script>	

  • ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ๊ฐ ๊ณ ์œ ํ•œ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค
  • ๋”ฐ๋ผ์„œ ๋ทฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด์—์„œ ์ •์˜ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ผ์•ผํ•œ๋‹ค
  • ์ƒ์œ„(๋ถ€๋ชจ) - ํ•˜์œ„(์ž์‹) ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ๋ฒ•์„ ์“ด๋‹ค



03. ๋ทฐ ์ปดํฌ๋„ŒํŠธ ํ†ต์‹ 

03-1. ์ƒํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๊ด€๊ณ„

  • ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ๊ฐ ๊ณ ์œ ํ•œ ์œ ํšจ ๋ฒ”์œ„๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋ทฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด์—์„œ ์ •์˜ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.
  • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ๋ฒ•์€ ์ƒ์œ„(๋ถ€๋ชจ)-ํ•˜์œ„(์ž์‹)์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ๋ฒ•์ด๋‹ค.

03-2. ์ƒ์œ„์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ

  • props๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์†์„ฑ
Vue.component('child-component', {
	porps:['props ์†์„ฑ ์ด๋ฆ„'],
});      
<child-component v-bind:props ์†์„ฑ ์ด๋ฆ„ = "์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ data ์†์„ฑ"></child-component> 	      

โ˜ v-bind ๋ž€??

  • ์•„์ด๋””, ํด๋ž˜์Šค, ์Šคํƒ€์ผ ๋“ฑ์˜ HTML์†์„ฑ ๊ฐ’์— ๋ทฐ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์—ฐ๊ฒฐ
  • 'v-bind:' ๋ฌธ๋ฒ•์„ ':'๋กœ ๊ฐ„์†Œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
<p v-bind:id = "idA">์•„์ด๋”” ๋ฐ”์ธ๋”ฉ</p>
<p v-bind:class = "classA">ํด๋ž˜์Šค ๋ฐ”์ธ๋”ฉ</p>
<p v-bind:style = "styleA">์Šคํƒ€์ผ ๋ฐ”์ธ๋”ฉ</p>
<script>
	new Vue({
		el: '#app',
		data: {
		   idA: 10,
		   classA: 'container',
		   styleA: 'color:blue'
		}	
	});
</script> 
   <div id="app">
        <child-component v-bind:propsdata ="message"></child-component>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        Vue.component('child-component',{
            props : ['propsdata'],
            template:'<p>{{propsdata}}</p>',
        });

        new Vue({
            el: '#app',

            data:{
                message: 'Hello Vue!'
            }
        });
    </script>

03-3. ํ•˜์œ„์—์„œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋ฒคํŠธ ์ „๋‹ฌํ•˜๊ธฐ

  • ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ
// ์ด๋ฒคํŠธ ๋ฐœ์ƒ							      
this.$emit('์ด๋ฒคํŠธ๋ช…');							      
							      
// ์ด๋ฒคํŠธ ์ˆ˜์‹ 
<child-component v-on:์ด๋ฒคํŠธ๋ช… = "์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉ”์„œ๋“œ๋ช…"></child-component>							      
  • $emit()์„ ํ˜ธ์ถœํ•˜๋ฉด ๊ด„ํ˜ธ ์•ˆ์— ์ •์˜๋œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • $emit()์„ ํ˜ธ์ถœํ•˜๋Š” ์œ„์น˜๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ๋งค์„œ๋“œ ๋‚ด๋ถ€์ด๋‹ค. ๋”ฐ๋ผ์„œ $emit()์„ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” this๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • ํ˜ธ์ถœํ•œ ์ด๋ฒคํŠธ๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ํƒœ๊ทธ์—์„œ v:on์œผ๋กœ ๋ฐ›๋Š”๋‹ค.
  • ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ช…์„ v-on: ์†์„ฑ์— ์ง€์ •ํ•˜๊ณ , ์†์„ฑ์˜ ๊ฐ’์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋  ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋งค์„œ๋“œ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
<div id="app">
    <child-component v-on:show-log ="printText"></child-component>
</div>

<script>
    Vue.component('child-component',{
        template:'<button v-on:click="showLog">show</button>',
        methods:{
            showLog : function(){
                this.$emit('show-log');
            }
        }
    });

    new Vue({
        el: '#app',

        methods: {
            printText: function(){
                alert('receive an event');
            }
        }
    });
</script>					    					   				    

03-4. ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ํ†ต์‹ 

  • ๋ทฐ๋Š” ์ƒ์œ„์—์„œ ํ•˜์œ„๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ํ†ต์‹  ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ์˜† ์ปดํฌ๋„ŒํŠธ์— ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ ค๋ฉด ํ•˜์œ„์—์„œ ๊ณตํ†ต ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ ํ›„ ๊ณตํ†ต ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ 2๊ฐœ์˜ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— props๋ฅผ ๋‚ด๋ ค ๋ณด๋‚ด์•ผํ•œ๋‹ค
  • ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ํ•ด์•ผํ•˜๋Š” ์ด์œ ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ณ ์œ ์˜ ์œ ํšจ๋ฒ”์œ„ ๋•Œ๋ฌธ์ด๋‹ค
  • ์ด๋Ÿฐ ํ†ต์‹  ๊ตฌ์กฐ๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š” ์—†์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ฐ™์€ ๋ ˆ๋ฒจ ๊ฐ„์— ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ•์ œ๋กœ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‘์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋ฒคํŠธ ๋ฒ„์Šค๊ฐ€ ์žˆ๋‹ค.

03-5. ๊ด€๊ณ„ ์—†๋Š” ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ํ†ต์‹  - ์ด๋ฒคํŠธ ๋ฒ„์Šค

  • ์ด๋ฒคํŠธ ๋ฒ„์Šค(Event Bus) ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•œ 2๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ์ด๋ฒคํŠธ ๋ฒ„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์„ ๋‹ด๋Š” ์ธ์Šคํ„ด์Šค์™€๋Š” ๋ณ„๊ฐœ๋กœ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค 1๊ฐœ ๋” ์ƒ์„ฑํ•˜๊ณ , ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ›๋Š”๋‹ค.
  • .$emit() ๋Š” ๋ณด๋‚ด๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ, .$on() ๋Š” ๋ฐ›๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ตฌํ˜„ํ•œ๋‹ค.
<div id="app">
    <child-component></child-component>
</div>

<script>
    var eventBus = new Vue(); // ์ด๋ฒคํŠธ ๋ฒ„์Šค๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ์ธ์Šคํ„ด์Šค 1๊ฐœ ์ƒ์„ฑ
    Vue.component('child-component', {
        template:'<div>ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์˜์—ญ์ž…๋‹ˆ๋‹ค.<button v-on:click="showLog">show</button></div>',
        methods: {
            showLog: function(){
                eventBus.$emit('triggerEventBus', 100); // ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๋Š” ์ปดํฌ๋„ŒํŠธ
            }
        }
    });
    var app = new Vue({
        el: '#app', 
        created: function(){
            eventBus.$on('triggerEventBus', function(value){ // ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๋Š” ์ปดํฌ๋„ŒํŠธ
                console.log("์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ ๋ฐ›์Œ. ์ „๋‹ฌ ๋ฐ›์€ ๊ฐ’:" , value);
            });
        }
    });
  </script>					      					            



์ฐธ๊ณ  do it vue.js

profile
๊ฐœ๋ฐœ๋Œ•๋ฐœ

0๊ฐœ์˜ ๋Œ“๊ธ€