✔️Vue Instance 속성 – methods, filter, computed, watch
: vue 2.x에서는 따로 쓰이지만 3.x로 가면 setup으로 한 번에 묶어서 쓰임
📌methods
: Vue Instance는 생성과 관련된 data 및 method의 정의 가능
method안에서 data를 “this.데이터이름” 으로 접근 가능
method안에서 this변수를 쓸 경우, arrowfunction 쓸 수 없다
<body>
<div id="app">
<div>{{message}}</div>
<div>{{eng()}}</div>
<div>{{kor()}}</div>
</div>
<script>
new Vue({
el: "#app",
data: function () {
return {
message: "안녕??",
name: "모두의 향연",
}
},
methods: {
eng: function () {
return "Hello" + this.name;
},
kor() {
return "안녕" + this.name;
}
},
})
</script>
</body>
- 함수를 써서 log로 찍어보기
<body>
<div id="app">
<div>count:{{count}}</div>
</div>
<script>
let vm = new Vue({
el: "#app",
data: {
count: 1
},
methods: {
inCount() {
console.log("inCount 호출됨" + this.count);//1
this.count++
}
}
});
vm.inCount();
console.log(vm.count);//2
</script>
</body>
💡html에서는 {{변수명}}, {{함수이름}} / script의 vue내에서는 변수든 함수든 this로 접근 / script의 vue밖에선 vue명.변수명 or 함수이름
- 유효성 체크 만들어보기
<body>
<div id="app">
<div>메서드 테스트</div>
<label for="userid">아이디:</label>
<input type="text" id="userid" v-model="userid">
<br />
<label for="username">이름:</label>
<input type="text" id="username" v-model="username">
<br />
<button @click="checkVal">확인</button>
</div>
<script>
let vm = new Vue({
el: "#app",
data: {
userid: "",
username: "",
},
methods: {
checkVal: function () {
if (!this.userid) {
alert("아이디 입력!");
return;
} else if (!this.username) {
alert("이름 입력!")
} else {
this.register();
}
},
register: function () {
console.log("서버에 전송합니다.");
}
}
});
</script>
</body>
💡label의 for는 클릭의 유효 범위, input 태그의 id값과 같은 값 써주기
📌filter
: 화면에 표시되는 텍스트의 형식을 쉽게 변환해주는 기능, 표현식에 새로운 결과 형식을 적용, 보간법 [ {{ }} ] 또는 v-bind 속성에서 사용이 가능, 금액처럼 포맷을 사용할 때 주로 쓰임, chining가능!
보간법: {{ 변수이름 | 필터이름}} or {{ 변수이름 | 필터1 | 필터2}}(체이닝)
v-bind표현: <div v-bind:id="id" | format"></div>
💡filter-전역 필터
:Vue.filter('필터이름',(val)=>{});
Vue.filter('filter1', (val) => {
if (val.length == 0) {
return;
}
return `${val} : ${val.length}자`;
});
💡filter-지역 필터
:Vue객체 안에 filters라는 속성을 이용
filters:{필터이름(val,필터초기값){ }};
let vm = new Vue({
el: "#app",
data: {
msg: "",
},
filters: {
filter2(val, alternative) {
if (val.length == 0) {
return alternative;
}
return `${val} : ${val.length} 자`;
}
}
});
- 전체 코드(포맷처럼 일정한 글자 나오게 함)
<body>
<div id="app">
<div><input type="tel" v-model="msg"></div>
<div>
<h2>결과:</h2>
<h2>{{msg | filter1}}</h2>
<h2>{{msg | filter2('문자를 넣어보세요')}}</h2>
</div>
</div>
<script>
Vue.filter('filter1', (val) => {
if (val.length == 0) {
return;
}
return `${val} : ${val.length}자`;
});
let vm = new Vue({
el: "#app",
data: {
msg: "",
},
filters: {
filter2(val, alternative) {
if (val.length == 0) {
return alternative;
}
return `${val} : ${val.length} 자`;
}
}
});
</script>
</body>
- 금액(원/', '), 전화번호('-'): 정규식 이용
<body>
<div id="app">
<div>
금액 : <input type="text" v-model="msg1" /><br />
전화번호 : <input type="text" v-model="msg2" />
</div>
<h3>{{ msg1 | price | won}}</h3>
<h2>{{ msg2 | tel}}</h2>
</div>
<script>
Vue.filter('price', (val) => {
if (!val) return val;
return val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
});
Vue.filter("won", (val) => {
return `${val}원`;
});
Vue.filter('tel', (val) => {
if (!val || !(val.length === 10 || val.length === 11)) return val;
return val.replace(/^(\d{3})(\d{3,4})(\d{4})/g, '$1-$2-$3');
});
let vm = new Vue({
el: "#app",
data: {
msg1: "",
msg2: "",
},
});
</script>
</body>
📌computed
: 특정 데이터의 변경사항을 실시간으로 처리(함수와 비슷하지만 변경된 데이터만 호출한다는 점이 다름),
캐싱(저장)을 이용하여 데이터의 변경이 없을 경우 캐싱된 데이터를 반환 >> 값처럼 인식,
Setter와 Getter를 직접 지정할 수 있음,
작성은 method 형태로 작성하지만 Vue에서 proxy 처리하여 property처럼 사용,
인스턴스가 갖고 있는 data를 이용할 때 사용,
꼭 return이 있어야 한다(명사처럼 사용)
computed | method |
Vue 인스턴스가 생성될 때, data의 값을 받아 계산 하여 저장해 놓는다(캐싱), 한 번 실행하는 것과 같음 | 함수를 사용할때마다 계산함 |
<body>
<div id="app">
<input type="text" v-model="msg">
<p>원본 메시지:{{msg}}</p>
<p>역순으로 표시한 메시지1: {{reverseMsg()}}</p>
<p>역순으로 표시한 메시지2: {{reverseMsg()}}</p>
<p>역순으로 표시한 메시지3: {{reverseMsg()}}</p>
<p>원본 메시지:{{msg}}</p>
<p>역순으로 표시한 메시지1: {{ reversedMsg }}</p>
<p>역순으로 표시한 메시지2: {{ reversedMsg }}</p>
<p>역순으로 표시한 메시지3: {{ reversedMsg }}</p>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
msg: '안녕하세요 여러분?',
},
methods: {
reverseMsg: function () {
console.log("거꾸로 찍기(method)");
return this.msg.split('').reverse().join('');
},
},
computed: {
reversedMsg: function () {
console.log("거꾸로 찍기(computed)");
return this.msg.split('').reverse().join('');
}
}
});
</script>
</body>
📌 watch
: Vue Instance의 특정 property 가 변경될 때 실행할 콜백 함수 설정(watch보다 computed 사용을 권장함)
watch: { 바뀔 변수: function(바뀔변수, 이전변수){ }}}
<body>
<div id="app">
<div>
<input type="text" v-model="a">
</div>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
a: 1,
},
watch: {
a: function (val, oldVal) {
console.log('new: %s,old: %s', val, oldVal);
},
},
});
console.log(vm.a);
vm.a = 2;
console.log(vm.a);;
</script>
</body>
- 특정 변수가 변하면 다른 변숫값도 변하는(나는 여기서 data의 변수의 값에 this.radius로 하면 안 되나? 이 생각함:NaN오류)
<body>
<div id="app">
<h2>watch</h2>
<div>반지름: {{radius}} 원의넓이:{{area}} 원의둘레:{{round}}</div>
</div>
<script>
new Vue({
el: '#app',
data() {
return {
radius: 2,
area: 3.14 * 2 ** 2,
round: 2 * 3.14 * 2,
};
},
watch: {
radius: function (n, o) {
this.area = 3.14 * this.radius ** 2;
this.round = 2 * 3.14 * this.radius;
}
}
})
</script>
</body>
💡computed VS watch의 차이(위 코드를 computed로 바꿔서 코드 작성)
: computed는 종속된 data가 변경되었을 경우 그 data를 다시 계산하여 캐싱/
watch의 경우는 특정 data가 변경되었을 경우 다른 data를 (변경하는) 작업을 함(변수의 값이 변경→watch의 변수의 값이 변경→원래 변수의 값 변경)
<body>
<!-- <div id="app">
<h2>watch</h2>
<div>반지름: {{radius}} 원의넓이:{{area}} 원의둘레:{{round}}</div>
</div>
<script>
new Vue({
el: '#app',
data() {
return {
radius: 2,
area: 3.14 * 2 ** 2,
round: 2 * 3.14 * 2,
};
},
watch: {
radius: function (n, o) {
this.area = 3.14 * this.radius ** 2;
this.round = 2 * 3.14 * this.radius;
}
}
})
</script> -->
<div id="app">
<h2>computed</h2>
<div>반지름: {{radius}} 원의넓이:{{area}} 원의둘레:{{round}}</div>
</div>
<script>
new Vue({
el: '#app',
data() {
return {
radius: 2,
};
},
computed: {
area: function (n, o) {
return 3.14 * this.radius ** 2;
},
round: function () {
return 2 * 3.14 * this.radius;
}
}
})
</script>
</body>
'front-end > Vue.js' 카테고리의 다른 글
Vue.js 컴포넌트 (0) | 2022.07.11 |
---|---|
Vue.js 이벤트 (0) | 2022.07.08 |
Vue.js개요, 인스턴스, 디렉티브 (0) | 2022.07.07 |
map마커 만들기 (0) | 2022.05.24 |
vue Bootstrap설정하기 (0) | 2022.05.13 |