前言:
业务设计的能力
基本使用,高级特性,周边插件
基本原理的了解,热门技术的深度,全面性
实际应用,设计能力 组件结构, 数据结构
正常工作,原理,设计能力(独立自主)
面对产品经理提出需求,能够实现出来
Vue概念服务资料:
1vue内部原理剖析
一:VUE使用
高级用法不一定常用,要知道他们的存在
建议,先学vue2再到vue3
vue2社区生态比较好,2年了。不会立马更新到vue3。
文档是备忘录,给会用的人查阅的,所以是低效率的,时间有限,青春是很短暂的。
基本使用
日常使用,面试必考。梳理知识点,挑出重点和核心。
插值,指令
v-html:xss风险,会覆盖子元素
列表渲染
key=业务id
//key 应该是唯一的,数组中没有的话,就让后端加
v-for="(item,index) in listArr" :key="item.id"// 数组
v-for= "(item,key,index) in listObj :key="key" //对象
listArr = [
{id:'a',title:'标题'}
]
listObj = {
a:{title:'标题'}
}
ps** v-if v-for 不能写在一起,分开可以
事件
//事件被挂载当前元素; methods中,获取到的event是原生的
@click="increment1"
@click = "increament2(2,@event)"//注意传参的写法
//事件修饰符
.stop //阻止单击事件继续传播
.submit.prevent // 提交事件不再重载页面
:click.stop.prevent //
:click.capture //
:click.self //
v-model.tirm
表单(写一下)
Vue组件使用
props,$emit
组件通讯-自定义事件
组件生命周期
vue高级特性
- 自定义v-model
- $next Tick
- refs
- slot
- 动态组件
- 异步组件
- keep-alive
- mixin
this.$emit // 调用父组件定义的事件
...
//创建事件的组件
event.$emit('onAddTitle',this.title) // 调用自定义事件(事件名,参数)
//侦听事件的组件
mounted(){
event.$on('onAddTitle',this.addTitleHandler)
}
beforeDestory(){
event.$off('onAddTitle',this.addTitleHandler)
二:vue原理
前言:知其然知其所以然;了解原理,才能应用的更好。大厂造轮子(大公司,小公司听到碰不到)
组件化基础
很久以前的组件化
- asp php
- node.js
区别
传统组件,只是静态渲染,更新还要依赖于操作dom
数据驱动视图 vue mvvm(画图,加代码讲一边+数据驱动视图的相关描述)
vue响应式(重点)
组件data的数据变化,立即触发视图更新
实现数据驱动视图第一步
解答:
- 核心API Object.defineproperty(代码演示)
- 上面的API缺点(结合Vue3.0Proxy)
proxy有兼容性的问题
Proxy兼容性不好,且无法polyfill
2.0会存在一段时间
object.defineProperty基本用法
代码演示:
get set
object.defineProperty实现响应式
- 监听对象,数组
- 复杂对象,深度监听
- 缺点
缺点:(不要放大缺点)
- 深度监听,递归到底,一次性计算量大。极端例子,如果对象很大,页面会卡死。
- 无法监听新增删除属性(Vue.set vue.delete)老项目很重要
- 无法原生监听数组,需要特殊处理
手写一遍
核心:
1.Object.defineProperty(target,key,value){}
2.defineReactive(target,key,value){}
3.Observer(target){}
1.是核心API
2.1在2中进行遍历(处理一些情况)
function updateView(){
console.log("更新视图")
}
function defineReactive(target,key,value){
// console.log(target,key,value);
Observer(value);
Object.defineProperty(target,key,{
get(){
console.log("getter");
return value;
},
set(newValue){
if(newValue === value){
return;
}
Observer(value);
console.log("setter");
value = newValue;
updateView();
}
})
}
function Observer(target){
if(typeof target !== 'object' || target === null){
return;
}
// Object.keys(target).forEach(key => {
// defineReactive(target,key,target[key]);
// })
for(let key in target){
defineReactive(target,key,target[key]);
}
}
// 新增 或者 删除 属性 侦听不到
// 用 Vue.set(obj,key,val) 方法
mounted () {
this.$set(this.student,"age", 24)
}
// Vue.delete(obj,key);
虚拟dom和diff
vdom是实现vue和react的重要基石
diff算法是vdom中最核心最关键的部分
vdom是一个热门话题……
- dom操作非常耗费性能(耗时)
- 用jq,可以自行控制dom操作时机,手动调整
- 数据驱动视图,如何有限控制dom操作。
(框架内部问题)
- 有了一定的复杂度,想减少计算次数比较难?
- 能不能吧计算,更多转移为js计算,因为js执行速度很快
- vdom,用js模拟dom结果,计算出最少变更,操作dom
用js 模拟dom结构
//用一个对象模拟里面有tag ,props,children
对象A
tag:标签
props:属性(对象)
children:数组,子项也是一个对象A的格式
通过Snabbdom学习vdom
//vue3.0重写了vdom的代码,优化了性能。
//vdom的基本理念不变
//react vdom 具体实现和vue也不同,不妨碍同一学习
使用Snabbdom,练习
h函数(创建vnode节点)
vnode数据结构与对象A格式相似的
var vnode = h(对象A)
patch函数 初始渲染和更新
patch(container,vnode)
//
patch(vnode,newvnode)
vdom总结
- 用js模拟dom结构(v-node)
- 新旧vnode对比,得出最小的更新范围,最后更新dom
- 数据驱动视图的模式下,有限控制dom操作
diff算法
diff算法概述
- diff即对比,是一个广泛的概念,如Linux diff ,git diff
- 两个js对象也可以做diff
- 两棵树vdom
树diff的时间复杂度o(n^3)
- 第一,遍历tree1,第二,遍历tree2
- 第三,排序
- 1000个节点,要计算1亿次,算法不可用。
框架作者,解决了上面的问题
优化了时间复杂到on
- 只比较同一层级,不跨级比较
- tag不相同,则直接删掉重建,不再深度比较
- tag和key,两者都相同,则认为是相同节点,不再深度比较 (v-for中的key使用业务id)
Snabbdom源码解读
h函数,vnode(),返回vnode对象
最终由h函数返回是一个对象{ sel,data,children,text,elm,key}
patch函数
- hook 生命周期节点
- 第一个参数不是vnode,创建一个空的vnode关联到这个dom元素
- 相同的vnode(key sel相同)
- 不相同,就直接删掉重建
vdom核心概念:h vnode patch diff key
vdom存在的价值重要:数据驱动视图,控制dom操作
模板编译
组件 渲染/更新过程
响应式:监听data属性 getter / setter(包括数组)
模版编译:模版到render 函数,再到vnode
vdom:patch(elem,vnode) 和 patch(vnode,newVnode)
- 初次渲染
- 解释模版为render函数(或在开发环境已完成,vue-loader)
- 触发响应式,监听data属性 getter,setter
- 执行render函数,生成vnode,patch(elem,vnode)
- 更新过程
- 修改data,触发setter,(在getter被侦听)
- 重新执行render函数,生成newVnode
- patch(vnode,newVnode)
- 异步渲染
- 回顾$nextTick
- 汇总data的修改,一次性更新视图
- 减少DOM操作次数,提高性能
前端路由原理
url的组成
协议,域名,host(域名+端口),文件名,查询(?a=100&b=20),hash(#/aa/bb)
项目设计
状态设计
1.内容数据化
2.数据结构化和可扩展性
3.程序的可遍历,可迭代
内容和功能操作要区分
条目啊,创建日期啊,id标识等就是内容
输入,删除,新增,这些就是功能操作
组件设计
数据管理(组件1)
视图显示(组件2)
react to do list
vue 购物车
vue3
let a =1
let b = a*2
// b 会因为a的变化而自动响应式的变化。
使用
proxy 代理 语法实现响应式数据
优点:检测到代理对象属性的动态添加和删除,可以监听到数组的下标和length属性的变更。
setup函数
ref函数
reactive 函数