본문 바로가기

FrontEnd/java script

[java script] Vue.js 컴포넌트

728x90
반응형

1. 컴포넌트란?

   ▷ 부품으로 정리할 때 component를 사용합니다.

 

 

◎ 컴포넌트를 만들어 표시하는 예제

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>vue.js sample</title>
		
		<link rel="stylesheet" href="style.css" >
		<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
	</head>
	
	<body>
		<h2>컴포넌트를 만들어서 표시하는 예제</h2>
		<div id="app">
			<my-component></my-component>
			<my-component></my-component>
			<my-component></my-component>
		</div>

		<script>
			var MyComponent = {
				template: '<p class="my-comp">Hello</p>'
			}
			new Vue({
				el: '#app',
				components: {
					'my-component': MyComponent
				}
			})
		</script>
		
		<style>
			.my-comp {
				width: 300px;
				background-color: #ffffe0;
				border: solid;
				border-color: darkorange;
				border-radius: 8px;
				padding: 8px;
			}
		</style>
	</body>
</html>
(1) HTML부
<my-component></my-component> → 준비된 컴포넌트가 표시됩니다.

(2) script부
<script>
	var MyComponent = {
    // var Component 오브젝트명
    
		template: '<p class="my-comp">Hello</p>'
	}
	new Vue({
		el: '#app',
		components: {
			'my-component': MyComponent
             // 'Component 태그명' : Component 오브젝트명
                
		}
	})
</script>


위와 같은 방법으로 사용하면 됩니다.


결과는 아래와 같은 방법으로 출력됩니다.

 

 

◎ 컴포넌트의 data를 function으로 만들기(각각 다른 카운팅 하는 컴포넌트) 예제

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>vue.js sample</title>
		
		<link rel="stylesheet" href="style.css" >
		<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>

	</head>
	
	<body>
		<h2>각각 다른 카운팅을 하는 컴포넌트 예제</h2>
		<div id="app">
			<my-component></my-component>
			<my-component></my-component>
			<my-component></my-component>
		</div>

		<script>
			var MyComponent = {
				template: '<p class="my-comp">카운터 <button v-on:click="addOne">추가</button>{{ count }} </p>',
				data: function(){
					return {
						count:0
					}
				},
				methods: {
					addOne: function(){
						this.count++;
					}
				},
			}
			new Vue({
				el: '#app',
				components: {
					'my-component': MyComponent
				}
			})
		</script>

		<style>
			.my-comp {
				width: 300px;
				background-color: #ffffe0;
				border: solid;
				border-color: darkorange;
				border-radius: 8px;
				padding: 8px;
			}
		</style>
		
	</body>
</html>

 

2. props 옵션 : HTML의 태그에서 값을 받아 전달하는 것입니다.

 

// script 부분 : 카멜 케이스
props: {
	myName: String
}

// HTML 부분 : 케밥 케이스
<my-component my-name="철수"><my-component>
위의 형식과 같은 방식으로 연결을 해줘야 컴포넌트가 실행됩니다.

my-name과 같은 형식으로 작성해야합니다. my는 변경하면 안됩니다.

 

 

◎ 컴포넌트에 값을 전달하는 예제(props 사용)

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>vue.js sample</title>
		<link rel="stylesheet" href="style.css" >
		<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
	</head>
	
	<body>
		<h2>컴포넌트에 값을 전달하는 예제</h2>
		<div id="app">
			<my-component my-name="철수"></my-component>
			<my-component my-name="영희"></my-component>
			<my-component></my-component>
		</div>
		
		<script>
			var MyComponent = {
				template: '<p class="my-comp">나는 {{myName}}입니다.</p>',
				props:{
					myName: String
					//전달할 매개체는 myName이고 스트링 형입니다.
				},
				created: function(){
					// Vue.js 라이프사이클에서 인스턴스가 작성된 후

					if(this.myName == null){
						this.myName = "이름없음";
					}
				}
			}

			new Vue({
				el: '#app',
				components: {
					'my-component': MyComponent
				}
			})
		</script>

		<style>
			.my-comp {
				width: 300px;
				background-color: #ffffe0;
				border: solid;
				border-color: darkorange;
				border-radius: 8px;
				padding: 8px;
			}
		</style>
	</body>
</html>
script부의 template의 class="my-comp"는 다른 이름으로 변경하면 style 적용이므로 굳이 작성하지 않아도 됩니다.

컴포넌트 연결을 위해서는 굳이 'my-변수'와 같이 작성하지 않아도 위의 html과 연결됩니다.
   ex) my, compo 등등

대신 관련된 부분을 모두 바꿔야 합니다.

props는 전달할 매개체의 형태를 지정합니다.

component가 이해하기에는 좀 어렵네요,,ㅎ

 

위의 예제에서 html부를 수정하고 script의 data만 추가하면 배열이 적용됩니다.

 

1. html부
<my-component v-for="(item, index) in myArray" v-bind:my-name="item" ></my-component>

2. script부
data: {
	myArray:['철수','영희','광수','병수','이슬']
},

 

마지막으로 실습 예제를 풀어보겠습니다!

 

◎ 컴포넌트를 사용해 1~10까지 출력해 해당 숫자가 짝수인지 홀수인지를 출력하세요

   ▷ 배열로 받은 숫자의 값을 컴포넌트 안에서 홀수/짝수를 계산하세요(computed 사용)

 

 

<!DOCTYPE html>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
	<link rel="stylesheet" href="style.css" >
	<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body>
	<h2>컴포넌트를 숫자로 출력</h2>
	<div id="app">
		<my-component v-for="i in myArray" v-bind:my-num="i"></my-component>
	</div>
    
	<script>
		var MyComponent = {
			template: '<p>{{ result }}</p>',
			props:{
				myNum: Number,
				result: String
			},
			created: function(){
				if(this.myNum % 2 == 0){
					this.result = this.myNum + "은 짝수 입니다.";
				} else{
					this.result = this.myNum + "은 홀수 입니다.";
				}
			}
		}

		new Vue({
			el:'#app',
			data:{
				myArray:[1,2,3,4,5,6,7,8,9,10] 
			},
			components:{
				'my-component':MyComponent
			}
		})
	</script>
</body>
</html>
<!DOCTYPE html>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
	<link rel="stylesheet" href="style.css" >
	<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body>
	<h2>컴포넌트를 숫자로 출력</h2>
	<div id="app">
		<my v-for="i in 10" v-bind:my-num="i"></my>
	</div>

	<script>
		var My = {
			template: '<p>{{myNum}} 은 {{myText}} 입니다.</p>',
			props:{
				myNum: Number,
				myText: String
			},
			created: function(){
				if(this.myNum % 2 == 0){
					this.myText = "짝수";
				} else{
					this.myText = "홀수";
				}
			}
		}

		new Vue({
			el:'#app',
			components:{
				'my':My
			}
		})
	</script>
</body>
</html>
배열을 따로 만들어서 데이터를 입력받거나, for문을 사용하는 두가지 방법 다 사용할 수 있습니다.

 

컴포넌트가 연결되는 것은 눈으로 확인했지만, 컴포넌트에 대해 확실히 이해하지는 못한 것 같아서 공부를 해서 다시 글을 올려야겠어요!!

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

 

728x90
반응형