这里主要分为Vue风格指南和customer自定义风格,后续应该会继续更新。
export default {
name: 'vue-calendar',
components: {
'calendar-body': CalendarBody,
'calendar-header': CalendarHeader
}
}
export default {
data () {
return {
foo: 'bar'
}
}
}
设置required的情况下,需要设置validator。
未设置required的数据,基本数据类型需要加上default,对于对象类型,建议添加validator进行数据验证。
props: {
status: {
type: String,
required: true,
validator: function (value) {
return [
'syncing',
'synced',
'version-conflict',
'error'
].indexOf(value) !== -1
}
}
}
-
{{ todo.text }}
除却顶级App组件,所有组件遵循下面规则
在插件、混入等扩展中始终为自定义的私有属性使用 $_ 前缀。并附带一个命名空间以回避和其它作者的冲突 (比如 $_yourPluginName_)。
只要有能够拼接文件的构建系统,就把每个组件单独分成文件。就是将组件内部的可进行提取组件的代码片段提取成组件并放置在当前文件夹/components/下。
components/
|- TodoList.js
|- TodoItem.js
单文件组件的文件名应该要么始终是单词大写开头 (PascalCase),要么始终是横线连接 (kebab-case)。个人建议保持单词大写开头。
components/
|- MyComponent.vue
只应该拥有单个活跃实例的组件应该以 The 前缀命名,以示其唯一性。不接受prop的组件,因为它们是为你的应用定制的,而不是它们在你的应用中的上下文。
components/
|- TheHeading.vue
|- TheSidebar.vue
和父组件紧密耦合的子组件应该以父组件名作为前缀命名。因为编辑器通常会按字母顺序组织文件,所以这样做可以把相关联的文件排在一起。例如下面navigation组件应用与searchSidebar组件中,所以命名沿袭父组件的名称风格。
components/
|- SearchSidebar.vue
|- SearchSidebarNavigation.vue
组件名应该以高级别的 (通常是一般化描述的) 单词开头,以描述性的修饰词结尾。这里我的理解是高级别是用来修饰组件的,描述性的修饰词结尾,则是修饰具体功能的。例如下面SearchButtonClear组件,Search指的是当前组件为查询按钮组件,Clear指的是当前组件的具体功能,查询组件清空查询条件的。
components/
|- SearchButtonClear.vue
|- SearchButtonRun.vue
|- SearchInputQuery.vue
|- SearchInputExcludeGlob.vue
|- SettingsCheckboxTerms.vue
|- SettingsCheckboxLaunchOnStartup.vue
在单文件组件、字符串模板和 JSX 中没有内容的组件应该是自闭合的——但在 DOM 模板里永远不要这样做。自闭合组件表示它们不仅没有内容,而且刻意没有内容。如果组件不使用插槽的情况下,则永远使用自闭合。如果存在插槽的情况,则不使用自闭合。
在所有的地方都使用 kebab-case 。
组件名应该倾向于完整单词而不是缩写
components/
|- StudentDashboardSettings.vue
|- UserProfileOptions.vue
在声明 prop 的时候,其命名应该始终使用 camelCase,而在模板和 JSX 中应该始终使用 kebab-case。
props: {
greetingText: String
}
多个特性的元素应该分多行撰写,每个特性一行。
应该把复杂计算属性分割为尽可能多的更简单的属性。
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 特性值应该始终带引号
指令缩写 (用 : 表示 v-bind: 和用 @ 表示 v-on:) 应该要么都用要么都不用。个人习惯都不用。
文件夹命名
文件命名
变量命名
特别说明:
html
{{weekLabelItem}}
{{dayItem.monthDay}}
script
常用成员放置顺序
之所以将data/computed/watch放置created之前,因为create的时候数据data已经初始成功
components在html里使用按照kabeb-case风格
components: {
'calendar-body': CalendarBody,
'calendar-header': CalendarHeader
},
props定义应该详细,具体信息参考:props定义应该详细和prop大小写
props: {
weekLabelIndex: {
type: Number,
default: 1
}
},
props数据处理
对于父子组件嵌套传值,子组件通过Props接受,如果子组件只是显示信息,不存在修改信息。可以直接使用props传递的值,如果需要修改,则需要通过深复制创建新对象,因为props的值不允许改变。具体信息参考文章prop初始化数据处理
深复制方式:
组件引入过多项目时,需要每一个项目占有一行
import {
getHeaderContent,
getFirstDayOfMonth,
getFirstDayOfNextMonth,
getFirstDayOfPrevMonth
} from '../lib/Util.js'
组件引入其他组件的,需要将公共组件和内部组件空格分开,加以说明
components: {
// 公共组件 Todo
// 内部组件
'calendar-body': CalendarBody,
'calendar-header': CalendarHeader
},
data数据过多的情况下,需要添加注释进行区分
watch慎用,不是watch情况下不建议使用watch,例如同一组件在多个路由使用,需要使用watch进行同一组件在不同路由下的区分。
data最早可以在create生命周期进行操作
元素操作最早可以在monted生命周期中进行操作
不要使用this.$parent,尽量避免使用this.$refs,通过组件通信进行数据交互
methods中的方法添加注释进行分类说明
一般分为:
methods: {
/**
* 日历方法
*/
// 点击日历
onClickDay (dayItem) {
this.$emit('dayClick', dayItem)
},
// 设置weekList值
setWeekListValue (firstDayOfmonth) {
this.weekList = []
let dayOfCalendar = getFirstDayOfCalendar(firstDayOfmonth, this.weekLabelIndex)
// 遍历层数为6,因为日历显示当前月数据为6行
for (let weekIndex = 0; weekIndex < 6; weekIndex++) {
let weekItem = []
// 每一周为7天
for (let dayIndex = 0; dayIndex < 7; dayIndex++) {
let dayItem = {
date: dayOfCalendar,
monthDay: formatDayWithTwoWords(dayOfCalendar.getDate()),
isCurrentMonth: isCurrentMonth(this.firstDayOfMonth, dayOfCalendar),
isCurrentDay: isCurrentDay(dayOfCalendar)
}
weekItem.push(dayItem)
// 当前日期加1,以此类推得到42条记录
dayOfCalendar.setDate(dayOfCalendar.getDate() + 1)
}
this.weekList.push(weekItem)
}
},
/**
* 观察者模式相关方法
*/
// 切换月份更新body数据
update (content) {
this.firstDayOfMonth = content
this.setWeekListValue(content)
},
/**
* 工具方法
*/
// 周六/周日标识红色字体
isShowRedColorForWeekLable (index) {
return index + this.weekLabelIndex === 6 ||
index + this.weekLabelIndex === 7 ||
(index === 0 && this.weekLabelIndex === 0)
}
}
css
style上需要添加scoped
css只有一个最外层class页面布局,页面的主框架是div + css, 在进行div布局之后,涉及到多个div同行,建议使用flex布局
css属性的书写顺序(也是之前没注意的,正好收集学习一下)
这里的页面指的是具有完整功能的组件,例如创建人员组件。一帮情况下可能会将两个页面公用,然后页面进行判断。这里建议将页面form表单提出公共组件,然后页面还是创建多个文件,因为完整功能文件多重用会造成页面逻辑相对来说混乱,不易维护。
不会存在多重用页面组件,只会存在多重用功能组件。
列表页面查询条件设置之后,点击新建页面,然后返回列表页面,此时页面上的查询条件需不需要保存,规则建议如下:
开发前期可能存在依赖其他模块内容,假设业务开发依赖于基本人员信息(角色/员工工号),则应前期在添加公共mock代码。用于所有依赖的地方使用,而且尽可能的调用方式和集成其他模块之后相同,这样相当与将与其他模块的集成使用mock代码形成一个黑盒。
公共组件具有的特性
公共组件的代码规范
公共组件需要存在一个文件对组件进行说明文档,可以在公共组件添加readme.md文件,内部格式如下:
/**
* 组件名称
* @module 组件存放位置
* @desc 组件描述
* @author 组件作者
* @date 2017年12月05日17:22:43
* @param {Object} [title] - 参数说明
* @param {String} [columns] - 参数说明
* @example 调用示例
*/