Vue前端开发规范( 三 )

12. 带引号的特性值

非空 html 特性值应该始终带引号 (单引号或双引号,选你 JS 里不用的那个) 。
在 HTML 中不带空格的特性值是可以没有引号的,但这样做常常导致带空格的特征值被回避,导致其可读性变差 。
正例:
<AppSidebar :style="{ width: sidebarWidth + 'px' }">复制代码反例:
<AppSidebar :style={width:sidebarWidth+'px'}>复制代码13. 指令缩写
都用指令缩写 (用 : 表示 v-bind: 和用 @ 表示 v-on:)
正例:
<input @input="onInput" @focus="onFocus">复制代码反例:
<input v-bind:value=https://www.isolves.com/it/cxkf/bk/2021-03-10/"newTodoText" :placeholder="newTodoInstructions">复制代码三、推荐
1. 单文件组件的顶级元素的顺序
单文件组件应该总是让<script>、<template> 和 <style> 标签的顺序保持一致 。且 <style> 要放在最后,因为另外两个标签至少要有一个 。
正例:
<!-- ComponentA.vue --><template>...</template><script>/* ... */</script><style>/* ... */</style>复制代码四、谨慎使用 (有潜在危险的模式)
1. 没有在 v-if/v-if-else/v-else 中使用 key
如果一组 v-if + v-else 的元素类型相同,最好使用 key (比如两个 <div> 元素) 。
正例:
<div v-if="error" key="search-status"> 错误:{{ error }}</div><div v-else key="search-results"> {{ results }}</div>复制代码反例:
<div v-if="error"> 错误:{{ error }}</div><div v-else> {{ results }}</div>复制代码2. scoped 中的元素选择器
元素选择器应该避免在 scoped 中出现 。
在 scoped 样式中,类选择器比元素选择器更好,因为大量使用元素选择器是很慢的 。
正例:
<template> <button class="btn btn-close">X</button></template><style scoped>.btn-close { background-color: red;}</style>复制代码反例:
<template> <button>X</button></template><style scoped>button { background-color: red;}</style>复制代码3. 隐性的父子组件通信
应该优先通过 prop 和事件进行父子组件之间的通信,而不是 this.$parent 或改变 prop 。
正例:
Vue.component('TodoItem', { props: { todo: { type: Object, required: true } }, template: ` <input :value=https://www.isolves.com/it/cxkf/bk/2021-03-10/"todo.text" @input="$emit('input', $event.target.value)" > `})复制代码反例:
Vue.component('TodoItem', { props: { todo: { type: Object, required: true } }, methods: { removeTodo () { var vm = this vm.$parent.todos = vm.$parent.todos.filter(function (todo) { return todo.id !== vm.todo.id }) } }, template: ` <span> {{ todo.text }} <button @click="removeTodo"> X </button> </span> `})复制代码4. 非 Flux 的全局状态管理
应该优先通过 Vuex 管理全局状态,而不是通过 this.$root 或一个全局事件总线 。
正例:
// store/modules/todos.jsexport default { state: { list: [] }, mutations: { REMOVE_TODO (state, todoId) { state.list = state.list.filter(todo => todo.id !== todoId) } }, actions: { removeTodo ({ commit, state }, todo) { commit('REMOVE_TODO', todo.id) } }}<!-- TodoItem.vue --><template> <span> {{ todo.text }} <button @click="removeTodo(todo)"> X </button> </span></template><script>import { mapActions } from 'vuex'export default { props: { todo: { type: Object, required: true } }, methods: mapActions(['removeTodo'])}</script>复制代码反例:
// main.jsnew Vue({ data: { todos: [] }, created: function () { this.$on('remove-todo', this.removeTodo) }, methods: { removeTodo: function (todo) { var todoIdToRemove = todo.id this.todos = this.todos.filter(function (todo) { return todo.id !== todoIdToRemove }) } }})复制代码附录
1. 推荐使用vs code进行前端编码,规定Tab大小为2个空格
  1. vs code配置
{ "editor.tabSize": 2, "workbench.startupEditor": "newUntitledFile", "workbench.iconTheme": "vscode-icons", // 以下为stylus配置 "stylusSupremacy.insertColons": false, // 是否插入冒号 "stylusSupremacy.insertSemicolons": false, // 是否插入分好 "stylusSupremacy.insertBraces": false, // 是否插入大括号 "stylusSupremacy.insertNewLineAroundImports": false, // import之后是否换行 "stylusSupremacy.insertNewLineAroundBlocks": false, // 两个选择器中是否换行 "vetur.format.defaultFormatter.html": "js-beautify-html", "eslint.autoFixOnSave": true, "eslint.validate": [ "JAVAscript", { "language": "html", "autoFix": true }, { "language": "vue", "autoFix": true }, "JavaScriptreact", "html", "vue" ], "eslint.options": { "plugins": ["html"] }, "prettier.singleQuote": true, "prettier.semi": false, "javascript.format.insertSpaceBeforeFunctionParenthesis": false, "vetur.format.js.InsertSpaceBeforeFunctionParenthesis": false, "vetur.format.defaultFormatter.js": "prettier", // "prettier.eslintIntegration": true}复制代码


推荐阅读