# part_three_module_two
**Repository Path**: february23/part_three_module_two
## Basic Information
- **Project Name**: part_three_module_two
- **Description**: 拉勾part 3 模块2
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-12-09
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# part_three_module_two
#### 介绍
拉勾part 3 模块2
#### 请简述 Vue 首次渲染的过程

#### 请简述 Vue 响应式原理

#### 请简述虚拟 DOM 中 Key 的作用和好处
以遍历数组为例:原始数据为[1,2,3,4],修改后的数据为[1,5,2,3,4]
```
{{ item }}
```
通过_render()函数获取到的虚拟dom结构,新旧虚拟dom的children结构如下:
```
[{
children: [{
children: undefined,
key: undefined,
text: " 1 ",
...
}],
key: undefined,
...
},{
children: [{
children: undefined,
key: undefined,
text: " 2 ",
...
}],
key: undefined,
...
},{
children: [{
children: undefined,
key: undefined,
text: " 3 ",
...
}],
key: undefined,
...
},{
children: [{
children: undefined,
key: undefined,
text: " 4 ",
...
}],
key: undefined,
...
}]
```
ch为:
```
[{
children: [{
children: undefined,
key: undefined,
text: " 1 ",
...
}],
key: undefined,
text: undefined,
...
},{
children: [{
children: undefined,
key: undefined,
text: " 5 ",
...
}],
key: undefined,
text: undefined,
...
},{
children: [{
children: undefined,
key: undefined,
text: " 2 ",
...
}],
key: undefined,
text: undefined,
...
},{
children: [{
children: undefined,
key: undefined,
text: " 3 ",
...
}],
key: undefined,
text: undefined,
...
},{
children: [{
children: undefined,
key: undefined,
text: " 4 ",
...
}],
key: undefined,
text: undefined,
...
}]
```
sameVnode的判断条件为:
```
a.key === b.key && (
(
a.tag === b.tag &&
a.isComment === b.isComment &&
isDef(a.data) === isDef(b.data) &&
sameInputType(a, b)
) || (
isTrue(a.isAsyncPlaceholder) &&
a.asyncFactory === b.asyncFactory &&
isUndef(b.asyncFactory.error)
)
)
```
根据updateChildren的判断逻辑:
如果不设置key,当执行到sameVnode(oldStartVnode, newStartVnode)时,sameVnode函数的返回值为true,就会继续执行patchVnode函数,直到patchVnode中的新旧节点有text属性且text值不同时,更新dom树,如此,就会执行3次dom更新和1次dom插入操作
如果设置key,当执行到sameVnode(oldStartVnode, newStartVnode)时,sameVnode函数的返回值为false,就会继续执行往下的判断逻辑,这时新旧节点就会以从后向前的方向判断子节点是否相同,由于从后向前判断时,新旧子节点都是相同的,因此不做dom更新操作,最后只执行一次dom插入操作
#### 请简述 Vue 中模板编译的过程

模板编译的核心在baseCompile函数中,该函数的功能可分为三部分
1. 将模板转换成抽象语法树ast
2. 优化抽象语法树,主要是添加静态节点和静态根节点标记,更新渲染时,如果是静态节点或者静态根节点,就将此节点跳过,直接比较非静态节点,提高效率
3. 生成字符串格式的render函数