提升 Vue 项目开发效率:高阶组件 RenderFunction 的灵活性与实战应用

Vue 3 开发中,我们常常需要创建可复用的组件,但传统的组件封装方式有时会带来限制。比如,一个表格组件可能需要支持不同的数据结构,一个弹窗组件可能需要动态更改内容。面对这种需求,我们通常会通过 slotsScoped Slots 来解决,但它们的灵活性仍然有限。

有没有更好的方法?答案是:直接让组件接受一个渲染函数,让父组件完全控制渲染逻辑,而 RenderFunction 组件仅负责调用这个函数。这样,我们就能实现 更高自由度的组件定制能力,避免重复封装多个类似的 UI 组件。

实现

tsx 复制代码
import type { PropType, VNodeTypes } from "vue";
import { defineComponent } from "vue";

export type RenderFunc = (props: Record<string, unknown>) => VNodeTypes;

export default defineComponent({
  name: "RenderFunction",
  props: {
    renderFunc: {
      type: Function as PropType<RenderFunc>,
      required: true,
    },
  },
  render() {
    return this.renderFunc(this.$attrs);
  },
});

Props

Prop 名称 类型 是否必填 说明
renderFunc (props: Record<string, unknown>) => VNodeTypes 传递自定义渲染函数,返回 Vue 虚拟 DOM 节点
v-bind="$attrs" Record<string, unknown> 组件外部传入的额外属性,作为 renderFunc 的参数

适用场景

场景 说明
动态组件渲染 让父组件决定如何渲染,而不是硬编码 UI 结构
自定义 UI 组件 适用于开发可定制的 UI 库,如动态表单、可变布局组件
高阶组件(HOC RenderFunction 作为通用的渲染容器,实现不同 UI 逻辑
JSX 支持 结合 JSX,使渲染逻辑更简洁

示例

vue 复制代码
<template>
  <RenderFunction :renderFunc="myRenderFunc" :message="'Hello, Vue!'" />
</template>

<script setup lang="ts">
import { h } from "vue";
import RenderFunction from "./RenderFunction.vue";

const myRenderFunc = (props: Record<string, unknown>) => {
  return h("div", { class: "custom-class" }, `Message: ${props.message}`);
};
</script>

说明

  • renderFunc 负责定义组件的渲染方式。
  • props 参数用于传递动态数据。

结合 JSX 语法

如果你喜欢 JSX 语法,可以这样写:

vue 复制代码
<script setup lang="tsx">
import RenderFunction from "./RenderFunction.vue";

const myRenderFunc = (props: Record<string, unknown>) => (
  <div style="color: blue;">{props.message}</div>
);
</script>

<template>
  <RenderFunction :renderFunc="myRenderFunc" :message="'Hello JSX!'" />
</template>

说明

  • JSX 语法使代码更加直观,可读性更高。
  • 适用于 Vue 3<script setup> 语法。

适用于动态 UI

可以使用 RenderFunction 渲染不同结构的 UI,比如表格:

vue 复制代码
<template>
  <RenderFunction :renderFunc="tableRender" :data="items" />
</template>

<script setup lang="ts">
import { h } from "vue";
import RenderFunction from "./RenderFunction.vue";

const items = [
  { id: 1, name: "Vue" },
  { id: 2, name: "React" },
  { id: 3, name: "Svelte" },
];

const tableRender = (props: Record<string, unknown>) => {
  return h("table", { border: 1 }, [
    h("tr", [h("th", "ID"), h("th", "Name")]),
    ...props.data.map((item: any) =>
      h("tr", [h("td", item.id), h("td", item.name)])
    ),
  ]);
};
</script>

说明

  • RenderFunction 组件使表格结构可以动态配置,无需创建新的子组件。

总结

  1. RenderFunction 组件是一种 高阶渲染组件,提供极大的灵活性。
  2. 适用于 动态 UI、JSX、自定义渲染逻辑 的场景。
  3. 避免创建多个类似的 UI 组件,提高代码复用性。

如果你的项目有 动态内容渲染需求 ,这个组件将是一个 高效且优雅的解决方案!

相关推荐
当时只道寻常6 分钟前
Vue3 集成 NProgress 进度条:从入门到精通
前端·vue.js
kyriewen7 分钟前
React性能优化:从“卡成狗”到“丝般顺滑”的5个秘诀
前端·react.js·性能优化
米丘7 分钟前
Vue 3.x 单文件组件(SFC)模板编译过程解析
前端·vue.js·编译原理
helloweilei9 分钟前
Web Streams 简介
前端·javascript
悟空瞎说10 分钟前
Flutter热更新 Shorebird CodePush 原理、实现细节及费用说明
前端·flutter
didadida26210 分钟前
从“不存在”的重复请求,聊到 Web 存储的深坑
前端
xiaominlaopodaren11 分钟前
Three.js 渲染原理-透明渲染为什么这么难
前端
米丘13 分钟前
vue3.x 内置指令有哪些?
前端·vue.js
米丘14 分钟前
Vue 3.x 模板编译优化:静态提升、预字符串化与 Block Tree
前端·vue.js·编译原理