# 代码规范
前言
补充一些官方文档中没有的,但是实际开发中最好需要了解的内容
- 一些常见的编码习惯
- css、js、image 等静态文件应该放在约定的目录里面
- 在页面中尽量避免写入行内样式,即 style=“”
- 引号规则:一句代码中只使用一种引号则双引号优先,否则同意最外层使用单引号
- 变量命名:变量采用驼峰式命名且首字母小写(除了对象的属性以外),定义后没有被使用的变量要删除
- 函数规则:无论是函数声明还是函数表达式,“(”前不要空格,但‘’{‘’前一定要有空格。函数调用括号前不需要空格,立即执行函数外必须包一层括号
- 数组、对象的规则:两者最后均不要有多余的逗号;对象属性名不需要加引号
- 在同一个函数内部中,局部变量的声明必须定义在顶端
- 除了三目运算符外,其他的(if、else 等)禁止简写
- 函数中传入的参数必须具有有效性,对特殊的入参必须进行说明
- 尽量减少循环嵌套层次,尽量避免大于三层的循环
- 封装的组件更新函数
updateComponent = () => {
vm._update(vm._render(), hydrating)
}
1
2
3
2
3
- 参数
const watcherOptions: WatcherOptions = {
before() {
if (vm._isMounted && !vm._isDestroyed) {
callHook(vm, "beforeUpdate")
}
},
}
1
2
3
4
5
6
7
2
3
4
5
6
7
- 将上述两个参数传入实例化渲染 watcher
new Watcher(
vm,
updateComponent,
noop,
watcherOptions,
true /* isRenderWatcher */
)
1
2
3
4
5
6
7
2
3
4
5
6
7
- watcher 类,响应式数据第一次访问时进行依赖收集,会将渲染 watcher 存储起来,数据有修改时派发更新
export default class Watcher implements DepTarget {
addDep(dep: Dep) {
...
dep.addSub(this)
}
update() {
...
queueWatcher(this)
}
run() {
...
this.cb.call(this.vm, value, oldValue) // cb 就是 updateComponent
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 响应式数据
Object.defineProperty(obj, key, {
get: function reactiveGetter() {
...
dep.depend() // 依赖收集
},
set: function reactiveSetter(newVal) {
...
dep.notify() // 派发更新
},
})
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- Dep
export default class Dep {
addSub(sub: DepTarget) {
this.subs.push(sub)
}
depend(info?: DebuggerEventExtraInfo) {
...
Dep.target.addDep(this) //Dep.target 就是 Watcher
}
notify(info?: DebuggerEventExtraInfo) {
...
for (let i = 0, l = subs.length; i < l; i++) {
const sub = subs[i]
sub.update()
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
← css 预处理器