Vue.js: Vue 문법 Ep.3 클래스와 스타일 바인딩

클래스와 스타일 바인딩


Vue.js: 클래스와 스타일 바인딩

HTML 클래스 바인딩

<template>
  <h1 
    :class="{ active: isActive }"
    @click="activate">
    Hello?!()
  </h1>
</template>

<script>
export default {
  data() {
    return {
      isActive: false
    }
  },
  methods: {
    activate() {
      this.isActive = true
    }
  }
}
</script>

<style scoped>
  .active {
    color: red;
    font-weight: bold;
  }
</style>

class로 active를 추가하고 싶은데 class의 이름은 isActive의 영향을 받는다. boolean 데이터 true면 class에 active가 추가되고, false이면 class에 active가 추가될 수 없는 구조이다.

현재 isActive default 값이 false로 style이 적용되지 않는다.
h1태그를 클릭하게 되면 메소드 activate로 인해 isActive의 값이 true로 변경된다. isActive 값이 true가 되면서 class 값 active가 활성화되어 style이 적용된다.

  • 바인딩 객체 인라인

    바인딩 객체는 인라인``일 필요가 없다!

    <div :class="classObject"></div>
    
    data() {
      return {
        classObject: {
          active: true,
          'text-danger': false
        }
      }
    }
    

    데이터 옵션에 객체 데이터로 데이터를 만들어서 데이터를 연결해서 사용할 수 있다. 연결해야 하는 클래스의 내용이 많은 경우에는 위와 같은 방식이 조금 더 효율적이다.

  • 계산된 데이터도 바인딩할 수 있다.
  • 배열 구문

    배열을 :class에 전달하여 클래스 목록을 적용할 수 있다.
    배열로 특정한 클래스들을 추가할 수 있다.

    <div :class="[activeClass, errorClass]"></div>
    
    data() {
      retrun {
        activeClass: 'active',
        errorClass: 'text-danger'
      }
    }
    

    결과

    <div class="active text-danger"></div>
    

    일반적인 경우에 유용하다고 할 수는 없지만 배열구문을 통해서도 클래스 부분의 데이터를 연결해서 사용할 수도 있다.

인라인 스타일 바인딩

인라인 방식을 통해서 스타일을 작성할 때, 데이터를 바인딩해서 작성할 수 있는 방식이다.

스타일 속성앞에 콜론기호를 사용해서 데이터를 연결해주고 하나의 객체데이터를 연결한다.

<div :style="{ color: activeColor, fontSize: fontSize + 'px'}"></div>
data() {
	return {
		activeColor: 'red'
		fontSize: 30
	}
}

해당 코드의 결과로는 color에는 red가 들어가고 fontSize에는 30px이 들어가게 된다.

CSS 속성 이름(fontSize 등)에는 카멜 케이스 혹은 케밥 케이스(대쉬, 케밥 케이스는 따옴표를 함께 사용)를 사용할 수 있다.

  • 객체에 직접 바인딩

    템플릿을 더 깔끔하게 만들귀 위해서는 스타일 객체에 직접 바인딩 하는 것이 좋다.

    <div :style="styleObject"></div>
    
    data() {
      return {
        styleObejct: {
          color: 'red',
          fontSize: '13px'
        }
      }
    }
    

Vue.js: Vue 문법 Ep.2

Computed


<template>
  <section v-if="hasFruits">
    <h1>Fruits</h1>
    <ul>
      <li
        v-for="fruit in fruits"
        :key="fruit">
        
      </li>
    </ul>
  </section>
</template>

<script>
export default {
  data() {
    return {
      fruits: [
        'Apple', 'Lemon', 'Grape'
      ]
    }
  },
  computed: {
    hasFruit() {
      return this.fruits.length > 0
    }
  }
}
</script>

computed는 한마디로 말해서 계산된 데이터이다.

계산된 데이터(computed)는 데이터 옵션에 정의해둔 특정한 데이터(fruits)를 추가적으로 어떤 연산(this.fruits.length > 0)을 통해서 정의를 한다. 이 정의된 값을 반환해서 사용할 수 있는 새로운 데이터(hasFruit)이다.

hasFruit은 fruits 배열 데이터의 길이가 0보다 커야만 반복문을 사용하여 데이터 값을 출력하도록 한다.
여기서, fruits 배열 데이터에 아무 값도 존재하지 않다면 h1 태그(제목) 또한 출력되지 않는다.

computed 사용 예시

<template>
  <section>
    <h1>Reverse Fruits</h1>
    <ul>
      <li
        v-for="fruit in reverseFruits"
        :key="fruit">
        
      </li>
    </ul>
  </section>
</template>

<script>
export default {
  data() {
    return {
      fruits: [
        'Apple', 'Lemon', 'Grape'
      ]
    }
  },
  computed: {
    reverseFruits() {
      return this.fruits.map(fruit => {
        return fruit.split('').reverse().join('')
      })
    }
  }
}
</script>

reverseFruits의 계산은 다음과 같다.
‘Apple’ ⇒ [‘A’,’p’,’p’,’l’,’e’] ⇒ [‘e’,’l’,’p’,’p’,’A’] ⇒ ‘elppA’
배열 데이터 fruit를 각 알파벳으로 쪼개고 해당 배열을 뒤짚은 다음에 다시 이어준다.

Computed 캐싱


  • 캐싱하지 않은 코드

    메소드를 불러올 때 마다 계산을 한다.
    즉, 같은 값을 계속 불러와도 같은 연산을 계속 반복하여 값을 출력하는 것이다.

    <template>
      <h1></h1>
      <h1></h1>
      <h1></h1>
    </template>
      
    <script>
    export default {
      data() {
        return {
          msg: 'Hello Computed!'
        }
      },
      methods: {
        reverseMessage() {
          return this.msg.split('').reverse().join('') 
        }
      }
    }
    </script>
    
  • 계산된 데이터 (캐싱)

    마치 데이터처럼 적용을 하면 된다.

    computed 옵션 부분에 만들어 둔 계산된 데이터는 캐싱이라는 기능이 있기 때문에 한번 연산을 해 놓은 값이 있으면 반복적으로 화면에 데이터처럼 출력할 때, 다시 한번 연산하지 않는다.

    캐싱이 되어져 있기 때문에 저장된(캐싱된) 값으로 해당하는 내용을 출력해준다.
    첫번째만 연산을 실행하고 그 이후의 두번째, 세번째, … 100번째는 연산을 진행하지 않고 첫번째 연산에서 찾은 값을 저장해 두었다가 출력한다.

    <template>
      <h1></h1>
      <h1></h1>
      <h1></h1>
    </template>
      
    <script>
    export default {
      data() {
        return {
          msg: 'Hello Computed!'
        }
      },
      computed: {
        reversedMessage() {
          return this.msg.split('').reverse().join('') 
        }
      }
    }
    </script>
    

Getter, Setter


  • Getter

    값을 얻어 내는 것이다.

    computed 옵션에 작성해둔 reversedMessage는 계산된 데이터로, 읽기 전용(Readonly)이다.
    method의 add의 += ‘?!’는 할당연산자로, 어떤 값을 할당하더라도 반응적으로 동작할 수 있는 구조가 아니다.
    즉 reversedMessage는 내부의 기본 로직을 통해서 값을 얻어내는 용도로만 사용한다. 이것이 Getter!

    computed: {
        // Getter 
        reversedMessage() {
          return this.msg.split('').reverse().join('') 
        }
      }
    
  • Setter

    값을 지정하는 것이다.

    computed는 기본적으로 얻어내는 것만 가능하다.
    단, vue.js 문법을 통해서 계산된 데이터 부분의 Setter를 지정해 줄 수 있다.

    computed: {
        reversedMessage: {
          // Getter
          get() {
            return this.msg.split('').reverse().join('') 
          },
          // Setter
          set(value) {
            this.msg = value
          }
        }
      },
      methods: {
        add() {
          this.reversedMessage += '!?'
        }
      }
    

    계산된 데이터 부분에 getter와 setter로 구분되는 방식이 일반적으로 잘 활용되지는 않는다. 단, Vuex(Store, 중앙 집중식 저장소)에 간간히 유용하게 사용할 수 있다.

Watch


특정한 데이터들의 변경사항을 감시하는 용도의 옵션이다.

감시하고 싶은 데이터가 있다면, 해당 데이터를 watch에 하나의 메소드처럼 만들어서 메소드의 로직으로 데이터가 변경되었을 때, 어떤 내용을 실행할지 명시하면 된다.

<script>
export default {
  data() {
    return {
      msg: 'Hello?'
    }
  },
  computed: {
    reversedMessage() {
      return this.msg.split('').reverse().join('') 
    }
  },
  watch: {
    msg(newValue) {
      console.log('msg:', newValue)
    },
    reversedMessage() {
      console.log('reversedMessage:', this.reversedMessage)
    }
  },
  methods: {
    changeMessage() {
      this.msg = 'Good!'
    }
  }
}
</script>

watch를 통해서 msg 데이터는 감시되고 있는 상황이다.
감시가 되어있다가 변경사항이 있으니까, 감시되고 있는 해당 내용(콘솔에 msg 출력)의 로직을 실행한다.

watch는 기존 데이터 뿐만이 아니라 계산된 데이터도 감시가 가능하다.
changeMessage를 통해서 msg의 원본 데이터만 수정하더라도 계산된 데이터 부분의 내용도 변경된다.
따라서 watch의 reversedMessage의 변경이 감시되어 해당 내용의 로직이 실행된다.

Vue.js: Vue 문법 Ep.1

라이프사이클


Vue.js 문법 참고 링크

해당 페이지의 내용을 꼭 참고하여 공부할 것

<template>
  <h1> 8 </h1>
</template>

<script>
export default {
  data() {
    return {
      count: 2
    }
  },
  beforeCreate() {
    console.log("Before Create!!", this.count)
  },
  created() {
    console.log("Created!!", this.count)
    console.log(document.querySelector('h1'))
  },
  beforeMount() {
    console.log("Before Mount!!")
    console.log(document.querySelector('h1'))
  },
  mounted() {
    console.log("Mounted!!")
    console.log(document.querySelector('h1'))
  }
}
</script>
  • beforeCreate

    컴포넌트가 생성되기 직전에 실행 된다. (데이터 정의 전) 그닥 활용도가 활용도가 높지 않다.

  • created

    컴포넌트가 생성된 직후에 실행 된다. 가장 많이 사용되는 라이프사이클 훅(라이프사이클)이다. 컴포넌트가 생성된 직후기 때문에 html 연결되어 있지 않아서 조회 불가능하다.

  • beforeMount

    html과 연결되기 전이기 때문에 html 구조 조회 불가능하다. 실제 사용하는 활용도 떨어진다.

  • mounted

    실제 컴포넌트가 html 구조에 연결되어져 있다. 따라서 html 구조를 조회해서 출력 가능하다. 가장 많이 사용되는 라이프사이클 훅(라이프사이클)이다.

템플릿 문법


Vue.js 템플릿 문법

해당 페이지 내용 참고하기

  • 텍스트 보간법

    텍스트 바인딩의 가장 기본적인 형태, 이중 괄호 문법을 사용한 텍스트 보간법이다.

    • v-once

      html의 속성처럼 사용한다.
      데이터를 화면에 단 한번만 랜더링한다. 데이터가 변경되더라도 갱신하지 않는다.
      즉, 반응성을 가지지 않는다.

      <template>
        <h1 
          v-once
          @click="add">
              
        </h1>
      </template>
      
  • HTML 출력

    이중 중괄호는 데이터를 HTML이 아닌 일반 텍스트로 해석한다. 실제 HTML을 출력하려면 v-html 디렉티브를 사용해야 한다.

    이중 중괄호를 사용해서 데이터를 출력하는 것이 아닌, v-html 디렉티브의 속성이 값으로 데이터를 넣으면 이 부분이 실제 html 문법으로 출력이 된다.

    <template>
      <h1 v-html="msg"></h1>
    </template>
    
  • 속성 바인딩

    이중 중괄호 구문을 html 속성에 사용할 수 없다.
    대신 우리는 v-bind 디렉티브를 사용하여 html 속성 부분에 데이터를 넣는다.

    <template>
      <h1 v-bind:class="msg">
          
      </h1>
    </template>
      
    <script>
    ...
    </script>
      
    <style scoped>
      .active {
        color: royalblue;
        font-size: 80px;
      }
    </style>
    
    • v-bind 단축

      <template>
        <h1 v-bind:class="msg">
              
        </h1>
      </template>
      

      위 코드처럼 작성하고 저장을 누르면 다음과 같이 v-bind가 사라지고 콜론만 남으며 코드가 단축된다.

      <template>
        <h1 :class="msg">
              
        </h1>
      </template>
      
    • v-on 단축

      v-on 디렉티브의 약어는 @로, v-on이 사라지고 @가 생긴다.

      <template>
        <h1 v-on:click="msg">
              
        </h1>
      </template>
      
      <template>
        <h1 @click="msg">
              
        </h1>
      </template>
      
  • 동적 전달 인자

    <template>
      <h1
        :[attr]="active"
        @[event]="add">
          
      </h1>
    </template>
      
    <script>
    export default {
      data() {
        return {
          msg: 'active',
          attr: 'class',
          event: 'click'
        }
      }
    }
    
    • attr에 class

      data에 attr을 만들어 값은 ‘class’를 넣어준다.
      template 부분에서 h1 태그 속성의 class 부분에 attr을 넣어준다.
      해당 태그에 클래스로 msg가 잘 들어가게 되는 것을 볼 수 있다.

      :class=”active”:[attr]=”active”

    • event에 click

      클릭을 했을 때 느낌표가 추가되는 동작에서 template 부분의 click에 event를 넣어준다.
      해당 부분에 click 문자가 잘 들어가게 되면서 클릭할 때 느낌표가 추가되는 것을 볼 수 있다.

      @click=”add”@[event]=”add”

    • 브라우저, active 클릭시 style 적용 취소

      파란색 active 글자를 눌러서 느낌표를 추가하려 할 때, 해당 스타일 적용이 취소되면서 검정 글자에 느낌표가 추가되는 것을 볼 수 있다.

      스타일이 취소되는 이유는 class 이름이 active인데, 이 active가 순수 문자 데이터로 읽혀지지 않게 되기 때문이다. active 글자를 클릭시 class 이름 active에도 느낌표가 추가된다.
      active!!!… 의 클래스의 스타일은 존재하지 않기 때문에 스타일 적용이 취소되는 것이다.

      해당 문제점의 해결 방법은 간단하다. class 이름의 active를 문자열로 인식하게 하는 것이다.
      그렇게 되면, 글자를 클릭해도 active에 느낌표가 추가되지 않고 스타일이 잘 적용되는 것을 볼 수 있다.
      문자열로 바꿔주는 것은 class의 active 부분에 작은 따옴표만 추가해주면 된다.

      :[attr]="active":[attr]="’active’"

Vue.js: Vue 시작하기 Ep.3

선언적 렌더링과 입력 핸들링


  • SFC (Single File Component)

    단일 파일 컴포넌트이다.
    Vue 확장자로 만들어져 있는 하나의 파일을 말한다.

    SFC는 template, script, style 3가지 태그로 구성할 수 있다.
    template에는 html(Vue 문법), script는 JS(Vue 문법), style에는 CSS(SCSS) 내용을 작성한다.

    해당 구조에서 style태그가 필요하지 않으면 삭제해도 된다. 다만, template과 script는 대부분 필요하기 때문에 기본적으로 명시하고 시작하는 것이 좋다.

  • Vue 문법 적용해보기

    <template>
      <h1> 8 </h1>
    </template>
      
    <script>
    export default {
      data() {
        return {
          count: 0
        }
      }
    }
    </script>
      
    <style>
      h1 {
        font-size: 50px;
        color: royalblue;
      }
    </style>
    
    • : 자바스크립트에서 오는 내용이다.
    • data: function()data()로 생략하여 사용할 수 있다.
    • 서버를 열어 해당 내용을 확인할 때 styel 적용이 안된다면?

      style을 적용하지 않으면 내용이 출력되는데 style을 적용했더니 내용이 출력되지 않는 현상이 발생했다.

      이럴때 vue-style-loader 패키지의 버전을 다운그레이드 해준다.
      나 같은 경우는 버전이 4.1.3이었는데 해당 버전으로는 style 적용이 되지 않았다. 4.1.2로 다운그레이드를 해주니 출력이 완료되었다.

      패키지 버전 다운그레이드 하는 방법

      # 패키지 삭제
      npm uninstall 다운그레이드_하려는_패키지명
      # 원하는 버전으로 재설치
      npm install 패키지명@원하는_버전
          
      # 예시
      npm uninstall vue-style-loader
      npm install vue-style-loader@4.1.2
      

      패키지를 다운그레이드를 하려면 현재 가지고 있는 패키지를 삭제한 후, 원하는 버전으로 재설치를 해줘야 한다.

    • 클릭하여 숫자 증가시키기

      <template>
        <h1 @click="increase">
          8
        </h1>
      </template>
          
      <script>
      export default {
        data() {
          return {
            count: 0
          }
        },
        methods: {
          increase() {
            this.count += 1
          }
        }
      }
      </script>
      
      • increase는 숫자를 1씩 증가시켜 준다.
        h1 태그를 클릭하면 increase 함수를 통해 숫자가 1씩 늘어나도록 설정을 해준다.
        h1태그에 click속성을 넣어 값으로 increase 함수를 넣어준다.
      • 여기서 말하는 this는 App.vue 파일의 script 부분을 지칭한다.
        이 this로 data 혹은 methods에 접근할 수 있다.
      • data() ⇒ 데이터를 정의한다.
        methods() ⇒ 함수를 정의한다.
      • 반응성 (Reactivity)

        데이터를 정의( data() )하고 이것을 갱신할 수 있는 핸들러( methods )를 작성했다. 여기서 가장 중요한 것은 count라는 데이터를 갱신하면, 연결되어져 있는 브라우저의 화면도 같이 갱신된다는 것이다. 이것을 반응성이라고 부른다.
        요약하면, 데이터를 갱신하면 화면도 바뀐다! 이다.

조건문과 반복문


  • 조건문 (v-if)

    <template>
      <h1 @click="increase">
        8
      </h1>
      <div v-if="count > 4">
        4보다 큽니다!
      </div>
    </template>
    
    • 조건

      클릭하여 숫자를 증가시킬때, 해당 숫자가 4보다 크면 div의 내용(4보다 큽니다!)를 보여준다.

    • v-if: if 속성이다. 해당 속성의 값으로 원하는 조건을 작성한다.
    • v- 형태를 디렉티브(Directive)라고 부른다.
  • style을 scss로 읽어들이기

    style 태그에 lang 속성의 값으로 scss를 입력해주면 scss로 읽어들인다.

  • 반복문 (v-for)
    • fruits

      script에서 fruits라는 배열 데이터를 생성한다.

    • v-for

      <template>
        <ul>
          <li
            v-for="fruit in fruits"
            :key="fruit">
                
          </li>
        </ul>
      </template>
          
      <script>
      export default {
        data() {
          return {
            fruits: ["Apple", "Baanan", "Cherry"]
          }
        }
      </script>
      

      for 속성이다. 해당 속성의 값으로 원하는 반복 조건을 입력한다.

      fruit in fruits
      나는 조건으로 fruits 배열 데이터를 불러들여 해당 배열안에 존재하는 데이터 값만큼 반복하도록 했다.
      그리고 해당 배열 안의 값을 fruit 변수에 할당했다.

      :key=”fruit”
      데이터를 반복할 때, 각각의 데이터가 고유한지 증명하기 위해서 :key=””형태로 제공해야 한다. 반복을 할 때마다 key안의 값 fruit에 Apple, Banana, Cherry가 들어가게 된다.

      참고!!

      vue.js, react, svelt, angular 같은 모던 웹 프론트엔드 프레임워크들은 데이터를 기반으로 해서 화면이 출력되는 것을 고려해야 한다.

  • 별개의 components로 데이터 출력하기
    • components 폴더에 Fruit.vue 파일 생성
    • Fruit.vue

      props 옵션을 설정한다.
      해당 객체 데이터 내부에는 name 이라는 이름으로 어떤 데이터를 받아낸다. name이라는 데이터의 타입은 String이다.

      노란색 밑줄 발생!
      name이라는 props는 필수로 default value를 제공해야 한다.
      우리는 어떤 데이터를 name에 받아서 사용할 것인데, name에 데이터가 들어오지 않는다면 default 속성에 기본값을 지정해 줄 수 있다.

      <template>
        <li></li>
      </template>
          
      <script>
      export default {
        props: {
          name: {
            type: String,
            default: ''
          }
        }
      }
      </script>
      
    • Fruit.vue 파일 App.vue 파일로 가져오기
      • App.vue

          <template>
            <ul>
              <hello
                v-for="fruit in fruits"
                :key="fruit"
                :name="fruit">
                      
              </hello>
            </ul>
          </template>
                
          <script>
          import Fruit from '~/components/Fruit'
                
          export default {
            components: {
              hello: Fruit
            }
          </script>
        

        script 부분에 import를 사용하여 Fruit 라는 이름으로 파일을 가져온다.

        Fruit 이름으로 가져온 파일을 사용하기 위해서는 components 옵션 부분에 등록을 해줘야 한다. 나는 hello 라는 이름으로 등록해줬다.

        template 부분에 li를 hello로 변경한다.
        key 속성 밑에 name 속성을 작성하고 값은 fruit를 명시한다.

        • Fruit라는 컴포넌트를 만들어서 해당 내용을 App.vue에 가져와서 활용을 한다.
        • 이때 우리가 사용한 name 속성은 Fruit의 props라는 옵션에 작성되어 있다.
          name이라는 이름으로 데이터를 받는데, 해당 데이터 타입이 문자열(String)데이터 이고, 여기에 데이터가 들어오지 않으면 빈 문자를 사용하겠다고 선언했다.

          이렇게 받아진 name이라는 이름으로 데이터를 출력하게 된다.
          이때 출력하는 name 뒤에 내용을 추가하면 해당 내용도 같이 출력된다.

          <template>
            <li> ?! </li>
          </template>
          
    • hello는 직관성이 떨어지니 Fruit로 변경하자

      Fruit로 변경하면 컴포넌트 옵션에서 지정할 때 파일 이름과 지정해준 이름이 동일하다. 이럴때는 이름 하나만 작성해도 된다.

      components: {
        // Fruit: Fruit
        Fruit
        }
      
    • Fruit 파일의 style

      <style lang="scss">
        h1 {
          color: red !important;
        }
      </style>
      

      해당 코드를 작성하고 브라우저 화면을 확인하면 숫자 색상이 빨간색으로 변경되었다.
      이것은 App.vue에 만들어져있는 h1의 해당하는 스타일을 다른 컴포넌트에서 제어한 것이다. 이런 방식은 그닥 효율적이지 못하다.

      • scoped

        style 부분에 scoped라는 속성을 추가한다.
        다시 브라우저를 확인하면 숫자 색상이 파란색으로 변경된 것을 볼 수 있다.

        scoped가 작성된 해당하는 vue 파일의 스타일은 다른 컴포넌트에는 영향을 미치지 않는다.
        현재 파일에 있는 내용에만 영향을 미친다.

        h1은 Fruit 파일에는 존재하지 않으니 다른 컴포넌트인 App.vue에는 영향을 미치지 못하게 된다.

        즉, 해당 스타일이 가진 유효범위는 해당 파일 내에서만 가진다는 것이다.

Vue.js: Vue 시작하기 Ep.2 (ESLint)

ESLint 패키지 설치


  npm i -D eslint eslint-plugin-vue @babel/eslint-parser
  • eslint
  • eslint-plugin-vue
  • @babel/eslint-parser

.eslintrc.js 파일 생성


  module.exports = {
    env: {
      browser: true,
      node: true
    },
    extends: [
      // vue
      // 'plugin: vue/vue3-essential', // Lv1
      'plugin: vue/vue3-strongly-recommended', //Lv2
      // 'plugin: vue/vue3-recommended', // Lv3
  
      // js
      'eslint: recommended'
    ],
    parserOptions: {
      parser: '@babel/eslint-parser'
    },
    rules: {
      
    }
  }
  • env

    브라우저 환경에서 동작하는 전역 개념.
    node.js 환경에서 동작하는 전역 개념들을 모두 코드 검사를 할 것인지 설정한다.

  • extends

    vue.js에 대한 기본적인 코드 규칙

    eslint-plugin-vue 패키지에서 제공하는 기본적인 vue.js의 코드 규칙들이다.
    이 중에서 가장 엄격하게 vue.js 문법을 권장하는 것이 세번째 (Lv3)이다. 우리는 이 3가지중 두번째 규칙을 사용한다.

    js에 대한 기본적인 코드 규칙

    eslint에서 권장하는 코드 규칙을 통해서 js 문법을 검사한다.

    Available rules | eslint-plugin-vue Link
    해당 페이지의 내용을 참고하여 vue.js 규칙들을 원하는 것으로 수정해서 프로젝트를 진행하면 좋다.

    Rules - ESLint - Pluggable JavaScript Linter Link
    해당 페이지는 권장되는 규칙들을 명시해 둔 것이다. 만약 해당 규칙이 마음에 들지 않는다면, 위 페이지를 참고해서 원하는 규칙으로 수정해서 프로젝트를 진행하도록 하자.

  • parserOptions

    기본적인 코드를 분석할 수 있는 분석기를 지정해준다.
    우리는 parser 속성에 babel-eslint 패키지를 입력해서 해당 패키지를 분석기로 지정해준다.

  • rules

    두번째 옵션인 extends 옵션에서 기본적으로 제공하는 코드의 규칙들을 사용했을 때는 따로 작성하지 않아도 된다.
    하지만, 해당 규칙을 다르게 변경해야 할 때 해당 옵션에 규칙을 추가한다.

  • 기본 설정 규칙

    <template>
      <img 
        src="~assets/logo.png" 
        alt="soha"
      >
    </template>
    

규칙 수정하기


  • html-closing-bracket-newline

    기본 설정

    {
    "vue/html-closing-bracket-newline": ["error", {
        "singleline": "never",
        "multiline": "always" // never로 변경
      }]
    }
    

    “singline”: “never” ⇒ 한 줄로 작성하는 것에는 닫히는 괄호를 줄 바꿈 처리 하지 않아도 된다.

    “multiline”: “always” ⇒ 여러 줄로 작성할 때는 닫히는 괄호를 꼭 줄바꿈 처리 해야 한다.
    만약, 여러 줄일때 닫는 괄호를 줄바꿈 처리하고 싶지 않다면 never로 변경하면 된다.

    <template>
      <img 
          src="~assets/logo.png" 
          alt="soha">
    </template>
    
  • html-self-closing

    기본설정

    {
    "vue/html-self-closing": ["error", {
        "html": {
          "void": "never", // always로 변경
          "normal": "always", // never로 변경
          "component": "always"
        },
        "svg": "always",
        "math": "always"
      }]
    }
    

    void: <img> 같이 빈 태그를 지칭한다. 빈 태그 닫는 괄호 앞에 슬래쉬(/)를 넣고 싶다면 never에서 always로 변경하면 된다.

    normal: <div></div> 와 같이 일반적으로 열리고 닫히는 태그를 말한다. 해당 태그 사이에 어떤 content가 존재하지 않다면 해당 태그로 슬래쉬 기호로 종료 <div /> 를 하면 된다고 설정되어 있다.
    해당 설정을 원하지 않다면 never로 변경하면 된다. 그러면 <div /> 로 작성하게 되면 규칙을 벗어났다고 알려준다.

    component: 이전에 <HelloWorld /> 라고 컴포넌트를 작성했던 것처럼(빈 태그처럼) 작성하라고 규칙이 설정되어 있다.

    svg, math: svg와 math 태그도 내용이 없으면 빈 태그로 작성하도록 규칙이 설정되어져 있다.

    <template>
      <img 
        src="~assets/logo.png" 
        alt="soha" />
      <div></div>
    </template>
    
  • 에러 문법 규칙 자동 수정

    vscode에서 settings 검색 한후, settings.json 파일을 열어 해당 내용을 추가한다.

    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true
      }
    

    vscode의 editor에서 파일을 저장하게 되면, 저장된 파일의 소스코드를 eslint 규칙에 맞게 수정한다는 의미이다.

    • <div />가 규칙에 맞지 않음

      <template>
        <img 
          src="~assets/logo.png" 
          alt="soha" />
        <div />
      </template>
      
    • 저장 후, 자동으로 올바른 규칙으로 수정됨

      <template>
        <img 
          src="~assets/logo.png" 
          alt="soha" />
        <div></div> 
      </template>