Vue
2021-03-09 01:07:36 61 举报
AI智能生成
Vue.js
作者其他创作
大纲/内容
自测题
https://xiedaimala.com/courses/0d531a6f-40a7-4120-a8f6-9e816ff9d51c/random/0e37837c70#/common
VUE面试题
https://zhuanlan.zhihu.com/p/97950650
https://zhuanlan.zhihu.com/p/53703176
https://zhuanlan.zhihu.com/p/148642124
https://zhuanlan.zhihu.com/p/144167460
https://zhuanlan.zhihu.com/p/100350717
https://zhuanlan.zhihu.com/p/127186829
https://zhuanlan.zhihu.com/p/269529541
网友Vue笔记
https://rayhomie.gitee.io/rayhomieblog/VUE/vueBase/
https://rayhomie.gitee.io/rayhomieblog/VUE/vueBase/
Vue项目搭建
入口:main.js
MVVM
MVVM: VM是数据模型,内部基于双向绑定了dom,以前的MVC需要操作DOM ,MVVM里前端只关注vm的变化.
Vue为什么是渐进式的?
我们可以通过添加组件系统、客户端路由、大规模状态管理来构建一个完整的框架。更重要的是,这些功能相互独立,你可以在核心功能的基础上任意选用其他的部件,不一定要全部整合在一起。按需加载, 所说的“渐进式”,其实就是Vue的使用方式,同时也体现了Vue的设计的理念
主要从与React、Angular的比较来阐述的,Angular的组件需要:
Angular,它两个版本都是强主张的,如果你用它,必须接受以下东西:
- 必须使用它的模块机制- 必须使用它的依赖注入- 必须使用它的特殊形式定义组件
主要从与React、Angular的比较来阐述的,Angular的组件需要:
Angular,它两个版本都是强主张的,如果你用它,必须接受以下东西:
- 必须使用它的模块机制- 必须使用它的依赖注入- 必须使用它的特殊形式定义组件
为什么叫虚拟DOM?
详解Vue中的虚拟DOM - Fundebug的文章 - 知乎
https://zhuanlan.zhihu.com/p/70823358
https://zhuanlan.zhihu.com/p/70823358
应用场景
Vue模板(编译) → 渲染函数(执行函数) → 虚拟DOM树 → 真实DOM
概念
我们对由 Vue 组件树建立起来的整个 VNode 树的称呼, 虚拟 DOM是抽象概念,以VNode为基础
组成
VNode
createElement--> createNodeDescription: 因为它所包含的信息会告诉 Vue 页面上需要渲染什么样的节点,包括及其子节点的描述信息。
我们把这样的节点描述为“虚拟节点 (virtual node)”,也常简写它为“VNode”。
我们把这样的节点描述为“虚拟节点 (virtual node)”,也常简写它为“VNode”。
最少包含标签名( tag)、属性(attrs)和子元素对象( children)三个属性
patch(也叫做patching算法):虚拟DOM最核心的部分,它可以将vnode渲染成真实的DOM
为何需要Virtual DOM?
具备跨平台的优势
操作 DOM 慢,js运行效率高。我们可以将DOM对比操作放在JS层,提高效率。
提升渲染性能
我们通过patch 的核心----diff 算法,找出本次DOM需要更新的节点来更新,其他的不更新。
Vue的diff算法是基于snabbdom改造过来的,仅在同级的vnode间做diff,递归地进行同级vnode的diff,最终实现整个DOM树的更新
diff 算法----粗略介绍以下两个核心函数实现流程:patch(container,vnode) :
- 初次渲染的时候,将VDOM渲染成真正的DOM然后插入到容器里面。patch(vnode,newVnode):
- 再次渲染的时候,将新的vnode和旧的vnode相对比,然后之间差异应用到所构建的真正的DOM树上。
- 初次渲染的时候,将VDOM渲染成真正的DOM然后插入到容器里面。patch(vnode,newVnode):
- 再次渲染的时候,将新的vnode和旧的vnode相对比,然后之间差异应用到所构建的真正的DOM树上。
方正
Vue 2.0 引入 vdom 的主要原因是 vdom 把渲染过程抽象化了,从而使得组件的抽象能力也得到提升,并且可以适配 DOM 以外的渲染目标。
不再依赖 HTML 解析器进行模版解析,可以进行更多的 AOT 工作提高运行时效率:通过模版 AOT 编译,Vue 的运行时体积可以进一步压缩,运行时效率可以进一步提升;
跨平台: 可以渲染到 DOM 以外的平台,
实现 SSR、同构渲染这些高级特性,Weex 等框架应用的就是这一特性。
不再依赖 HTML 解析器进行模版解析,可以进行更多的 AOT 工作提高运行时效率:通过模版 AOT 编译,Vue 的运行时体积可以进一步压缩,运行时效率可以进一步提升;
跨平台: 可以渲染到 DOM 以外的平台,
实现 SSR、同构渲染这些高级特性,Weex 等框架应用的就是这一特性。
响应式数据原理
初始化用户传入的数据对象-监听对象obsever方法--遍历数据对象-重写get,set,
对应存取数据-数据变化会通知watcher-更新数据
对应存取数据-数据变化会通知watcher-更新数据
watch: 发布订阅模式
3.vue中是如何检数组变化理解
初始化数据-检测-重写原型方法(函数劫持)-监听到数组里的对象发生变化-通过数组的7的方法更新数据
为何vue来用导步渲染
如果不采取异步更新,那么每次更新数据都会对当前组件进行重新渲染,为了性能考虑,
Vue 会在本轮数据更新后,再去异步更新数据。
Vue 会在本轮数据更新后,再去异步更新数据。
渲染异步原理
原理:
dep.notify() 通知 watcher 进行更新操作
-->subs[i].update() 依次调用 watcher 的 update
-->queueWatcher 将 watcher 重新放到队列中
-->nextTick(flushSchedulerQueue) 异步清空 watcher 队列
dep.notify() 通知 watcher 进行更新操作
-->subs[i].update() 依次调用 watcher 的 update
-->queueWatcher 将 watcher 重新放到队列中
-->nextTick(flushSchedulerQueue) 异步清空 watcher 队列
Vue渲染方式
原有模板语法,挂载渲染:就是对使用Vue标签语法的hmtl进行渲染。
<p>Message is: {{ message }}</p>
</div>
</body>
<script src="js/vue.js"></script>
<script type="text/javascript">
var v = new Vue({
el: '#app',
data: {
message: '这是内容'
}
});
</div>
</body>
<script src="js/vue.js"></script>
<script type="text/javascript">
var v = new Vue({
el: '#app',
data: {
message: '这是内容'
}
});
使用render属性 + createElement函数直接渲染
var v = new Vue({
el: '#app',
data: {
message: '这是内容'
},
render: function (createElement) {
return createElement('p', 'Message is:' + this.message)
}
});
el: '#app',
data: {
message: '这是内容'
},
render: function (createElement) {
return createElement('p', 'Message is:' + this.message)
}
});
使用render属性,配合组件的template属性,createElement函数渲染,
--->利用template属性,更为直观
--->利用template属性,更为直观
var MyComponent = {
data () {
return {
message: '这是内容'
}
},
template: `
<div id="app">
<input v-model="message">
<p>Message is: {{ message }}</p>
</div>
`
};
data () {
return {
message: '这是内容'
}
},
template: `
<div id="app">
<input v-model="message">
<p>Message is: {{ message }}</p>
</div>
`
};
使用render属性+配合单文件组件,createElement函数渲染
这种方式是绝大部分Vue项目(官方脚手架就是采用该渲染方式)的渲染方式
https://www.jianshu.com/p/691296af0115
nexttick实现原理?
nexttick方法主要是使用了宏任务和微任务定义了一个异步方法多次调用 nexttick会将方法存入队列中,通过这个异步方法清空当前队列。所以这个 nexttick方法就是异步方法
vue中 Computed的待点原理?
watch中的deep:true是如何实现的?
event & v-model: 事件和v-model的实现原理
slot & keep-alive: 内置组件的实现原理
transition: 过渡的实现原理
vue-router: 官方路由的实现原理
vuex: 官方状态管理的实现原理
loaders
webpack 可以使用 loader 来预处理文件
在 import 或"加载"模块时预处理文件。
loader 用于对模块的源代码进行转换
可以将文件从不同的语言(如 TypeScript)转换为 JavaScript
可使用 Node.js 来很简单地编写自己的 loader
通信方式?
父子组件通信
兄弟组件通信
bus
生命周期
数据初始化
数据监听
模板编译
实例挂载到DOM结构上,数据变化更新DOM
Vue实例先初始化->实例创建
beforeCreate: 在实例初始化之后,数据观测(data observer)之前被调用
页面创建前
created: 实例已经创建完成之后被调用,在这一步,完成已完成以下的配置:数据观测(data observer),属性和方法的运算,watch/event事件回调,这里没有$el
beforeMount: 在挂载开始之前被调用:相关的render函数首次被调用
mounted: el被创建的vm.$el替换,并挂载到实例上去之后调用该钩子
beforeUpdate: 数据更新时调用,发生虚拟DOM重新渲染和补丁之前
updated: 由于数据更改导致的虚拟DOM重新渲染和打补丁,在这之后调用该钩子
beforeDestory: 实例销毁之前调用,在这一步,实例仍然完全可用
destroyed: Vue实例销毁后调用,调用后,Vu实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁,该钩子在服务器端渲染期间不被调用
优化
怎么通过webpack去优化首屏加载时间
Vue3.0
composition-api
setup(){}
login.vue
工程
子主题
我的疑问
0 条评论
下一页