作者|尤雨溪

译者|薛命灯

近日,尤雨溪在 medium 上宣布推出 Vue 2.6——代号“Macross”。尤雨溪表示,在过去的一年中,他们在开发新 CLI 和 3.0 原型设计上花了很多时间。因此,Vue core 2.x 在很长一段时间内都没有推出重大更新。现在是时候了,2.6 版本带来了一些实质性的改进、内部变更和新功能,本文将会重点介绍。

如果需要了解完整的详细信息,请务必查看 GitHub 上的发行说明:

https://github.com/vuejs/vue/releases/tag/v2.6.0

slot:新语法、性能改进、向 3.0 看齐

slot 是在 Vue 中灵活组合组件的一种重要机制。在 3.0 版本原型设计过程中,我们发现了很多可以改进它的方法。其中一些不会带来重大变更,可以在 2.x 的次要版本中发布。对于那些需要做出重大变更的,我们也在努力尝试在 2.x 版本中提供渐进式的替代方案,让将来的迁移变得更容易些。

新语法

首先是 scoped slot 的新语法。我们提出、讨论并试验了多种不同的设计:

  • https://github.com/vuejs/vue/issues/9180
  • https://github.com/vuejs/vue/issues/9306
  • https://github.com/vuejs/rfcs/pull/2

最终确定了这个 RFC 所描述的 v-slot 语法:

https://github.com/vuejs/rfcs/blob/master/active-rfcs/0001-new-slot-syntax.md

以下是使用命名 slot 的一个简短示例:

Header

{{ data.title }}

{{ data.text }}

Footer

使用了多个命名 slot 的组件的 v-slot 用法。

新语法通过单个指令使用普通的 slot 和 scoped slot,并强制要求使用更明确和具有更高可读性的命名 slot。它与现有语法完全兼容,马上就可以在 2.6 中发布。

如果你已熟悉现有的 slot 语法,我们建议你阅读一下这个 RFC,以更好地理解新语法背后的基本原理:

https://github.com/vuejs/rfcs/blob/master/active-rfcs/0001-new-slot-syntax.md

如果你对 slot 还不熟悉,建议先查看一下更新的 slot 文档:

https://vuejs.org/v2/guide/components-slots.html

性能改进

我们将在 3.0 版本中看到有关 slot 的另一个改进,即普通 slot 和 scoped slot 的实现将得到统一,主要是因为 scoped slot 在性能方面的优势。普通 slot 将在父组件的渲染周期中渲染。当 slot 的依赖项发生变化时,会导致父组件和子组件进行重新渲染。另一方面,scoped slot 被编译成内联函数,并在子组件的渲染周期中被调用。

这意味着子组件将会收集 scoped slot 所依赖的所有数据依赖项,从而做出更精确的更新。在 2.6 版本中,我们引入了一种优化手段(https://github.com/vuejs/vue/pull/9371),进一步确保父组件的依赖项变化仅影响到父组件,并且如果只使用了 scoped slot,就不会强制子组件做出更新。

此外:

  • 所有使用新 v-slot 语法的 slot 都将被编译为 scoped slot,这意味着所有使用新语法的 slot 都会自动获得性能提升;
  • 现在所有普通的 slot 也通过 this.$scopedSlots 暴露出来,这意味着使用 render 函数而不是模板的用户现在也可以使用 this.$scopedSlots,而不用担心传入的 slot 是什么类型。

在 3.0 中,将不再区分 scoped 与非 scoped slot——所有 slot 将使用统一的语法,被编译为相同的格式,并具有相同的性能。

异步错误处理

Vue 的内置错误处理机制(组件内 errorCaptured hook 和全局 errorHandler hook)现在也会捕获 v-on 处理程序内部的错误。此外,如果任意一个生命周期 hook 或事件处理程序执行了异步操作,现在可以从函数中返回一个 Promise,Promise 链中任何一个未被捕获的错误都会被发送给错误处理程序。如果使用了 async/await,则会变得更加容易,因为异步函数隐式返回 Promise:

export default { async mounted() { // if an async error is thrown here, it now will get // caught by errorCaptured and Vue.config.errorHandler this.posts = await api.getPosts() }}

生命周期 hook 中的异步错误处理

动态指令参数

指令参数现在可以接受动态 JavaScript 表达式:

 Dynamic slot name 

更多细节可以在这个 RFC 中找到:

https://github.com/vuejs/rfcs/blob/master/active-rfcs/0003-dynamic-directive-arguments.md

为了方便起见,如果参数值为 null,则绑定和监听器会被移除。库的作者要注意:这个功能要求 Vue 运行时为 2.6.0 及以上版本。如果你提供预编译的组件,并希望保持与 2.6 之前版本的兼容性,请避免在源代码中使用它。

编译器警告消息中的代码帧

这要感谢 GitHub 用户 @gzzhanghao 提出的拉取请求:

https://github.com/vuejs/vue/pull/7127

从 2.6 版本开始,大多数模板编译警告消息现在都带有源码区间信息。这样我们就能够为这些警告消息生成更好的代码帧:

显式创建单独的反应式对象

2.6 版本引入了一个新的全局 API 来显式创建单独的反应式对象:

const reactiveState = Vue.observable({ count: 0})

生成的对象可以直接用在计算属性或 render 函数中,并在发生变化时触发适当的更新。

服务器端渲染期间的数据预取

新的 serverPrefetch hook(https://ssr.vuejs.org/api/#serverprefetch)允许任何组件(不仅仅是路由级别的组件)在服务器端渲染期间预取数据,使使用更加灵活,并降低数据获取和路由器之间的耦合。一些项目(如 Nuxt 和 vue-apollo)已经计划通过这个新功能来简化它们的实现。

新 ES 模块构建,可直接导入使用

之前,我们的 ES 模块构建主要目标是与捆绑包一起使用。这些构建包含了在编译时需要替换为环境变量的内容。Vue 2.6 现在提供了新的 ES 模块构建,目标是直接在浏览器中使用:

重要的内部变更

让 nextTick 恢复使用 Microtask

在 2.5.0 版本中,我们做出了一个内部调整,如果更新是在 v-on 事件处理程序中触发的,则会导致 nextTick 使用 Macrotask(而不是 Microtask)来让更新进入队列。最初这么做是为了修复一些浏览器的边界情况,但反过来又导致了很多其他问题。在 2.6 版本中,我们为原始问题找到了一个更简单的修复方案,这样我们就可以在任何情况下恢复 nextTick 使用 Microtask。

如果你对这方面的技术细节感兴趣,请在此处查看:

https://gist.github.com/yyx990803/d1a0eaac052654f93a1ccaab072076dd

通过 this.$scopedSlots 暴露的函数现在总是返回 Arrays

这个变更只影响 render 函数用户。在 render 函数中,scoped slot 通过 this.$scopedSlots 暴露为函数。到目前为止,调用 scoped slot 函数可能返回单个 VNode 或 VNode 数组,具体取决于父组件传入的是什么。这种设计实际上是一种疏忽,因为它返回的值类型是不确定的,并且可能会导致意外的边界情况。

在 2.6 版本中,scoped slot 函数确保只返回 VNode 数组或 undefined。已有代码中如果有些地方返回的是数组,但没有被检查出来,可能会出问题。更多细节请看这里:

https://gist.github.com/yyx990803/f5cba7711ab57b5d0dd1f8261ebee278

vuejs 传参 向 子组件 父组件_Vue 2.6发布:新语法、性能改进、向3.0看齐相关推荐

  1. vuejs 传参 向 子组件 父组件_VUe.js 父组件向子组件中传值及方法

    父组件向子组件中传值 1.  Vue实例可以看做是大的组件,那么在其内部定义的私有组件与这个实例之间就出现了父子组件的对应关系. 2. 父子组件在默认的情况下,子组件是无妨访问到父组件中的数据的,所以 ...

  2. vue2.0父向子传参,子向父传参,路由传参

    父向子传值: //父组件 <selectionGroup v-for="item in tab" :item="item"></selecti ...

  3. react 函数组件父组件调用子组件方法

    react 函数组件父组件调用子组件方法 父组件利用ref对子组件做标记,通过调用子组件方法更改子组件状态,也可以调用子组件方法 首先在父组件中 ,使用useRef创建一个ref import Log ...

  4. VUE:父子组件间传参、子组件传值给父组件、父组件传值给子组件

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Vue是一个轻量级的渐进式框架,对于它的一些特性和优点在此就不做赘述,本篇文章主要来探讨一下Vue子 ...

  5. vue 父刷新子_父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法...

    场景: 我实际用到的是这样的,我父组件引用子组件related,父组件调用获取页面详情的方法,更新了state值related,子组件根据该related来渲染相关新闻内容,但是页面打开的时候总是先加 ...

  6. 小程序中子组件父/组件互相传值以及互相接收

    //show_none 组件遮罩属性[true-false] //compontpass子组件传值父组件接收 //modal-d 父组件传值子组件接收 //pract_moules_id 父组件页面中 ...

  7. 前端学习(3304):函数组件组件父组件子组件forwarRef聚焦

  8. 前端学习(3302):类组件父组件和子组件createRef

  9. jquery html页面传参,【已解决】jquery中如何跳转新页面时传递参数

    折腾: 期间,已经可以用: window.location = bookDetailUrl 实现页面跳转,但是需要传递参数过去.需要搞清楚如何传递参数比较好. jquery pass paramete ...

  10. 子组件向父组件传参的几种方法

    子组件向父组件传参的几种方法 在用vue框架写项目的时候,多多少少会遇到子组件向父组件传参的方法.作为一个新手,确实让人头疼,于是便有了这篇小白写的总结,话不多说,开始! 以下方法全部基于这两个父子组 ...

最新文章

  1. MFC - 获取程序当前路径
  2. bzoj2190 [SDOI2008]仪仗队(欧拉函数)
  3. 为什么python用不了中文_【TK例子】为什么不显示中文
  4. 隐马尔可夫模型HMM学习备忘
  5. 矩池云上如何安装nvcc
  6. halcon 差异模型 异物_基于HALCON的形状匹配算法的研究和心得总结
  7. tensorflow中获取shape的方法比较
  8. OpenGL超级宝典(第7版)笔记12 前三章回顾 OpenGL扩展简介
  9. 北京理工大学计算机考研真题,北京理工大学计算机专业基础历年考研真题汇编附答案...
  10. 手机远程共享计算机文件,电脑如何共享文件到手机
  11. python编程最大值_python求最大值最小值方法总结
  12. python UI自动化自动关闭浏览器学习记录
  13. IDEA关联MySQL数据库库
  14. 投影仪幕布增益_别再说幕布是花瓶 投影幕布的作用原来这么大
  15. cpu flags 一致性检查
  16. c语言(cn)括号的作用,c语言小括号的用法
  17. Scala 模式匹配 match-case
  18. [转载]性能测试中TPS和并发用户数估算
  19. 我的一周所学(黑马的课)
  20. 安卓控制新大陆云平台(一)

热门文章

  1. centos标准分区调整大小_磁盘怎么调整分区大小 磁盘调整分区大小教程【详细步骤】...
  2. 面试题之GC是什么?为什么要有GC?
  3. spring源码:@Bean注解解析
  4. OCP题库062新出现的考试题-第23题
  5. 正则全攻略使用手册,你确定不进来看看吗
  6. [洛谷P3613]睡觉困难综合征
  7. html5 jquery音乐播放器,play()和pause()不起作用
  8. Django Form 详解
  9. linux下文件系统swap交换分区及dd命令详解(3)
  10. (一)Flask 学习 —— Hello World