Vue.js渲染函数是应对复杂UI场景的底层能力出口,适用于结构动态、逻辑嵌套深、插槽组合多或需运行时决定DOM形态的场景,通过h()构建VNode,以JS逻辑精准控制标签、条件、属性、事件与插槽。

Vue.js 渲染函数不是模板的替代品,而是应对复杂 UI 场景的底层能力出口。它不追求“写得更多”,而在于“控制得更准”——当结构动态、逻辑嵌套深、插槽组合多、或需运行时决定 DOM 形态时,渲染函数才真正显现出不可替代性。
用 h() 构建可变标签与条件结构
模板里写六个 v-if 嵌套来切换标题层级,既重复又难维护;渲染函数中只需一行表达式即可完成:
- 标签名直接拼接:
h('h' + this.level, this.$slots.default) - 条件逻辑交由 JS 控制:比如根据
typeprop 返回h('button')、h('a')或h(MyLink) - 子节点支持数组、字符串、null 或 undefined ——
message ? h('p', message) : null自动跳过渲染
通过数据对象精细绑定属性与事件
渲染函数的数据对象(第二个参数)是 UI 行为的配置中心,比模板指令更透明、更可编程:
-
class和style接收对象或数组,支持响应式计算:{ active: this.isActive, 'text-bold': this.strong } -
on绑定事件处理器,无需修饰符语法;需拦截回车可写:on: { keydown: e => e.key === 'Enter' && this.submit() } -
attrs写原生属性(如id、data-id),props传组件 props,domProps操作真实 DOM 属性(如innerHTML)
灵活处理插槽,尤其是作用域插槽
插槽不是“占位符”,而是可执行的函数。渲染函数让插槽使用从声明式转向函数式:
立即学习“前端免费学习笔记(深入)”;
- 默认插槽:
this.$slots.default是 VNode 数组,可直接透传或包装:h('section', this.$slots.default) - 具名插槽:
this.$slots.header、this.$slots.footer,按需插入 - 作用域插槽:
this.$scopedSlots.item({ row, index })调用后返回 VNode,适合表格行、列表项等需上下文数据的场景
封装高阶逻辑,避免模板膨胀
当一个组件既要支持多种布局模式(卡片/列表/网格),又要兼容不同数据源(数组/Map/AsyncIterator),模板很快会失控。渲染函数更适合做“逻辑分发器”:
- 把渲染分支抽成私有方法:
renderList()、renderGrid()、renderSkeleton() - 统一入口返回:
return this.mode === 'grid' ? this.renderGrid() : this.renderList() - 配合
setup()+ref/computed,状态驱动渲染路径,而非模板指令堆叠


















