본문 바로가기

FrontEnd/java script

[java script] Vue.js 데이터를 사용한 계산(computed)

728x90

1. computed : 데이터의 값을 계산하여 쓸 때 사용하는 산출 프로퍼티

 

예시로 바로 확인해 보겠습니다.

 

<!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">
			<input v-model.number="price" type="number">원
			<p>소비세 포함 금액 {{ taxIncluded }} 원</p>
		</div>

		<script>
			new Vue({
				el: '#app',
				data: {
					price: 100
				},
				computed:{
					taxIncluded: function(){
						return this.price * 1.08;
					}
				}
			})
		</script>
	</body>
</html>
taxIncluded라는 프로퍼티에 계산하는 function을 넣어 반환하는 예시입니다.

아래와 같은 출력 값을 확인할 수 있습니다.

 

 

단가와 개수를 입력해 세금 포함 금액을 계산하는 예제

 

<!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">
		<input v-model.number="price" type="number">원 x
		<input v-model.number="count" type="number">개
		<p>  합계 {{ sum }} 원</p>
		<p>세금포함 {{ taxIncluded }} 원</p>
	</div>

	<script>
		new Vue({
			el: '#app',
			data: {
				price: 100,
				count: 1
			},
			computed:{
				sum: function(){
					return this.price * this.count;
				},
				taxIncluded: function(){
					return this.sum * 1.08;
				}
			}
		})
	</script>
</body>
</html>
sum 함수를 따로 지정하고 그 함수는 다른 함수에서 사용할 수 있습니다.

 

alt + 255 하면 ' ' 값이 들어가는 빈 공간을 하나 생성할 수 있습니다.

 

 

 국, 영, 수 값을 입력받으면 합과 평균을 출력하는 예제

 

<!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">
		<input v-model.number="kor" type="number">점<br>
		<input v-model.number="eng" type="number">점<br>
		<input v-model.number="math" type="number">점<br>
		<p>   총점 {{ sum }} 점</p>
		<p>평균 점수 {{ avg }} 점</p>
	</div>

	<script>
		new Vue({
			el: '#app',
			data: {
				kor: 0,
				eng: 0,
				math: 0
			},
			computed:{
				sum: function(){
					return this.kor + this.eng + this.math;
				},
				avg: function(){
					return this.sum/3;
				}
			}
		})
	</script>
</body>
</html>
위의 예제와 유사한 문제이므로 별도의 코멘트는 추가하지 않겠습니다.

 

 

 문장을 입력하면 남은 글자수를 표시하는 예제

 

<!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">
			<p>감상은 140자 이내로 입력해 주세요.</p>
			<textarea v-model="myText"></textarea>
			<p v-bind:style="{color:computedColor}">남은 글자는 {{ remaining }} 입니다.</p>
		</div>

		<script>
			new Vue({
				el:'#app',
				data:{
					myText:'오늘은 날씨가 좋습니다.'
				},
				computed:{
					remaining: function(){
						return 140 - this.myText.length;
					},
					computedColor: function(){
						col = 'green';
						if(this.remaining < 20){
							col = 'orange';
						}
						if(this.remaining < 1){
							col = 'red';
						}
						return col;
					}
				}
			})
		</script>

	</body>
</html>
남은 글자수가 20자 미만이면 orange, 1자 미만이면 red로 표시되도록 설정했습니다.

v-bind:style="{color:computedColor}"에서 computedColor을 색이 변하는 함수로 지정했습니다.

 

 

<textarea v-model="myText" maxlength="140" resize: none></textarea>

위는 maxlength를 통해 140자를 초과하면 더 이상 입력이 되지 않도록 할 수 있습니다.
resize: none을 통해 textarea의 크기가 변하지 않도록 합니다.

 

 

글자를 입력하면 배열 안의 글자와 매칭해 유사한 글자만 출력하는 예제

 

<!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">
			<input v-model="findWord">
			<ul>
				<li v-for="item in findItems">{{ item }}</li>
			</ul>
		</div>

		<script>
			new Vue({
				el: '#app',
				data: {
					findWord: '',
					items: ['설악산', '한라산', '북한산', '백두산', '지리산']
				},
				computed:{
					findItems: function(){
						if(this.findWord){
							return this.items.filter(function(value){
								return (value.indexOf(this.findWord) > -1);
							}, this);
						} else{
							return this.items
						}
					}
				}
			})
		</script>
	</body>
</html>
이 예제는 filter를 이용한 예제입니다. 하지만 좀 어려워서 하나씩 다뤄보도록 하겠습니다.

1. input에 findWord라는 변수를 연결합니다.
2. findItem이라는 함수를 지정해 filter 기능을 사용합니다.
  ▷ findWord라는 변수에 글자가 없으면 items의 배열이 모두 출력되도록 합니다.(글자가 없으면 0 즉, false가 됩니다.)
  ▷만약 변수에 글자가 있으면 this.findWord는 true가 되면서 필터의 기능이 사용됩니다.
      ▶ items에 있는 배열을 받아와 필터를 적용하고 이 값들은 하나씩 value로 받을 수 있습니다.
      ▶ 그리고 value의 값을 indexOf를 통해 제가 입력한 글자와 비교합니다.
      ▶ 입력한 글자와 매칭되는 값이 있으면 0 이상이 출력되고, 없으면 -1이 출력됩니다.
      ▶ 그렇게 입력받은 값을 return을 통해 filter로 전달하고 this를 통해 findItems에 배열로 저장합니다.
      ▶ return을 2번 사용한 이유는 비교한 글자 값을 필터로 넘길 때, 필터의 글자를 함수에 넘길 때 필요합니다.

 

위의 필터라는 함수는 자바스크립트에서 복잡하게 사용되며 자바에서는 DB를 통해 간단하게 나타낼 수 있다고 합니다. 그래도 이 필터라는 함수를 잘 사용하면 유용할 것 같습니다.

 

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

 

 

728x90