[原文链接 ]
Slots:新语法,性能改进为3.0做准备
改用 v-slot 指令
//默认插槽 <baz v-slot ="baz"> {{baz}} </ baz > //嵌套默认插槽 //组件提供的范围变量也在该组件本身上声明 <foo v-slot="foo"> <bar v-slot="bar"> <baz v-slot="baz"> {{ foo }} {{ bar }} {{ baz }} </baz> </bar> </foo> //具名域槽 <my-name> <template v-slot:one="{ msg }"> {{ msg }} </template> </my-name> //混用插槽 <foo> <template v-slot:one="one"> <bar v-slot="bar"> <div>{{ one }} {{ bar }}</div> </bar> </template> <template v-slot:two="two"> <bar v-slot="bar"> <div>{{ two }} {{ bar }}</div> </bar> </template> </foo>
异步错误处理
Vue的内置错误处理机制(errorCaptured钩子和全局errorHandler钩子),现在也捕获v-on处理程序内部的错误。
建议使用async / await 异步函数隐式返回Promises
export default { async mounted() { //如果在这里抛出异步错误,由errorCaptured和Vue.config.errorHandler捕获 this.posts = await api.getPosts() } }
动态指令参数
指令参数现在可以接受动态JavaScript表达式
动态参数值应该是字符串,但允许null作为一个明确指示应该删除绑定的特殊值,那将会很方便。任何其他非字符串值都可能出错,并会触发警告。(仅适用于v-bind和v-on)
<div v-bind:[attr]="value"></div> //简写 <div :[attr]="value"></div> <button v-on:[event]="handler"></button> //简写 <button @[event]="handler"></button> <my-component> <template v-slot:[slotName]> Dynamic slot name </template> </my-component> //简写 <foo> <template #[name]> Default slot </template> </foo> <div :[key + 'foo']="value"></div> //可能不会执行 //使用 <div :[`${key}foo`]="value"></div>
编译警告位置信息
大多数模板编译警告现在都带有源范围信息。
显式创建独立活动对象
引入了一个新的全局 API,可以用来显式地创建响应式对象:
const reactiveState = Vue.observable({ count: 0 }) //生成的对象可以直接用在计算属性 (computed property) 和渲染函数(render) 中,并会在被改动时触发相应的更新。
服务器端渲染期间的数据预取(SSR)
serverPrefetch钩子允许(而不是仅仅路线级组件)的任何部件的服务器端渲染期间预取数据,从而允许更灵活的使用和减少数据提取与路由器之间的耦合。
像Nuxt这样的项目vue-apollo已经计划使用这个新功能简化他们的实现。
重要的内部变化
nextTick
在2.5.0中,我们进行了内部调整,nextTick如果在v-on事件处理程序中触发更新,则会导致使用Macrotasks而不是Microtasks对更新进行排队。
这最初的目的是修复一些浏览器边缘情况,但反过来又导致了许多其他问题。
在2.6中,我们找到了原始问题的一个更简单的解决方案,它允许我们nextTick在所有情况下恢复一致地使用Microtasks。
this.$scopedSlots现在的函数总是返回Arrays
(此改动只影响使用 render 函数的用户)在 render 函数中,传入的 scoped slot 以函数的形式被暴露在 this.$scopedSlots 上面。
在之前的版本中,这些函数会基于父组件传入的内容不同而返回单个 VNode 或是一个 VNode 的数组。
这是当初实现时的一个疏漏,导致了 scoped slot 函数的返回值类型是不确定的。
2.6 当中,所有的 scoped slot 函数都只会返回 VNode 数组或是 undefined。
如果你的现有代码中使用了 this.$scopedSlots 并且没有处理可能返回数组的情况,那么可能会需要进行相应的修正。