Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

dearbeany

[Vue] 라이프사이클 | 뷰 인스턴스 옵션(methods, filter, computed, watch) 본문

Vue.js

[Vue] 라이프사이클 | 뷰 인스턴스 옵션(methods, filter, computed, watch)

dearbeany 2022. 10. 31. 16:54

▪ 각 Vue 인스턴스는 생성될 때 일련의 초기화 단계를 걸친다.

  • 데이터 관찰 설정이 필요한 경우
  • 템플릿을 컴파일 하는 경우
  • 인스턴스를 DOM에 마운트 하는 경우
  • 데이터가 변경되어 DOM을 업데이트 하는 경우 등.

▪ 그 과정에서 사용자 정의 로직을 실행할 수 있는 Life Cycle Hooks도 호출

▪ 4개 파트 (생성, 부착, 갱신, 소멸)로 나뉜다.

▪ 모든 Life Cycle Hooks은 자동으로 this 컨텍스트를 인스턴스에 바인딩하므로 데이터, 계산된 속성(computed) 및 메소드에 접근할 수 있다. (화살표 함수를 사용해 라이프 사이클 메소드를 정의하면 X)

 

    <div id="app">
        <div>{{count}}</div>
        <button @click="count++">증가</button>
    </div>
    <!-- 인스턴스의 유효범위가 아님-->
    <div>
        <div>{{count}}</div>
    </div>
    <script>
        const app = new Vue({
            el: "#app",
            data() {
                return {
                    count: 0,
                };
            },
            beforeCreate(){
                console.log('beforeCreate count : ' + this.count);
            },
            created(){
                console.log('created count : ' + this.count);
                console.log('created에 연결된 DOM : ' + this.$el);
            },
            beforeMount(){
                console.log('beforeMount count : ' + this.count);
                console.log('beforeMount에 연결된 DOM : ' + this.$el); 
            },
            mounted(){
                console.log('mounted count : ' + this.count);
                console.log('mounted에 연결된 DOM : ' + this.$el); 
            },
            beforeUpdate(){
                console.log('beforeUpdate 호출');
            },
            updated(){
                console.log('updated 호출');
                console.log('updated count : ' + this.count);
            },
            // 파괴는 따로 하지는 않겠다. 
        });
    </script>

- mounted 가 끝났을 때 확실히 연결되었다 (beforeMount때는 연결이 될려고 한다.)

- 증가 버튼 클릭 시 updated를 호출하면서 카운트된다

 

 

 

1. Vue Method 

- method 안에 data를 this.데이터이름 으로 접근 (메소드 안의 this는 뷰인스턴스다!)

    <div id="app">
        <button @click="greet">인사</button>
    </div>
    <script>
        const app = new Vue({
            el: "#app",
            data() {
                return {
                    msg : "Hello!",
                    name : "dearbeany"
                };
            },
            methods : {
                greet() {
                    // 메서드 안에서 사용하는 this는 Vue인스턴스이다.
                    // 템플릿 리터럴
                    alert(`${this.msg} ${this.name}님`);
                },
            },
        });
    </script>

- 템플릿 리터럴 방법(문자열끼리 +로 이어주지 않아도 됨)으로 작성

버튼 클릭 시 뜨는 창

 

 

 

 

 

2. Vue Filters 

- 필터 : 무언가를 썼을 때 알아서 글자를 필터링 해줌

- 텍스트 형식화를 적용할 수 있는 필터를 지원. {{ }} 구문 또는 v-bind속성에서 사용 가능.

- JS표현식 마지막 '|' 심볼과 함께 추가돼야 함. 체이닝 가능

 

ⓛ 전역필터 등록 : Vue가 가지는 filter에 등록

    <div id="app">
        <div>
            <input type="text" v-model="msg" />
        </div>
        <div>
            <h3>{{ msg | count1 }}</h3>
        </div>
    </div>
    <script>
        Vue.filter(
            'count1', (val) => {
                if(val.length === 0) return;
                return `${val} : ${val.length}자`;
            }
        )
        const app = new Vue({
            el: "#app",
            data() {
                return {
                    msg : '',
                };
            },
        });
    </script>

 

응용으로 글자수세기 만들 수 있다.

 

② 지역필터 : filters 옵션 안에 메소드로 작성. 인스턴스 안에 지역필터로 등록해놨기에 사용 가능

    <div id="app">
        <div>
            <input type="text" v-model="msg" />
        </div>
        <div>
            <h3>{{ msg | count2('입력바람') | count3}}</h3>
        </div>
    </div>
    <script>
        const app = new Vue({
            el: "#app",
            data() {
                return {
                    msg : '',
                };
            },
            filters : {
                // 지역필터
                count2(val, alternative){
                    if(val.length === 0) return alternative;
                    return  `${val} : ${val.length}`;
                },
                count3(val){ // 체이닝 확인
                    return  `${val} 글자`;
                }
            }
        });
    </script>

 

 

 

 

3. Vue Computed 

- 특정 데이터의 변경사항을 실시간으로 처리할 수 있음

- 캐싱을 이용하여 데이터의 변경이 없을 경우 캐싱된 데이터를 반환

- 이미 변경한 내용을 다시 쓰도록 한다

- method 형식으로 작성하지만 그 결과는 하나의 속성처럼 사용하겠다. (그래서 쓸 때 {{ 메소드 호출X 속성처럼 사용 }})

    <div id="app">
      <div>
        <input type="text" v-model="msg" />
        <p>원본 메시지 : {{ msg }} </p>
        <p>역순으로 표시한 메시지1 : {{ reversedMsg }} </p>
        <p>역순으로 표시한 메시지2 : {{ reversedMsg }} </p>
        <p>역순으로 표시한 메시지3 : {{ reversedMsg }} </p>
      </div>
    </div>
    <script>
      const app = new Vue({
        el: '#app',
        data() {
          return {
            msg: '안녕하세요',
          };
        },
        computed : {
            reversedMsg(){
                console.log('거꾸로 뒤집기');
                return this.msg.split('').reverse().join('');
            },
        },
      });
    </script>

computed : console에 1번 출력된다

    <div id="app">
      <div>
        <input type="text" v-model="msg" />
        <p>원본 메시지 : {{ msg }} </p>
        <p>역순으로 표시한 메시지1 : {{ reversedMsg() }} </p>
        <p>역순으로 표시한 메시지2 : {{ reversedMsg() }} </p>
        <p>역순으로 표시한 메시지3 : {{ reversedMsg() }} </p>
      </div>
    </div>
    <script>
      const app = new Vue({
        el: '#app',
        data() {
          return {
            msg: '안녕하세요',
          };
        },
        methods : {
            reversedMsg(){
                console.log('거꾸로 뒤집기');
                return this.msg.split('').reverse().join('');
            },
        },
      });
    </script>

methods : console에 3번 출력된다

* computed 와 methods

- 결과적으로 둘 다 최종 결과는 같다.

- computed : 종속 대상을 계산해 저장해놈 (캐싱). 즉, 캐싱을 이용하여 종속된 대상 변경되지 않는 한 computed에 작성된 함수를 여러 번 호출해도 계산 다시 하지 않고 계산되어있는 결과를 반환

- methods : 렌더링 다시 할 때마다 항상 함수를 실행

 

 

 

 

4. Vue watch 

- 지켜보고 있다가 변경되면 그 때 실행한다 (데이터를 감시)

- Vue Instance의 특정 property가 변경될 때 실행할 callback 함수 설정

    <div id="app">
      <div>
        <input type="text" v-model="msg">
        <p>원본 메시지: {{msg}} </p>
        <p>역순 메시지: {{reversedMsg}} </p>
      </div>
    </div>
    <script>
      const app = new Vue({
        el: '#app',
        data() {
          return {
            msg: 'hello',
            reversedMsg : '',
          };
        },
        watch: {
          msg(newVal){
            this.reversedMsg = newVal.split('').reverse().join('');
          },
        },
      });
    </script>

watch

* computed와 watch

- computed : 특정 데이터를 직접 사용/가공해 다른 값으로 만들 때 사용

  계산해야 하는 목표 데이터를 정의하는 방식으로 SW공학에서 이야기 하는 '선언형 프로그래밍' 방식

- watch : 특정 데이터의 변화 상황에 맞춰 다른 data등이 바뀌어야 할 때 주로 사용.

  감시할 데이터 정하고 그 데이터 바뀌면 이런 함수를 실행하라는 방식으로 SW공학 '명령형 프로그래밍 방식'

 

 

더보기

ES6

var : 재선언 O 재사용 O -> 호이스팅 가능

let : 재선언 X 재사용 O -> 호이스팅 불가

const : 재선언 X 재사용 X -> 호이스팅 불가

 

Property Shorthand : key와 value가 똑같다면 줄여서 쓰는 거 가능

Concise Method : 객체 안에 메소드 쓸 때

Destructuring : 객체(배열, 객체)에 입력된 값을 개별적인 변수에 할당하는 간편 방식 제공