渲染函数 API 重大变更
概述
此变更不会影响 <template>
用户。
以下是变更的简要概述
h
现在是全局导入的,而不是作为参数传递给渲染函数- 渲染函数参数已更改,以在有状态组件和函数式组件之间更加一致
- VNode 现在具有扁平的 props 结构
有关更多信息,请继续阅读!
渲染函数参数
2.x 语法
在 2.x 中,render
函数会自动接收 h
函数(它是 createElement
的传统别名)作为参数
js
// Vue 2 Render Function Example
export default {
render(h) {
return h('div')
}
}
3.x 语法
在 3.x 中,h
现在是全局导入的,而不是自动作为参数传递。
js
// Vue 3 Render Function Example
import { h } from 'vue'
export default {
render() {
return h('div')
}
}
VNode Props 格式
2.x 语法
在 2.x 中,domProps
在 VNode props 中包含一个嵌套列表
js
// 2.x
{
staticClass: 'button',
class: {'is-outlined': isOutlined },
staticStyle: { color: '#34495E' },
style: { backgroundColor: buttonColor },
attrs: { id: 'submit' },
domProps: { innerHTML: '' },
on: { click: submitForm },
key: 'submit-button'
}
3.x 语法
在 3.x 中,整个 VNode props 结构已扁平化。使用上面的示例,以下是现在的外观。
js
// 3.x Syntax
{
class: ['button', { 'is-outlined': isOutlined }],
style: [{ color: '#34495E' }, { backgroundColor: buttonColor }],
id: 'submit',
innerHTML: '',
onClick: submitForm,
key: 'submit-button'
}
已注册的组件
2.x 语法
在 2.x 中,当组件已注册时,将组件的名称作为字符串传递给第一个参数,渲染函数将正常工作
js
// 2.x
Vue.component('button-counter', {
data() {
return {
count: 0
}
}
template: `
<button @click="count++">
Clicked {{ count }} times.
</button>
`
})
export default {
render(h) {
return h('button-counter')
}
}
3.x 语法
在 3.x 中,由于 VNode 是无上下文,我们不能再使用字符串 ID 来隐式查找已注册的组件。相反,我们需要使用导入的 resolveComponent
方法
js
// 3.x
import { h, resolveComponent } from 'vue'
export default {
setup() {
const ButtonCounter = resolveComponent('button-counter')
return () => h(ButtonCounter)
}
}
有关更多信息,请参阅 渲染函数 API 变更 RFC。
迁移策略
库作者
h
是全局导入的,这意味着任何包含 Vue 组件的库都将在某个地方包含 import { h } from 'vue'
。结果,这会产生一些开销,因为这需要库作者在他们的构建设置中正确配置 Vue 的外部化
- Vue 不应捆绑到库中
- 对于模块构建,导入应保留并由最终用户捆绑器处理
- 对于 UMD/浏览器构建,它应该首先尝试全局 Vue.h,然后回退到 require 调用
下一步
有关更详细的文档,请参阅 渲染函数指南!