포스트

Vue의 문법

Vue의 문법

Vue의 문법

Text Interpolation

1
<p>Message: </p>
  • 데이터 바인딩의 기본적인 형태
  • 이중 중괄호 구문
  • msg 속성 변경시 업데이트
  • 이걸 출력하기 위해서는 v-html 사용 필요
1
2
<div v-html="rawHtml"></div>;
const rawHtml = ref('<span style="color:red">This should be red.</span>');

Directive

‘v-’ 접두사가 있는 특수 속성

  • Directive의 속성 값을 단일 JS 표현식
  • 값 변경시 DOM에 반응적 업데이트 적용

조건에 따른 <p> 구문 출력

1
<p v-if="seen"> Hi there</p>

D - Arguments

  • 일부 directive는 뒤에 콜론 표시 인자를 사용 가능
1
2
3
<a :href="myUrl">Move to url</a>
<p :[dynamicattr]="dynamicValue">Dynamic Attr</p>
<button :disabled="isOk" @click="pushOk">확인</button>
  • . 은 특수 접미사로 directive가 특별한 방식으로 바인딩 되어야함을 나타냄 <form @submit.prevent ="onSubmit"> ... </form>

Dynamically data binding

v-bind

하나 이상의 속성 또는 컴포넌트 데이터를 표현식에 동적 바인딩

1
<img v-bind:src = "imageSrc">
  • 객체를 class에 전달하여 클래스의 동적 전환
1
2
const isAcive = ref(false)
<div :class = "{ active : isActive}">Text</div>

그 외 다양한 방식 지원…

Event Handling

v-on

1
v-on:event = "handler"
  • 핸들러의 종류
    • Inline handlers : 이벤트 트리거 실행 될 JavaScript 코드
    • Method handlers : 컴포넌트에 정의된 메서드 이름
    • 약어 @ 로도 사용이 가능

Computed()

  • 계산된 속성을 정의하는 함수
  • 미리 계산된 속성을 사용하여 표현식의 단순화와 불필요한 반복 연산을 줄인다.
  • 반복되는 값은 ref이다.
    1
    2
    3
    4
    
    const restOfTodos = computed(() => {
      console.log("computed Call!");
      return todos.value.length > 0 ? "아직 남았다" : "퇴근!";
    });
    
  • computed 속성은 의존된 반응형 데이터를 자동 추적
  • 의존 데이터 변경 될 때 재평가
    • restOfTodos의 계산은 todos에 의존
    • todos가 바꿀때만 업데이트

computed와 method의 차이

  • computed 속성은 의존형 반응형 데이터 기반 cache
  • conputed 는 의존 데이터 변경시에만 재평가
  • method은 렌더링이 발생할 때마다 항상 함수를 실행
  • 서로 조합하며 사용하자

Conditional, List

v-if

  • 조건문임
1
2
3
4
5
6
7
8
9
10
 <!-- if else -->
      <p v-if="isSeen">true일때 보여요</p>
      <p v-else>false일때 보여요</p>
      <button @click="isSeen = !isSeen">토글</button>

      <!-- else if -->
      <div v-if="name === 'Alice'">Alice입니다</div>
      <div v-else-if="name === 'Bella'">Bella입니다</div>
      <div v-else-if="name === 'Cathy'">Cathy입니다</div>
      <div v-else>아무도 아닙니다.</div>
  • 일반적으로 diretive이기에 template 요소에 적용해 여러 요소에 적용 가능
    1
    2
    3
    4
    5
    
    <!-- v-if on <template> -->
    <template v-if="name === 'Cathy'">
      <div>Cathy입니다</div>
      <div>나이는 30살입니다</div>
    </template>
    
    • template란? : JS를 위한 보이지 않은 wrapper
  • v-show 와는 뭐가 다르지?
    • v-show는 항상 렌더링 되어 DOM에 남아있음
    • css display 속성 전환으로 핸들링 됨
    • 상대적으로 if에 비해 토글 비용이 낮다.
  • v-if는 false의 경우 아무 작업도 수행하지 않는다.

v-for

소스 데이터 기반 요소 템플릿 여러번 렌더링

1
2
3
<div v-for="(item, index) in myArr">
	 / 
</div>
  • 배열 반복

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    const myArr = ref([
                { name: "Alice", age: 20 },
                { name: "Bella", age: 21 },
    ]);
    
    <ul>
      <template v-for="item in myArr">
        <li></li>
        <li></li>
        <hr />
      </template>
    </ul>
    
  • 객체 반복

    1
    2
    3
    4
    5
    6
    7
    8
    
    const myObj = ref({
      name: "Cathy",
      age: 30,
    });
    
    <div v-for="(value, key, index) in myObj">
       /  / 
    </div>;
    
  • template을 활용한 v-for
    1
    2
    3
    4
    5
    6
    7
    8
    
    <!-- v-for on <template> -->
    <ul>
    	<template v-for="item in myArr">
    	<li></li>
    	<li></li>
    	<hr />
    	</template>
    </ul>
    
  • 상위객체에 대한 접근이 가능한 중첩 for문도 가능하다.
  • 반드시 v-for와 key를 함께 사용한다.

    1
    2
    3
    4
    5
    6
    7
    8
    
    const items = ref([
    	{ id: id++, name: "Alice" },
    	{ id: id++, name: "Bella" },
    ]);
    
    <div v-for="item in items" :key="item.id">
    	 - 
    </div>
    
  • 동일 요소에 v-for와 v-if를 함께 사용하지 않는다.
    • 우선순위는 v-if > v-for이다.
    • 즉 v-for의 todo 요소를 v-if에 적용 불가 ```jsx

    <li v-for=”todo in todos” v-if=”!todo.isComplete” :key=”todo.id”>

    </li> ```

해결법

  • 반복과 조건을 함께 할때는 computed를 활용 할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    
    const completeTodos = computed(() => {
    		return todos.value.filter((todo) => !todo.isComplete);
    });
    
    <li v-for="todo in completeTodos" :key="todo.id">
      		
    </li>
    
  • v-for와 template 요소를 사용하여 v-if를 이동

    1
    2
    3
    
    <template v-for="todo in todos" :key="todo.id">
    	<li v-if="!todo.isComplete"></li>
    </template>
    

Watchers

  • 반응형 데이터 감시 및 콜백 함수 호출

    1
    2
    3
    
    watch(variable, (newValue, oldValue) => {
    	//로직
    }
    
    • variable
      • 감시 하는 변수
    • newValue
      • 감시하는 변수의 변화된 값
      • 콜백 함수의 첫번째 인자
    • oldValue
      • 콜백 함수의 두번째 인자

    watch 예시

    1
    2
    3
    4
    5
    6
    
    const countWatch = watch(count, (newValue, oldValue) => {
    		console.log(`newValue: ${newValue}, oldValue: ${oldValue}`);
    });
    
    <button @click="count++">Add 1</button>
    <p>Count: 9</p>
    

    Untitled

  • deep을 사용해서 깊은 감시가 가능하다.

computed vs Watchers

Untitled

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.