|
6 | 6 | ## :book: Rule Details
|
7 | 7 |
|
8 | 8 | This rule aims to enforce ordering of component attributes. The default order is specified in the [Vue styleguide](https://vuejs.org/v2/style-guide/#Element-attribute-order-recommended) and is:
|
9 |
| -- DEFINITION |
10 |
| -ex: 'is' |
11 |
| -- LIST_RENDERING |
12 |
| -ex: 'v-for item in items' |
13 |
| -- CONDITIONALS |
14 |
| -ex: 'v-if', 'v-else-if', 'v-else', 'v-show', 'v-cloak' |
15 |
| -- RENDER_MODIFIERS |
16 |
| -ex: 'v-once', 'v-pre' |
17 |
| -- GLOBAL |
18 |
| -ex: 'id' |
19 |
| -- UNIQUE |
20 |
| -ex: 'ref', 'key', 'slot' |
21 |
| -- TWO\_WAY\_BINDING |
22 |
| -ex: 'v-model' |
23 |
| -- OTHER_DIRECTIVES |
24 |
| -ex: 'v-custom-directive' |
25 |
| -- OTHER_ATTR |
26 |
| -ex: 'custom-prop="foo"', 'v-bind:prop="foo"', ':prop="foo"' |
27 |
| -- EVENTS |
28 |
| -ex: '@click="functionCall"', 'v-on="event"' |
29 |
| -- CONTENT |
30 |
| -ex: 'v-text', 'v-html' |
31 |
| - |
32 |
| -:+1: Examples of **correct** code`: |
33 |
| - |
34 |
| -```html |
35 |
| -<div |
36 |
| - is="header" |
37 |
| - v-for="item in items" |
38 |
| - v-if="!visible" |
39 |
| - v-once |
40 |
| - id="uniqueID" |
41 |
| - ref="header" |
42 |
| - v-model="headerData" |
43 |
| - my-prop="prop" |
44 |
| - @click="functionCall" |
45 |
| - v-text="textContent"> |
46 |
| -</div> |
47 |
| -``` |
48 | 9 |
|
49 |
| -```html |
50 |
| -<div |
51 |
| - v-for="item in items" |
52 |
| - v-if="!visible" |
53 |
| - prop-one="prop" |
54 |
| - :prop-two="prop" |
55 |
| - prop-three="prop" |
56 |
| - @click="functionCall" |
57 |
| - v-text="textContent"> |
58 |
| -</div> |
| 10 | +- `DEFINITION` |
| 11 | + ex: 'is' |
| 12 | +- `LIST_RENDERING` |
| 13 | + ex: 'v-for item in items' |
| 14 | +- `CONDITIONALS` |
| 15 | + ex: 'v-if', 'v-else-if', 'v-else', 'v-show', 'v-cloak' |
| 16 | +- `RENDER_MODIFIERS` |
| 17 | + ex: 'v-once', 'v-pre' |
| 18 | +- `GLOBAL` |
| 19 | + ex: 'id' |
| 20 | +- `UNIQUE` |
| 21 | + ex: 'ref', 'key', 'slot' |
| 22 | +- `TWO_WAY_BINDING` |
| 23 | + ex: 'v-model' |
| 24 | +- `OTHER_DIRECTIVES` |
| 25 | + ex: 'v-custom-directive' |
| 26 | +- `OTHER_ATTR` |
| 27 | + ex: 'custom-prop="foo"', 'v-bind:prop="foo"', ':prop="foo"' |
| 28 | +- `EVENTS` |
| 29 | + ex: '@click="functionCall"', 'v-on="event"' |
| 30 | +- `CONTENT` |
| 31 | + ex: 'v-text', 'v-html' |
| 32 | + |
| 33 | +### the default order |
| 34 | + |
| 35 | +<eslint-code-block :rules="{'vue/attributes-order': ['error']}"> |
59 | 36 | ```
|
60 |
| - |
61 |
| -```html |
62 |
| -<div |
63 |
| - prop-one="prop" |
64 |
| - :prop-two="prop" |
65 |
| - prop-three="prop"> |
66 |
| -</div> |
| 37 | +<template> |
| 38 | + <!-- ✓ GOOD --> |
| 39 | + <div |
| 40 | + is="header" |
| 41 | + v-for="item in items" |
| 42 | + v-if="!visible" |
| 43 | + v-once |
| 44 | + id="uniqueID" |
| 45 | + ref="header" |
| 46 | + v-model="headerData" |
| 47 | + my-prop="prop" |
| 48 | + @click="functionCall" |
| 49 | + v-text="textContent"> |
| 50 | + </div> |
| 51 | + <div |
| 52 | + v-for="item in items" |
| 53 | + v-if="!visible" |
| 54 | + prop-one="prop" |
| 55 | + :prop-two="prop" |
| 56 | + prop-three="prop" |
| 57 | + @click="functionCall" |
| 58 | + v-text="textContent"> |
| 59 | + </div> |
| 60 | + <div |
| 61 | + prop-one="prop" |
| 62 | + :prop-two="prop" |
| 63 | + prop-three="prop"> |
| 64 | + </div> |
| 65 | +
|
| 66 | + <!-- ✗ BAD --> |
| 67 | + <div |
| 68 | + ref="header" |
| 69 | + v-for="item in items" |
| 70 | + v-once |
| 71 | + id="uniqueID" |
| 72 | + v-model="headerData" |
| 73 | + my-prop="prop" |
| 74 | + v-if="!visible" |
| 75 | + is="header" |
| 76 | + @click="functionCall" |
| 77 | + v-text="textContent"> |
| 78 | + </div> |
| 79 | +</template> |
67 | 80 | ```
|
| 81 | +</eslint-code-block> |
68 | 82 |
|
69 |
| -:-1: Examples of **incorrect** code`: |
70 |
| - |
71 |
| -```html |
72 |
| -<div |
73 |
| - ref="header" |
74 |
| - v-for="item in items" |
75 |
| - v-once |
76 |
| - id="uniqueID" |
77 |
| - v-model="headerData" |
78 |
| - my-prop="prop" |
79 |
| - v-if="!visible" |
80 |
| - is="header" |
81 |
| - @click="functionCall" |
82 |
| - v-text="textContent"> |
83 |
| -</div> |
84 |
| -``` |
85 |
| - |
86 |
| -### `order` |
87 |
| - |
88 |
| -Specify custom order of attribute groups |
| 83 | +### custom orders |
89 | 84 |
|
90 |
| -:+1: Examples of **correct** code with custom order`: |
| 85 | +#### `['LIST_RENDERING', 'CONDITIONALS', 'RENDER_MODIFIERS', 'GLOBAL', 'UNIQUE', 'TWO_WAY_BINDING', 'DEFINITION', 'OTHER_DIRECTIVES', 'OTHER_ATTR', 'EVENTS', 'CONTENT']` |
91 | 86 |
|
92 |
| -```html |
93 |
| -<!-- 'vue/attributes-order': [2, { order: ['DEFINITION', 'LIST_RENDERING', 'CONDITIONALS', 'RENDER_MODIFIERS', 'GLOBAL', 'UNIQUE', ['BINDING', 'OTHER_ATTR'], 'EVENTS', 'CONTENT'] }] --> |
94 |
| -<div |
95 |
| - is="header" |
96 |
| - prop-one="prop" |
97 |
| - :prop-two="prop"> |
98 |
| -</div> |
| 87 | +<eslint-code-block :rules="{'vue/attributes-order': ['error', {order: ['LIST_RENDERING', 'CONDITIONALS', 'RENDER_MODIFIERS', 'GLOBAL', 'UNIQUE', 'TWO_WAY_BINDING', 'DEFINITION', 'OTHER_DIRECTIVES', 'OTHER_ATTR', 'EVENTS', 'CONTENT']}]}"> |
99 | 88 | ```
|
100 |
| - |
101 |
| -```html |
102 |
| -<!-- 'vue/attributes-order': [2, { order: ['LIST_RENDERING', 'CONDITIONALS', 'RENDER_MODIFIERS', 'GLOBAL', 'UNIQUE', 'BINDING', 'OTHER_ATTR', 'EVENTS', 'CONTENT', 'DEFINITION'] }] --> |
103 |
| -<div |
104 |
| - prop-one="prop" |
105 |
| - prop-two="prop" |
106 |
| - is="header"> |
107 |
| -</div> |
108 |
| -``` |
109 |
| - |
110 |
| -```html |
111 |
| -<!-- 'vue/attributes-order': [2, { order: ['LIST_RENDERING', 'CONDITIONALS', 'RENDER_MODIFIERS', 'GLOBAL', 'UNIQUE', 'TWO_WAY_BINDING', 'DEFINITION', 'OTHER_DIRECTIVES', 'OTHER_ATTR', 'EVENTS', 'CONTENT'] }] --> |
112 |
| -<div |
113 |
| - ref="header" |
114 |
| - is="header" |
115 |
| - prop-one="prop" |
116 |
| - prop-two="prop"> |
117 |
| -</div> |
| 89 | +<template> |
| 90 | + <!-- ✓ GOOD --> |
| 91 | + <div |
| 92 | + ref="header" |
| 93 | + is="header" |
| 94 | + prop-one="prop" |
| 95 | + prop-two="prop"> |
| 96 | + </div> |
| 97 | +
|
| 98 | + <!-- ✗ BAD --> |
| 99 | + <div |
| 100 | + ref="header" |
| 101 | + prop-one="prop" |
| 102 | + is="header"> |
| 103 | + </div> |
| 104 | +</template> |
118 | 105 | ```
|
| 106 | +</eslint-code-block> |
119 | 107 |
|
120 |
| -:-1: Examples of **incorrect** code with custom order`: |
| 108 | +#### `[['LIST_RENDERING', 'CONDITIONALS', 'RENDER_MODIFIERS'], ['DEFINITION', 'GLOBAL', 'UNIQUE'], 'TWO_WAY_BINDING', 'OTHER_DIRECTIVES', 'OTHER_ATTR', 'EVENTS', 'CONTENT']` |
121 | 109 |
|
122 |
| -```html |
123 |
| -<!-- 'vue/attributes-order': [2, { order: ['LIST_RENDERING', 'CONDITIONALS', 'RENDER_MODIFIERS', 'GLOBAL', 'UNIQUE', 'TWO_WAY_BINDING', 'DEFINITION', 'OTHER_DIRECTIVES', 'OTHER_ATTR', 'EVENTS', 'CONTENT'] }] --> |
124 |
| -<div |
125 |
| - ref="header" |
126 |
| - prop-one="prop" |
127 |
| - is="header"> |
128 |
| -</div> |
| 110 | +<eslint-code-block :rules="{'vue/attributes-order': ['error', {order: [['LIST_RENDERING', 'CONDITIONALS', 'RENDER_MODIFIERS'], ['DEFINITION', 'GLOBAL', 'UNIQUE'], 'TWO_WAY_BINDING', 'OTHER_DIRECTIVES', 'OTHER_ATTR', 'EVENTS', 'CONTENT']}]}"> |
| 111 | +``` |
| 112 | +<template> |
| 113 | + <!-- ✓ GOOD --> |
| 114 | + <div |
| 115 | + ref="header" |
| 116 | + is="header" |
| 117 | + prop-one="prop" |
| 118 | + prop-two="prop"> |
| 119 | + </div> |
| 120 | + <div |
| 121 | + is="header" |
| 122 | + ref="header" |
| 123 | + prop-one="prop" |
| 124 | + prop-two="prop"> |
| 125 | + </div> |
| 126 | +</template> |
129 | 127 | ```
|
| 128 | +</eslint-code-block> |
130 | 129 |
|
131 |
| -## Related links |
| 130 | +## :books: Further reading |
132 | 131 |
|
133 | 132 | - [Style guide - Element attribute order](https://vuejs.org/v2/style-guide/#Element-attribute-order-recommended)
|
134 | 133 |
|
|
0 commit comments