Vue3.0预学习

  • Vue3要来了Vue2就要过时了吗
    • Vue3
    • Vue2.x马上就要过时了吗
    • Vue3升级内容
    • Proxy实现响应式
    • Object.defineProperty的缺点
    • Proxy实现响应式
  • Proxy基本使用
    • Reflect作用
  • Vue3用Proxy实现响应式
    • Proxy实现响应式
  • 总结

Vue3要来了Vue2就要过时了吗

Vue3

Vue3尚未发布,还在开发中
面试会考察候选人对新技术的关注程度(Vue太热门)
新版本发布之后,再做补充

Vue2.x马上就要过时了吗

Vue3从正式发布到推广开发,还需要一段时间
Vue2.x应用范围非常广,有大量项目需要维护、升级
Proxy存在浏览器兼容性问题,且不能polyfill

Vue3升级内容

全部用ts重写(响应式、vdom、模板编译等)
性能提升,代码量减少
会调整部分API

Proxy实现响应式

回顾Object.defineProperty
Proxy实现响应式
两者对比

Object.defineProperty的缺点

回深度监听需要一次性递归
无法监听新增属性/删除属性(Vue.set Vue.delete)
无法原生监听数组,需要特殊处理

Proxy实现响应式

基本使用
Reflect
实现响应式

Proxy基本使用

// const data = {//     name: 'zhangsan',
//     age: 20,
// }
const data = ['a', 'b', 'c']const proxyData = new Proxy(data, {get(target, key, receiver) {// 只处理本身(非原型的)属性const ownKeys = Reflect.ownKeys(target)if (ownKeys.includes(key)) {console.log('get', key) // 监听}const result = Reflect.get(target, key, receiver)return result // 返回结果},set(target, key, val, receiver) {// 重复的数据,不处理if (val === target[key]) {return true}const result = Reflect.set(target, key, val, receiver)console.log('set', key, val)// console.log('result', result) // truereturn result // 是否设置成功},deleteProperty(target, key) {const result = Reflect.deleteProperty(target, key)console.log('delete property', key)// console.log('result', result) // truereturn result // 是否删除成功}
})

Reflect作用

和Proxy能力一一对应
规范化、标准化、函数式
替代掉Object上的工具函数

Vue3用Proxy实现响应式

Proxy实现响应式

深度监听,性能更好
可监听新增/删除属性
可监听数组变化

// 创建响应式
function reactive(target = {}) {if (typeof target !== 'object' || target == null) {// 不是对象或数组,则返回return target}// 代理配置const proxyConf = {get(target, key, receiver) {// 只处理本身(非原型的)属性const ownKeys = Reflect.ownKeys(target)if (ownKeys.includes(key)) {console.log('get', key) // 监听}const result = Reflect.get(target, key, receiver)// 深度监听// 性能如何提升的?return reactive(result)},set(target, key, val, receiver) {// 重复的数据,不处理if (val === target[key]) {return true}const ownKeys = Reflect.ownKeys(target)if (ownKeys.includes(key)) {console.log('已有的 key', key)} else {console.log('新增的 key', key)}const result = Reflect.set(target, key, val, receiver)console.log('set', key, val)// console.log('result', result) // truereturn result // 是否设置成功},deleteProperty(target, key) {const result = Reflect.deleteProperty(target, key)console.log('delete property', key)// console.log('result', result) // truereturn result // 是否删除成功}}// 生成代理对象const observed = new Proxy(target, proxyConf)return observed
}// 测试数据
const data = {name: 'zhangsan',age: 20,info: {city: 'beijing',a: {b: {c: {d: {e: 100}}}}}
}const proxyData = reactive(data)

性能如何提升的?
只有get时递归,而且不是一次性递归,获取proxyData.info时只会到city和a这一层,不会到b、c、d、e这一层

总结

Proxy能规避Object.defineProperty的问题
Proxy无法兼容所有浏览器,无法polyfill

(六)Vue3.0预学习相关推荐

  1. vue3.0 先遣学习

    vue3.0 中文预览地址 vue3.0 github地址 怎么使用vue-cli生成vue3.0的项目? 安装vue-cli v4.5以上版本 npm install -g @vue/cli vue ...

  2. th:text为null报错_为vue3.0的学习TS解读高级类型

    知识点摘要 本节课主要关键词为: 自动类型推断 / 类型断言 / 类型别名(type) / 映射类型(Pick/Record等...) / 条件类型(extends) / 类型推断(infer) 自动 ...

  3. as button onitemclicklistener为null_为vue3.0的学习TS解读高级类型

    知识点摘要 本节课主要关键词为: 自动类型推断 / 类型断言 / 类型别名(type) / 映射类型(Pick/Record等...) / 条件类型(extends) / 类型推断(infer) 自动 ...

  4. vue3.0需要学习的技术栈

    相关库名称在线地址

  5. 如何搭建一个完整的Vue3.0 + ts 的项目

    如何搭建一个完整的Vue3.0 + ts 的项目 相信9月18日尤大大的关于Vue3.0的发表演讲大家一定有所关注,现在Vue3.0 也已经进入RC阶段(最终产品的候选版本,如果没有问题则可发布成为正 ...

  6. vue3.0中props父子传值的改动

    前言: 对vue3.0的学习以及对技术更新升级内容的整理与使用,这里分析下他的props父子传值的改动. vue官方入口 目录 一.vue2.0中props的用法 1.父组件中 a.vue中 2.子组 ...

  7. vue3.0 php,使用Vue3.0收获的知识点(一)

    前端发展百花放,一技未熟百技出. 茫然不知何下手,关注小编胜百书. 近期工作感觉很忙,都没有多少时间去写文章,今天这篇文章主要是将自己前期学习Vue3.0时候整理的一些笔记内容进行了汇总,通过对本文的 ...

  8. vue3.0响应式源码实践,vue3.0初体验

    vue3.0响应式源码实践,vue3.0初体验 镇楼图--杀生丸.jpg vue-next(vue3.0预体验) 1. 使用: 2.vue-next的目录结构 3. reactive内部实现 作者上篇 ...

  9. SDU信息门户(10)前端vue3.0代码分析

    2021SC@SDUSC 目录 一.引言 二.代码分析 1.答辩检查组件 2.文件系统组件 3.公告组件 4.教师发布题目组件 三.总结 一.引言 SDU信息门户中前端主要使用了Vue3.0的技术,这 ...

最新文章

  1. 移动端像素概念,viewport,适配
  2. CompletableFuture多任务组合
  3. 如何修改ECShop发货单查询显示个数
  4. 在使用多表的查询显示的时候 建议使用视图
  5. 步进电机五根线怎么接_步进驱动和伺服驱动的区别
  6. 题库明细 使用HTML+CSS开发商业站点
  7. CSS默认可继承样式
  8. VC 6.0 : Cannot open include file: 'streambuf': No such file or directory !!
  9. Linux系统调用原理及实现
  10. 微信小程序自定义Modal弹框
  11. 吉林大学计算机学院三等奖学金,吉林大学奖学金评定方案.doc
  12. 善用 Google 的 手气不错 I'm feeling lucky 搜索
  13. 2018互联网行业寒冬裁员实录:整个11月 公司微信群里消失了200多人
  14. 计算机网络(3)--应用层协议--HTTP与HTTPS
  15. 7-4 计算职工工资(15分)
  16. 整理了一下oxidized+mysql+gitlab,感觉很好用,做个记录
  17. oracle读取数字时添加小数或者加上分隔符
  18. python实现二维码识别软件_OpenCV和Zbar两个Python模块实现二维码和条形码识别
  19. 「Do.002」有道云笔记--好用但不安全
  20. 计算机丢失UxTheme无法修复,RWUXThemeSU90.dll

热门文章

  1. 使用OpenCV进行多边形绘制和填充
  2. Win10+Anaconda环境下安装PyTorch
  3. 第19课:知识挖掘与知识图谱概述
  4. react 按照一级路由 分包加载
  5. Linux下导入,导出mysql数据库的命令
  6. 在JAVA中如何检查字符串日期的合法性
  7. java数据结构-Vector
  8. 2016 ACM/ICPC Asia Regional Dalian Online
  9. 构造函数不能为虚函数
  10. Gitlab7.0通知邮箱的配置(smtp)