テンプレートの属性と表記を揃える
このルール群では、属性名と並び順、引用符、空白、空の要素の書き方など、テンプレートの表記を確認します。チームで記述を揃えるときや、既存のテンプレートを整理するときに使ってください。
まずは 属性を並べる例と同名の props を省略して渡す例で、変更前後の違いを確認してください。同名の prop バインディングを省略する構文は Vue 3.4 以降が対象です。
採用するルールだけを掲載された設定で有効にし、vp run lint を実行してください。要素の種類ごとの自己終了タグの方針はルールのオプションで指定できます。Vue の全ルールでは、ディレクティブの構文やテンプレートの構造に関する検査も確認できます。
このページに、各ルールの目的・前提・設定と、省略のない悪い例・良い例をまとめています。変更箇所は行の色で示します。コードをコピーすると、ソースコード全体を取得できます。各例に現在の対応範囲も明記しています。
| ルール | 例 | 目的 |
|---|---|---|
vue/attribute-hyphenation |
悪い · 良い | コンポーネントの prop 属性名を設定した形式に揃えます。 |
vue/attribute-order |
悪い · 良い | テンプレートの属性を一定の順に並べます。 |
vue/html-quotes |
悪い · 良い | HTML 属性値の引用符を揃えます。 |
vue/html-self-closing |
悪い · 良い | 要素の種類ごとに自己終了タグの形式を揃えます。 |
vue/mustache-interpolation-spacing |
悪い · 良い | mustache 内の空白を揃えます。 |
vue/no-boolean-attr-value |
悪い · 良い | HTML の真偽属性に不要な値を指定した箇所を検出します。 |
vue/no-inline-style |
悪い · 良い | インラインの style 属性を検出します。 |
vue/no-multi-spaces |
悪い · 良い | 連続する不要な空白を検出します。 |
vue/prefer-props-shorthand |
悪い · 良い | Vue 3.4 の同名 prop バインディングの省略形を使います。 |
vue/prop-name-casing |
悪い · 良い | 宣言する prop 名の形式を揃えます。 |
vue/valid-attribute-name |
悪い · 良い | 有効な属性名を指定します。 |
全ルール · ルールのオプション · ESLint 移行対応表 · プロジェクトの検査 · 子への属性の継承
vue/attribute-hyphenation
コンポーネントの prop 属性名を設定した形式に揃えます。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: 対応している診断で利用できます
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: 型付きオプションと既定値を参照してください。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/attribute-hyphenation": "warn"
}
},
},
});
vp run lint
悪い
コンポーネントの属性名を camelCase の firstName にしています。
<template>
<UserCard firstName="Ada" />
</template>
良い
first-name に変更し、設定されたハイフン区切りの属性名の方針に合わせます。
<template>
<UserCard first-name="Ada" />
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/attribute-order
テンプレートの属性を一定の順に並べます。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/attribute-order": "warn"
}
},
},
});
vp run lint
悪い
構造を決める v-if と通常の id 属性より前に、イベントハンドラーを指定しています。
<template>
<div @click="onClick" v-if="show" id="main"></div>
</template>
良い
v-if、id、イベントハンドラーの順に並べ、ルールの順序に合わせます。
<template>
<div v-if="show" id="main" @click="onClick"></div>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/html-quotes
HTML 属性値の引用符を揃えます。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: 対応している診断で利用できます
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: 型付きオプションと既定値を参照してください。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/html-quotes": "warn"
}
},
},
});
vp run lint
悪い
属性の値にシングルクォートを使うか、クォートを省略しています。
<template>
<div class='foo'></div>
<div class=foo></div>
<div v-if='ready'></div>
</template>
良い
通常の属性とディレクティブの式をダブルクォートで囲みます。
<template>
<div class="foo"></div>
<div v-if="ready"></div>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/html-self-closing
要素の種類ごとに自己終了タグの形式を揃えます。
既定の重大度: warning
プリセット: nuxt, opinionated
自動修正: 対応している診断で利用できます
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: 型付きオプションと既定値を参照してください。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/html-self-closing": "warn"
}
},
},
});
vp run lint
悪い
空のコンポーネントを開始タグと終了タグの組で書き、img と br に設定された自己終了タグの表記を使っていません。
<template>
<MyComponent></MyComponent>
<img>
<br>
</template>
良い
コンポーネントと void 要素を自己終了タグで書きます。内容がある div は終了タグを残します。
<template>
<MyComponent />
<div></div>
<div />
<img />
<br />
<div>content</div>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/mustache-interpolation-spacing
mustache 内の空白を揃えます。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: 対応している診断で利用できます
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: 型付きオプションと既定値を参照してください。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/mustache-interpolation-spacing": "warn"
}
},
},
});
vp run lint
悪い
補間の式と区切りの間で、片側または両側の空白がありません。
<template>
<div>{{text}}</div>
<div>{{ text}}</div>
<div>{{text }}</div>
</template>
良い
式と mustache の開始・終了の区切りの間に、それぞれ空白を入れます。
<template>
<div>{{ text }}</div>
<div>{{ foo.bar }}</div>
<div>{{ foo + bar }}</div>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/no-boolean-attr-value
HTML の真偽属性に不要な値を指定した箇所を検出します。
既定の重大度: warning
プリセット: nuxt, opinionated
自動修正: 対応している診断で利用できます
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-boolean-attr-value": "warn"
}
},
},
});
vp run lint
悪い
真偽属性の disabled と checked に、不要な文字列の値を指定しています。
<template>
<input disabled="disabled" />
<input checked="checked" />
<button disabled="true">Save</button>
</template>
良い
値を付けず、真偽属性があることだけで同じ状態を表します。
<template>
<input disabled />
<input checked />
<button disabled>Save</button>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/no-inline-style
インラインの style 属性を検出します。
既定の重大度: warning
プリセット: nuxt, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-inline-style": "warn"
}
},
},
});
vp run lint
悪い
静的な style 属性に色の宣言を直接書いています。
<template>
<div style="color: red">Text</div>
</template>
良い
固定した色にはクラスを使います。ratio に依存する幅の動的な style は、静的属性の検査の対象外です。
<template>
<div class="text-red">Text</div>
<span :class="{ 'text-red': isRed }">Text</span>
<div :style="{ width: `${ratio}%` }">Text</div>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/no-multi-spaces
連続する不要な空白を検出します。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: 対応している診断で利用できます
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/no-multi-spaces": "warn"
}
},
},
});
vp run lint
悪い
属性同士や、要素名と最初の属性の間に空白が二つあります。
<template>
<div class="panel"></div>
<div class="panel" id="main"></div>
</template>
良い
同じ class と id 属性を保ち、属性間の連続した空白を一つの空白に揃えます。
<template>
<div class="panel"></div>
<div class="panel" id="main"></div>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/prefer-props-shorthand
Vue 3.4 の同名 prop バインディングの省略形を使います。
既定の重大度: warning
プリセット: nuxt, opinionated
自動修正: 対応している診断で利用できます
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/prefer-props-shorthand": "warn"
}
},
},
});
vp run lint
悪い
ハイフン区切りに対応する camelCase も含め、属性と対応する変数名を式に重複して書いています。
<template>
<MyComponent :foo="foo" />
<MyComponent :user-name="userName" />
<span :style="style" />
<div :aria-label="ariaLabel" />
</template>
良い
Vue 3.4 以降の同名の省略形で式を省きます。bar のように別の変数を渡す式は明示します。
<template>
<MyComponent :foo />
<MyComponent :user-name />
<span :style />
<div :aria-label />
<MyComponent :foo="bar" />
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/prop-name-casing
宣言する prop 名の形式を揃えます。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
宣言した props の名前を検査します。子に渡す属性名の表記を検査するルールではありません。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/prop-name-casing": "warn"
}
},
},
});
vp run lint
悪い
宣言した prop の user_name をアンダースコア区切りにしています。
<script setup lang="ts">
defineProps<{ user_name: string }>();
</script>
<template><p>{{ user_name }}</p></template>
良い
宣言とテンプレートの参照を、camelCase の userName に揃えます。
<script setup lang="ts">
defineProps<{ userName: string }>();
</script>
<template><p>{{ userName }}</p></template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
vue/valid-attribute-name
有効な属性名を指定します。
既定の重大度: error
プリセット: essential, happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
悪い例での診断: parser/template
不正な属性名は、この防御的なルールに届く前に parser/template で検出されます。悪い例で確認するのは parser/template の検出で、vue/valid-attribute-name が別に出るとは限りません。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"vue/valid-attribute-name": "error"
}
},
},
});
vp run lint
悪い
my"attr の引用符で属性名が壊れています。この例の診断は parser/template で、別のルール診断が出ることを示すものではありません。
<template>
<div my"attr="value"></div>
</template>
良い
my-attr は正しい属性名で、テンプレートパーサーが属性と値を読み取れます。
<template>
<div my-attr="value"></div>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。