Open CyanSalt opened 4 years ago
path: vue3-features
最核心的改动之一,详见 https://vue-composition-api-rfc.netlify.com/api.html
以下方法现在由 Vue 导出,而不是挂载在 Vue 对象上:
import { nextTick } from 'vue'
createApp
$mount 的挂载方式被移除,新的挂载方式为
$mount
import { createApp } from 'vue' const app = createApp() app.mount(App, '#app', rootProps)
行为也略有差异:新的 mount 将以元素的 innerHTML 作为模板(2.x 中是 outerHTML),因此 mount 不会替换根元素,而是替换其子元素。
另外,全局的 Vue.use/mixin/component/directive 也被替换为 app.use 等
Vue.use
mixin
component
directive
app.use
全局配置 Vue.config 也被修改为 app.config。原有的扩展 Vue.prototype 的方式被修改为
Vue.config
app.config
Vue.prototype
app.config.globalProperties.$message = () => {}
v-model
原有的 :props.sync 与 v-model 合并,新的语法为
:props.sync
<!-- 新的写法 --> <Component v-model.trim="data" /> <!-- 约等于 Vue 2.x 中的 --> <Component :model-value="data" :model-modifiers="{ trim: true }" @update:modelValue="data = $event"> <!-- 新的写法 --> <Component v-model:foo.trim="data" /> <!-- 约等于 Vue 2.x 中的 --> <Component :foo="data" :foo-modifiers="{ trim: true }" @update:foo="data = $event">
h
h 函数现在是由 Vue 导出的,而不是 render 的参数。render 函数现在不再接受参数
render
import { h } from 'vue'
h 的第一个参数不再支持字符串格式的组件名
h 的第二个参数现在支持两个保留的生命周期 onVnodeMounted 和 onVnodeUpdated
onVnodeMounted
onVnodeUpdated
自定义指令的 bind、inserted、componentUpdated、unbind 更名为 beforeMount、mounted、updated、unmounted,同时添加了 beforeUpdate 和 beforeUnmount,删除了 update,以保持与组件生命周期一致。
bind
inserted
componentUpdated
unbind
beforeMount
mounted
updated
unmounted
beforeUpdate
beforeUnmount
update
此外,由于新的自定义指令被完整绑定在 vnode 上,因此当 v-bind="$attrs" 作用于组件时,自定义指令也将透传到对应的组件上。
v-bind="$attrs"
在 Vue 3 中可以直接将一个函数声明为函数式组件了,接受的参数与 setup 一致,返回值与 render 一致
const FunctionalComponent = (props, { slots, attrs, emit }) => { // ... }
在第二个参数 context 中,data(被 props 代替)、children(被 slots 代替)、injection(被 Composition API 的 inject 代替)、parent 都被移除了;listeners 被移入 attrs 中
context
data
props
children
slots
injection
inject
parent
listeners
attrs
由于函数类型被定义为函数式组件,原本使用 async function 的异步组件现在需要用 Vue 导出的 createAsyncComponent 包裹
createAsyncComponent
新的结构里除了 class 和 style 之外属性都是是铺平的,例如 vnode.on.click 现在是 vnode.onClick,vnode.domProps.innerHTML 现在是 vnode.innerHTML
class
style
vnode.on.click
vnode.onClick
vnode.domProps.innerHTML
vnode.innerHTML
原有的 this.$slots 被删除了,原有的 this.$scopedSlots 改为 $slots,亦即,现在 $slots 是一个值全部为函数的对象
this.$slots
this.$scopedSlots
$slots
transition
v-enter
v-leave
v-enter-from
v-leave-from
v-enter-to
enter-class
leave-class
enter-from-class
v-if
filters
methods
v-on
@keydown.13="submit"
path: vue3-features
1. Composition API
最核心的改动之一,详见 https://vue-composition-api-rfc.netlify.com/api.html
2. 全局 API 修改
以下方法现在由 Vue 导出,而不是挂载在 Vue 对象上:
3.
createApp
$mount
的挂载方式被移除,新的挂载方式为行为也略有差异:新的 mount 将以元素的 innerHTML 作为模板(2.x 中是 outerHTML),因此 mount 不会替换根元素,而是替换其子元素。
另外,全局的
Vue.use
/mixin
/component
/directive
也被替换为app.use
等全局配置
Vue.config
也被修改为app.config
。原有的扩展Vue.prototype
的方式被修改为4. 新的
v-model
语法原有的
:props.sync
与v-model
合并,新的语法为5.
h
函数h
函数现在是由 Vue 导出的,而不是render
的参数。render
函数现在不再接受参数h
的第一个参数不再支持字符串格式的组件名h
的第二个参数现在支持两个保留的生命周期onVnodeMounted
和onVnodeUpdated
6. 指令钩子函数修改
自定义指令的
bind
、inserted
、componentUpdated
、unbind
更名为beforeMount
、mounted
、updated
、unmounted
,同时添加了beforeUpdate
和beforeUnmount
,删除了update
,以保持与组件生命周期一致。此外,由于新的自定义指令被完整绑定在 vnode 上,因此当
v-bind="$attrs"
作用于组件时,自定义指令也将透传到对应的组件上。7. 函数式组件被移除
在 Vue 3 中可以直接将一个函数声明为函数式组件了,接受的参数与 setup 一致,返回值与 render 一致
在第二个参数
context
中,data
(被props
代替)、children
(被slots
代替)、injection
(被 Composition API 的inject
代替)、parent
都被移除了;listeners
被移入attrs
中由于函数类型被定义为函数式组件,原本使用 async function 的异步组件现在需要用 Vue 导出的
createAsyncComponent
包裹8. VNode 格式修改
新的结构里除了
class
和style
之外属性都是是铺平的,例如vnode.on.click
现在是vnode.onClick
,vnode.domProps.innerHTML
现在是vnode.innerHTML
9. Slots API 修改
原有的
this.$slots
被删除了,原有的this.$scopedSlots
改为$slots
,亦即,现在$slots
是一个值全部为函数的对象10. 内置
transition
组件的变更v-enter
和v-leave
类被替换为v-enter-from
和v-leave-from
,以保持和v-enter-to
等一致;同理enter-class
和leave-class
两个 props 也被替换为enter-from-class
等。transition
作为组件的根元素时,外部的v-if
变化将不再触发过渡效果(在 2.x 中实际上是一个未定义的行为)11. 移除废弃/不推荐使用的 API
data
属性不再支持对象类型,而是仅支持函数类型filters
不再支持(多数情况都可以用methods
代替,并且考虑到 Pipeline Operator 已经有提案了)v-on
不再支持 keyCode,例如@keydown.13="submit"
。这个特性已被浏览器废弃