vue.js 스타일 가이드
필수
컴포넌트 이름은 합성어로 (App 제외)
웬만하면 약어는 쓰지 말자
todo (x)
TodoItem(o)
컴포넌트 데이터는 무조건 함수로 함
data 값이 오브젝트일 경우 컴포넌트의 모든 인스턴스가 공유. 그런데 각 컴포넌트가 자체 데이터를 관리하게끔 하려면 고유한 data 객체를 생성해야 하는데 함수안에서 객체를 반환하는 방법으로 해결하면 됨
// 오브젝트
data: {
listTitle: '',
todos: []
}
// 함수
data: function () {
return {
listTitle: '',
todos: []
}
}
v-for에 키값 지정해야 함
키는 각각의 노드에 고유한 아이디를 지정해줌. key 값을 사용하면 특정 엘리먼트만 업데이트할 수 있음. (최적화 가능, 링크 참고하기)
// bad
<ul>
<li v-for="todo in todos">
</li>
</ul>
// good
<ul>
<li
v-for="todo in todos"
:key="todo.id"
>
</li>
</ul>
v-for랑 v-if 동시에 사용하지 말기
만약 꼭 써야되는경우 목록 자체를 필터링해서 할것
// bad
<ul>
<li
v-for="user in users"
v-if="user.isActive"
:key="user.id"
>
<li>
</ul>
// good
<ul>
<li
v-for="user in activeUsers"
:key="user.id"
>
<li>
</ul>
강추
싱글 파일 컴포넌트 파일 이름
파일네임은 케밥케이스 아니면 파스칼케이스로 작성할 것. 그런데 파스칼케이스가 더 나음. 그리고 템플릿에다가도 파스칼케이스를 쓰자. 헷갈리니까… (단, 돔 템플릿은 약간 다른데 이건 돔 템플릿 사용할때 찾아보기)
// bad
components/
|- mycomponent.vue
components/
|- myComponent.vue
// Good
components/
|- MyComponent.vue
components/
|- my-component.vue
웬만하면 접두사 붙일 것
부모가 있는 자식컴포넌트의 경우 부모이름을 접두사로 붙인다. 이름은 상위레벨부터 작성하고 마지막은 설명적인 단어로 끝낸다.
// bad
components/
|- MyButton.vue
|- VueTable.vue
|- Icon.vue
// good
components/
|- BaseButton.vue
|- BaseTable.vue
|- BaseIcon.vue
components/
|- AppButton.vue
|- AppTable.vue
|- AppIcon.vue
components/
|- VButton.vue
|- VTable.vue
|- VIcon.vue
내용을 전달받지 못한 컴포넌트는 셀프 클로징
<MyComponent/>
여러개의 속성이 있으면 여러줄로 쓰자
줄 하나에 하나씩
// Bad
<img src="https://vuejs.org/images/logo.png" alt="Vue Logo">
<MyComponent foo="a" bar="b" baz="c"/>
// Good
<img
src="https://vuejs.org/images/logo.png"
alt="Vue Logo"
>
<MyComponent
foo="a"
bar="b"
baz="c"
/>
뭐든 계산해야하는건 템플릿에다 적지말자
템플릿에다 하면 복잡해짐. 심플한 코드와 재사용성을 위해 computed나 filter로…
복잡한 계산은 최대한 간단한 계산으로 분할할 것
쉬운 테스트, 가독성, adaptable 때문이라도 분할하기
// Bad
computed: {
price: function () {
var basePrice = this.manufactureCost / (1 - this.profitMargin)
return (
basePrice -
basePrice * (this.discountPercent || 0)
)
}
}
//Good
computed: {
basePrice: function () {
return this.manufactureCost / (1 - this.profitMargin)
},
discount: function () {
return this.basePrice * (this.discountPercent || 0)
},
finalPrice: function () {
return this.basePrice - this.discount
}
}
비어있지않은 HTML 속성은값은 “” 안에 집어넣을것
// Bad
<input type=text>
<AppSidebar :style={width:sidebarWidth+'px'}>
// Good
<input type="text">
<AppSidebar :style="{ width: sidebarWidth + 'px' }">
코드 일관성 유지하기
Directive shorthands (: for v-bind: and @ for v-on:) 쓸거면 쓰고 말거면 말기. 섞어서 쓰지 말자.
그밖에 알면 있으면 좋을것들
컴포넌트 옵션 순서
el, components, filters, extends, mixins, props, propsData, data, computed, watch, lifecycle, method 순서로… 더 많지만 자세한 내용은 여기 참고 클릭
element 속성 순서
is, v-for, v-if, v-show, v-choak, v-pre, v-once, id, ref, key, slot, v-model, v-on, v-html, v-text