# vue-record
**Repository Path**: zeroone0011/vue-record
## Basic Information
- **Project Name**: vue-record
- **Description**: vue 记录
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-12-23
- **Last Updated**: 2021-12-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
### vue-record
#### 创建Vue的几种方式
```js
import Vue from 'vue';
import App from './App.vue';
// 1
let Main = Vue.component('App', App);
new Main({
el: '#app'
})
// 2
new Vue({
el: '#app',
components: {
App
},
template: ''
})
// 3 render 函数
new Vue({
el: '#app',
components: { App },
render (h) => h('App')
})
```
#### Vue 中的 computed 和 watch 的区别在哪里?
* computed 是由data中已知的变量得到一个新值。这个新值只会根据已知值的变化而变化。
* watch,监听数据的变化,支持深度监听
#### 渲染流程
* new Vue 初始化
* 挂载$mount方法,通过自定义render方法、template、el等生成render函数
* 通过Watcher监听数据的变化
* 当数据发生变化时,render函数执行生成VNode对象
* 通过patch方法,对比新旧VNode对象,通过DOM Diff算法,添加、修改、删除真正的DOM元素
#### template模板
Vue的模板基于纯HTML,基于Vue的模板语法,还是可以按照以前HTML式写结构。
#### AST 抽象语法树
parse:Vue使用HTML的Parser将HTML模板解析为ASToptimizer:对AST进行一些优化static静态节点的标记处理,提取最大的静态树,当_update更新界面时,会有一个patch的过程,diff算法会直接跳过静态节点,从而减少了patch的过程,优化了patch的性能generateCode:根据 AST 生成 render 函数
#### renderFn 渲染函数
渲染函数是用来生成Virtual DOM(vdom)的。Vue推荐使用模板来构建我们的应用界面,在底层实现中Vue会将模板编译成renderFn函数,当然我们也可以不写模板,直接写渲染函数,以获得更好的控制
#### Virtual DOM (vdom,也称为VNode)
虚拟DOM树,Vue的Virtual DOM Patching算法是基于 Snabbdom库 的实现,并在些基础上作了很多的调整和改进。只能通过RenderFn执行vm._render()生成,patch的目标都是Vnode,并且每个Vnode在全局都是唯一的
#### patch
在上面vdom已经说到这个,但还是要说一句,patch是整个virtaul-dom当中最为核心的方法,主要功能是对旧vnode和新vnode进行diff的过程,最后生成新的DOM节点通过updataComponent()方法重新渲染,vue对此做了相当多的性能优化
#### Watcher (观察者)
每个Vue组件都有一个对应的 Watcher ,这个 Watcher 将会在组件 render 的时候收集组件所依赖的数据,并在依赖有更新的时候,触发组件vm._updata调用patch()进行diff,重新渲染DOM。
#### debounce
```js
const debounce = (func, wait, immediate) => {
let timeout;
return function (...args) {
const later = () => {
timeout = null;
if (!immediate) {
func.apply(this, args);
}
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (immediate && !timeout) {
func.apply(this, args);
}
};
};
export default debounce;
```
#### $nextTick
```js
mounted () {
this.$nextTick(() => {
setTimeout(() => {
// code
}, 0);
});
}
```
#### vue-lazyload & vue-awesome-swiper
##### 一
```html
```
```js
data () {
return {
swiperOption: {
autoplay: {
delay: 3000,
stopOnLastSlide: false,
disableOnInteraction: false
},
pagination: {
el: '.swiper-pagination'
},
loop: true,
lazy: {
loadPrevNext: true
}
}
};
},
```
##### 二
```html
```