[Vue.js] Vue.js v-bind

v-bind

Vue.js 에서 HTML을 구성하는 요소에 값을 설정할 때 사용하는 지시자이다. 속성, css, form 등 다양한 요소 값을 설정할 수 있다.

컴포넌트에 변화가 있을 때 사용하면 좋다. 아래 예시는 마우스가 이미지 안으로 들어왔을 때와 아닐 때 경우에 따라 크기가 바뀌는 모습을 보여준다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://unpkg.com/vue"></script>
<script>
	window.onload = function(){
		var vm1 = new Vue({
			el : '#test1',
			data : {
				str1 : '문자열',
				link : 'https://wch18735.github.io',
				vue_link : 'https://kr.vuejs.org',
				img_src : './image/logo.png',
				img_width : '200'
			},
			methods : {
				setImageWidth200 : function(){
					this.img_width = '200'
				},
				setImageWidth300 : function(){
					this.img_width = '300'
				}
			}
		})
	}
</script>
</head>
<body>

	<div id='test1'>
		<h3></h3>
		<a v-bind:href='link'>v-bind link setting</a>
		<a :href='vue_link'>
			<img alt="" v-bind:src='img_src' :width='img_width' v-on:mouseenter='setImageWidth300' v-on:mouseleave='setImageWidth200'/><br/>
		</a>
	</div>

</body>
</html>

CSS 클래스 바인딩 (v-bind:class)

HTML 클래스 속성에 CSS 클래스를 바인딩 할 수 있다. 상황에 따라 유동적으로 바인딩 할 수 있으며 이를 이용해 다양한 효과를 구현하는 것이 가능하다.

Vue 객체가 관리하는 특정 태그에 클래스를 삽입해 효과를 적용하는 것이다. 기존에는 <div class="???"> 을 통해 수동 삽입했으나 CSS 클래스 바인딩을 사용하면 이를 간편하게 적용할 수 있으며 유지 보수 역시 원할하게 진행할 수 있다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://unpkg.com/vue"></script>

<style>
	.css1 {
		background-color : yellow;
	}
	
	.css2 {
		color : red;
	}
	.css3 {
		background-color : red;
	}
	.css4 {
		background-color : yellow;
	}
</style>

<script>
	window.onload = function(){
		var vm1 = new Vue({
			el : '#test1',
			data : {
				css1Name : 'css1',
				css2Name : 'css2',
				isCss1 : false,
				isCss2 : false
			},
			methods : {
				reset : function(){
					this.css1Name = 'css1';
					this.css2Name = 'css2';
				},
				setCss1 : function(){
					this.css1Name = 'css3'
					this.css2Name = 'css4'
				},
				setCss2 : function(){
					if(this.isCss1 == true) {
						this.isCss1 = false;
						this.isCss2 = false;
					} else {
						this.isCss1 = true;
						this.isCss2 = true;
					}
				}
			}
		})
	}
</script>

</head>
<body>

	<div id='test1'>
		<h3 class='css1 css2'>기존 방식의 css 삽입</h3>
		<h3 v-bind:class='css1Name'>css binding</h3>
		<h3 v-bind:class='[css1Name, css2Name]'>여러 css class binding</h3>
		<button type='button' v-on:click='setCss1'>css1 변경</button>
		<button type='button' v-on:click='reset'>reset</button>
		
		<!-- isCss1 값이 true 이면 css 적용 / false 이면 적용 X -->
		<h3 v-bind:class='{css1:isCss1}'>문자열</h3>
		<h3 v-bind:class='{css1:isCss1, css2:isCss2}'>문자열</h3>
		<h3 v-bind:class='[isCss1 ? css1Name : "", isCss2 ? css2Name : ""]'>문자열</h3>
		<button type='button' v-on:click='setCss2'>css toggle</button>
		
	</div>

</body>
</html>

inline Style binding

inline style 은 태그 내부에 적용되는 스타일이다. css class 로 지정되지 않은 형태로도 다양한 값들이 설정될 수 있는데, Vue 객체는 inline style 값 역시 삽입, 수정이 가능하다.

background-color 와 같이 - 가 붙는 지시자는 빼기로 받아들이기 때문에 v-bind:style 과 함께 쓰일 때는 카멜 케이스 형식을 따라 backgroundColor 로 표기해야 한다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://unpkg.com/vue"></script>
<script>
	window.onload = function(){
		var vm1 = new Vue({
			el : '#test1',
			data : {
				bgcolorValue : 'red',
				colorValue : 'yellow',
				styleValue : {
					backgroundColor : 'red',
					color : 'yellow'
				}
			},
			methods : {
				setInlineStyle : function(){
					this.bgcolorValue = 'yellow'
					this.colorValue = 'red'
				}
			}
		})
	}
</script>
</head>
<body>

	<div id='test1'>
		<h3 style='background-color:red; color:yellow'>문자열</h3>
		<h3 v-bind:style='{backgroundColor : bgcolorValue, color:colorValue}'>문자열</h3>
		<h3 v-bind:style='styleValue'>객체를 이용한 inline 세팅</h3>
		<button type='button' v-on:click='setInlineStyle'>inline css 변경</button>
	</div>

</body>
</html>

form 바인딩

HTML 에서 사용하는 다양한 입력 요소들에 대해 바인딩이 가능하다. 사용자가 값을 입력하면 지정된 변수에 값을 자동으로 설정할 수 있다. v-model 로 사용자가 입력한 값을 바인딩할 변수를 설정한다.

이 때, 수식어를 활용하면 다양한 효과를 적용할 수 있다. v-model 에 아래 수식어를 설정해서 직접 어떤 효과가 일어나는지 확인해보자.

  • lazy : 입력을 완료했을 때 (포커스를 잃었을 때) 변수에 바인딩
  • number : 사용자가 입력한 값이 숫자로만 구성되어 있을 경우 숫자로 변환해 바인딩
  • trim : 사용자가 입력한 값 좌우에 공백이 있을 경우 공백을 제거하고 바인딩
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://unpkg.com/vue"></script>
<script>
	window.onload = function(){
		var vm1 = new Vue({
			el : '#test1',
			data : {
				input1 : '초기값',
				input2 : '초기값',
				input3 : false,
				input4 : true,
				input5 : false,
				input6 : false,
				input7 : false,
				input8 : false,
				input9 : 'r2',
				input10 : '',
				input11 : '',
				input12 : '',
				input13 : ''
			},
			methods : {
				checkType : function(){
					alert(typeof(this.input12))
				}
			}
		})
	}
</script>
</head>
<body>

	<div id='test1'>
		<h3>Input Type Text</h3>
		<input type='text' v-model='input1'/><br/>
		<h3>input1 : </h3>
		
		<hr/>
		<h3>Text Area</h3>
		<textarea v-model='input2'></textarea><br/>
		<pre>input2 : </pre>
		
		<hr/>
		<h3>CheckBox</h3>
		<input type='checkbox' v-model='input3'/>체크박스1<br/>
		<input type='checkbox' v-model='input4'/>체크박스2<br/>
		<input type='checkbox' v-model='input5'/>체크박스3<br/>
		<h3>input3 : </h3>
		<h3>input4 : </h3>
		<h3>input5 : </h3>
		
		<hr/>
		<h3>CheckBox Value</h3>
		<input type='checkbox' v-model='input6' value='100'/>체크박스100<br/>
		<input type='checkbox' v-model='input7' value='200'/>체크박스200<br/>
		<input type='checkbox' v-model='input8' value='300'/>체크박스300<br/>
		<h3>input6 : </h3>
		<h3>input7 : </h3>
		<h3>input8 : </h3>
		
		<hr/>		
		<h3>RadioButton</h3> <!-- v-model 이 같은 것들이 함께 엮임 -->
		<input type='radio' v-model='input9' value='r1'>라디오1<br/>
		<input type='radio' v-model='input9' value='r2'>라디오2<br/>
		<input type='radio' v-model='input9' value='r3'>라디오3<br/>
		<h3>input9 : </h3>
		
		<hr/>
		<h3>Select Tag</h3> <!-- value 속성 지정하지 않으면 option tag 내부 문자열을 데이터로 사용 -->
		<select v-model='input10'>
			<option>항목1</option>
			<option>항목2</option>
			<option value='item3'>항목3</option>
			<option value='item4'>항목4</option>
			<option value='item5'>항목5</option>
		</select>
		<h3>input10 : </h3>
		
		<hr/>
		<input type='text' v-model.lazy='input11'><br/>
		<h3>input11 : </h3>
		
		<input type='text' v-model.number='input12'/><br/>
		<h3>input12 : </h3>
		<button type='button' v-on:click='checkType'>타입 체크</button><br/>
		
		<input type='text' v-model.trim='input13'/><br/>
		<pre>[]</pre>
	</div>

</body>
</html>

Updated:

Leave a comment