Home Vue-How-to-1
Post
Cancel

Vue-How-to-1

Vue 문법

<template>

  • html을 작성하는 부분
  • {{ x }} 중괄호 두번으로 script의 데이터를 사용
  • @, :, v-if 와 같은 디렉티브 사용
1
2
3
4
5
6
7
8
9
10
11
12
<template>
  <div
    class="main"
    :class="now">
    <nav>
      <ul>
        <li
          :class="'index'" 
          @click="tab">
          Index
        </li>
    ...

<script>

  • componets
    • 다른 vue 파일을 불러와서 사용
  • data(getter,setter 읽어오기, 쓰기)
    • 변수를 선언하여 사용
  • methods
    • 함수를 선언하여 사용
  • computed(읽기 전용 getter)
    • 계산된 값을 반환하는 함수를 사용
    • get(), set(x)로 읽기, 쓰기 가능
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
<script>
import Index from '~/components/Index'

export default {
  components:{
    Index
  },
  data(){
    return {
      x: 'index'
    }
  },
  computed: {
    cal: {
      get() {
        return this.x.split('').reverse().join('')
      },
      set(v) {
        x += v
      }
    }
  },
  methods:{
    tab(e) {
      this.x = e.target.className
      }
    },
  }
</script>

<style>

  • lang으로 preprocessor 정할 수 있음
  • scoped로 해당 vue파일에만 스타일 적용 가능
1
2
<style lang="scss" scoped>
</style>

Vue 활용

템플릿 문법

{{ }} (Mustaches)

  • 변수의 값을 반환
  • html을 반환할 경우 문자열로 인식(사용 불가)
  • 메서드가 올 경우 메소드명() {{ 메소드() }}
  • 컴퓨 티드가 올 경우 컴퓨티드명 {{ 컴퓨티드명 }}

v-html

  • html을 반환하고 싶은 경우 v-html을 사용
1
<span v-html="변수명"></span>
1
2
3
4
5
data() {
    return {
      변수명: '<span style="color: red">내용 내용</span>'
    }
  }

v-bind

  • 이중 중괄호 {{ }&#125 는 html의 속성에 사용 불가
  • v-bind:속성=”값”을 사용한다
  • 약어 표현 :
1
<div v-bind:id="아이디"></div>

v-on

  • 뒤에 이벤트를 붙여 해당 이벤트를 감시 (이벤트 청취)
  • v-on:focus=”함수”
    • 해당 함수를 이벤트 핸들러라고한다
  • 약어 표현 @
1
2
3
4
5
6
7
8
9
10
<a v-on:click="함수, 함수"> </a>

...
  methods: {
    함수 (event) {
      // 실행할 내용
      // event.target 이벤트 정보
    }
  }
...

이벤트 수식어

  • 이벤트 수식어
    • event.prevntDefault()
    • 수식어로 작성하면 @click.prevent=”함수” 로 작성한다
      • 해당 태그의 기본 동작을 일어나지 않게 한다
      • a의 경우 링크를 타고 넘어가는 기능이 안되게 한다
    • @click.once=”함수” 함수 호출을 한번 하면 끝
      • .prevent.once 는 prevent를 한번만 실행
    • 부모 요소가 자식 요소를 감싸고 있을 때
      • 자식을 클릭하면 부모도 같이 클릭이 된다
        • 이벤트 버블링 (자식 실행 후 부모 실행)
      • 자식에게 event.stopPropagation()으로 버블링 막기
      • 자식에게 @click.stop=”함수” 로 버블링 막기
    • @click.capture=”함수”
      • 버블링의 반대 캡쳐링
      • 자식 요소를 클릭해도 부모 실행 후 자식 실행
    • @click.capture.stop=”함수”
      • 자식 요소를 클릭해도 부모 요소만 실행됨
    • @click.self=”함수”
      • 부모 요소에 줄 경우 자식에 의해 가려진 부분은 제외됨
      • 정확히 부모 요소를 선택해야 부모요소 함수가 실행
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    <template>
      <div @click="A">
        <div @click="B">
        </div>
      </div>
    </template>
    
    <script>
    export default {
      methods: {
        A () {
          console.log('A')
        },
        B () {
          console.log('B')
        }
      }
    }
    </script>
    
    
    • 부모에만 @click이 있을 때
      • 자식요소를 클릭하면
        • event.target = 자식요소(실제 클릭된 요소)
        • event.currentTarget = 부모요소(event가 실행된 함수를 실행한 요소)
      • 부모요소를 클릭하면
        • 두 내용이 같아진다
        • 즉 .self는 두 내용이 같을 때만 실행되도록 한 것
    • @wheel=”함수”
      • 마우스 휠을 돌렸을 때 함수 실행
      • @wheel.passive=”함수” 를 하면 처리 내용과 화면 움직임이 따로 실행
        • 화면, 로직을 따로 실행하므로 버벅거림이 없다

키 수식어

  • @keydown=”함수”
    • event.key는 실제 눌린 key 값이 들어있다
    • @keydown.enter는 엔터가 눌렸을 때 함수를 실행한다
    • @keydown.ctrl.shift.a 세 가지 키를 다 눌렀을 때 실행

v-for

  • 반복문
  • books라는 배열이 있다면
    요소 하나하나 book으로 꺼내서 사용
  • :key=”book” 으로 해당 태그가 고유하다는 것을 명시
  • 두 번째 파라미터를 설정하면 index가 반환
    • v-for=”(book, index) in books”
  • books(배열)의 데이터가 변화되면 바뀐 내용이 화면에 적용됨
    • 반응성이라고 한다
1
2
3
4
5
<li 
  v-for="book in books"
  :key="book">
  
</li>

v-if (v-show)

  • true면 해당 태그가 렌더링 된다
    • v-show는 false일때 display none이 되지만 렌더링은 한다
    • v-if 가 전환 비용이 높다
  • <template> 태그에 적용하고 싶을 때
    • 자식으로 template 태그를 하나 더 만들고 v-if를 사용한다
1
2
3
4
<a 
  v-if="book === 'funny'">
  
</ a>

watch

  • 데이터의 변경사항을 감시
  • x의 내용이 메소드에 의해 변경되었다
  • watch 의 x()가 감지하고 실행된다
  • computed의 값도 감시 가능

  • 첫 번째 매개변수를 정하면 그 값에는 변경된 내용이 들어온다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<script>
export default {
  components:{
  },
  data(){
    return {
      x: 'abc'
    }
  },
  computed: {
    
  },
  watch: {
    x(c) {
      console.log('바뀌었습니다',c) // 바뀐 내용 출력됨
    }
  },
  methods:{
    click() {
      this.x = 'def'
      }
    },
  }
</script>

:class=”객체”

  • isView의 true/false에 따라 view 클래스 적용이 결정된다
  • 여러 클래스를 줄 수 있다
  • 배열로도 줄 수 있다
1
2
3
4
<div :class="{ view : isView }">
</div>
<div :class="{ view : isView, 'cur-status' : isActive }">
</div>
  • 변수에 객체를 넣어서 사용 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
<div class="classObj">
</div>

...
data() {
  return {
    classObj: {
      view : isView,
      'cur-status' : isActive
    }
  }
}
...

:style=””

  • 인라인 스타일로 스타일을 줄 수 있다
  • 바인딩 하여 정의된 스타일을 줄 수 있다
  • 배열로 두 개 이상의 객체를 동시에 사용할 수 있다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div :style="[fontStyle, backgroundStyle]">
</div>

...
data() {
  return {
    fontStyle: {
      color: '#333333',
      fontSize: '16px'
    },
    backgroundStyle: {
      backgroundColor: '#000000'
    }
  }
}
...

느낀점

새로운 방식들이 많지만 편리한 기능인 것 같다 하나의 vue 파일에서 모든 부분을 손볼 수 있어서 좋은 것 같다

This post is licensed under CC BY 4.0 by the author.