[强制] 组件命名

组件名为多个单词:避免跟现有的以及未来的 HTML 元素相冲突。

对于绝大多数项目来说,在单文件组件和字符串模板中组件名应该总是 PascalCase 的——但是在 DOM 模板中总是 kebab-case 的。

PascalCase:帕斯卡命名

与骆驼命名法类似只不过骆驼命名法是首字母小写,而帕斯卡命名法是首字母大写,如:

  1. DisplayInfo();
  2. string UserName;

kebab-case: 短横线命名

如果一个组件只在某个父组件的场景下有意义,这层关系应该体现在其名字上。因为编辑器通常会按字母顺序组织文件,所以这样做可以把相关联的文件排在一起。

  1. components/
  2. |- TodoList.vue
  3. |- TodoListItem.vue
  4. |- TodoListItemButton.vue

组件命名规则总结:
1.组件名称:首字母大小的PascalCase;引用:短横线命名的kebab-case
2.**组件名应该倾向于完整单词而不是缩写
3.紧密耦合的组件名**

[强制] 为v-for设置键值

当使用v-for渲染列表时, 需要对应的key值,以维护内部组件及其子树的状态

[强制] v-for 比 v-if 具有更高的优先级


永远不要把 v-if 和 v-for 同时用在同一个元素上,以下两种解决方法:

  • 过滤列表项目:可以先把列表放在计算属性(computed)中过滤,返回过滤后的列表。
  • 渲染要隐藏的列表,将 v-if 用在容器元素上(例如ul、ol)。

[强制] 为组件样式设置作用域

为避免不同组件之间css样式冲突,需在组件的样式设置作用域:scoped,不过更倾向于基于唯一的class名的策略。

[强制] 使用const和let声明变量

使用const和let来声明变量, 不要使用var

在ES6之前,我们都是用var关键字声明变量。无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部)。这就是函数变量提升例如

  1. function aa() {
  2. if(flag) {
  3. var test = 'hello man'
  4. } else {
  5. console.log(test)
  6. }
  7. }

以上的代码实际上是:

  1. function aa() {
  2. var test // 变量提升,函数最顶部
  3. if(flag) {
  4. test = 'hello man'
  5. } else {
  6. //此处访问 test 值为 undefined
  7. console.log(test)
  8. }
  9. //此处访问 test 值为 undefined
  10. }

所以不用关心flag是否为 true or false。实际上,无论如何 test 都会被创建声明。

接下来ES6主角登场:

我们通常用 letconst 来声明,let 表示变量const 表示常量letconst 都是块级作用域。怎么理解这个块级作用域?

  • 在一个函数内部
  • 在一个代码块内部

说白了只要在{}花括号内的代码块即可以认为 letconst 的作用域。

  1. function aa() {
  2. if(flag) {
  3. let test = 'hello man'
  4. } else {
  5. //test 在此处访问不到
  6. console.log(test)
  7. }
  8. }

let 的作用域是在它所在当前代码块,但不会被提升到当前函数的最顶部。

再来说说 const

const 声明的变量必须提供一个值,而且会被认为是常量,意思就是它的值被设置完成后就不能再修改了。

  1. const name = 'lux'
  2. name = 'joe' // 再次赋值此时会报错

还有,如果 const 的是一个对象,对象所包含的值是可以被修改的。抽象一点儿说,就是对象所指向的地址不能改变,而变量成员是可以修改的。

  1. const student = { name: 'cc' }
  2. // 没毛病
  3. student.name = 'yy'
  4. // 如果这样子就会报错了
  5. student = { name: 'yy' }

说说TDZ(暂时性死区),想必你早有耳闻。

  1. {
  2. console.log(value) // 报错
  3. let value = 'lala'
  4. }

我们都知道,JS引擎扫描代码时,如果发现变量声明,用 var 声明变量时会将声明提升到函数或全局作用域的顶部。但是 let 或者 const,会将声明关进一个小黑屋也是TDZ(暂时性死区),只有执行到变量声明这句语句时,变量才会从小黑屋被放出来,才能安全使用这个变量。

[强制] 使用ES6模板字符串

将ES6模板字符串替代 ES5的模板字符串

第一个用途,基本的字符串格式化。将表达式嵌入字符串中进行拼接。用${}来界定。

  1. //ES5
  2. var name = 'lux'
  3. console.log('hello' + name)
  4. //es6
  5. const name = 'lux'
  6. console.log(`hello ${name}`) //hello lux

第二个用途,在ES5时我们通过反斜杠()来做多行字符串或者字符串一行行拼接。ES6反引号(``)直接搞定。

  1. // ES5
  2. var msg = "Hi \
  3. man!
  4. "
  5. // ES6
  6. const template = `<div>
  7. <span>hello world</span>
  8. </div>`

[强制] img标签的标准处理方案

  1. <img :src="`${paramData.thumbnail}?x-oss-process=image/resize,m_lfit,w_228`"
  2. onerror="this.src='../assets/images/home/img_ lessons.png';this.οnerrοr=null"/>
  • 使用ES6模板字符串
  • 如果访问的图片存储于阿里云,处理参数请求缩略图 x-oss-process=image/resize,m_lfit,w_228
  • 图片加载失败时设置默认图片

[建议] prop参数

在声明 prop 的时候,其命名应该始终使用 camelCase,而在模板和 JSX 中应该始终使用 kebab-case。

多个特性的元素应该分多行撰写,每个特性一行。

[建议] 组件引用

组件引用采用懒加载方式引用

  1. const quesDetail = () => import( './quesDetail');

[建议] 组件自闭合

在单文件组件、字符串模板和 JSX 中没有内容的组件应该是自闭合的——但在 DOM 模板里永远不要这样做:自闭合是刻意没有内容。

[建议] 指令缩写规则

指令缩写 (用 : 表示 v-bind: 、用 @ 表示 v-on: 和用 # 表示 v-slot:) 应该要么都用要么都不用。

[建议] method方法命名

  • ajax数据请求:以get、post开头,以data结尾

    getListData、postFormData


  • 事件:事件方法以on开头

    onChangeColor、onChangeStatus

  • 驼峰命名规则

[建议] vue方法放置顺序

  • components(组件)
  • props(组件之间的传递值)
  • data(初始化数据)
  • computed (计算属性,做逻辑处理)
  • methods (方法)
  • mounted(钩子函数,一般调用方法)

示例:

  1. export default{
  2. components:{
  3. },
  4. props:[],
  5. data(){
  6. return {
  7. }
  8. },
  9. computed:{
  10. }
  11. methods:{
  12. },
  13. mounted:{
  14. }
  15. }