vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > Vue3定义组件

Vue3定义组件的四种方式

作者:前端大卫

Vue 作为一款流行的前端框架,提供了多种方式来定义组件,包括单文件组件、渲染函数、、JSX/TSX 以及函数式组件、不同的方式适用于不同的场景,本文将对这四种方式进行详细对比,帮助你找到最适合自己项目的方案,需要的朋友可以参考下

背景

Vue 作为一款流行的前端框架,提供了多种方式来定义组件,包括单文件组件 (SFC)、渲染函数 (Render Functions)、JSX/TSX 以及函数式组件 (Functional Components)。不同的方式适用于不同的场景,开发者在选择时需要考虑可读性、性能和灵活性等因素。本文将对这四种方式进行详细对比,帮助你找到最适合自己项目的方案。

1. SFC (Single-File Component)

单文件组件,以 *.vue 作为文件扩展名,是 Vue 官方推荐的方式。

特点:

Test.vue 代码如下:

<script setup lang="ts">
import { ref } from "vue";
defineProps<{
  text: string;
}>();

const num = ref(0);
</script>
<template>
  <div class="aaa">
    {{ text }}
    <div @click="num++">{{ num }}</div>
  </div>
</template>

优点:

缺点:

2. 渲染函数 (Render Functions)

Vue 提供了一个 h() 函数用于创建虚拟节点 vnodes

特点:

h 是一个 helper 函数,用于创建虚拟 DOM(VNode)。它是 createElement 的别名,类似于 React 里的 React.createElement。

Test.ts 代码如下:

import { defineComponent, h, ref } from "vue";

export default defineComponent({
  props: {
    text: {
      type: String,
      required: true
    }
  },
  setup(props) {
    const num = ref(0);
    return () =>
      h("div", { class: "aaa" }, [props.text, h("div", { onClick: () => num.value++ }, num.value)]);
  }
});

优点:

缺点:

3. JSX / TSX

JSX 和 TSX 是 React 的语法扩展,Vue 也支持这种语法。

特点:

tsconfig.json 需要配置:

{
  "compilerOptions": {
    "jsx": "preserve",
    "jsxImportSource": "vue"
    // ...
  }
}

vite.config.ts 需要配置 vueJsx 插件:

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import vueJsx from "@vitejs/plugin-vue-jsx";

export default defineConfig({
  plugins: [vue(), vueJsx()]
  // ...
});

Test.tsx 代码如下:

import { defineComponent, ref } from "vue";

export default defineComponent({
  props: {
    text: {
      type: String,
      required: true
    }
  },
  setup(props) {
    const num = ref(0);
    return () => (
      <div class="aaa">
        {props.text}
        <div onClick={() => num.value++}>{num.value}</div>
      </div>
    );
  }
});

优点:

缺点:

4. 函数式组件 (Functional Components) — 不推荐

特点:

Test.tsx 代码如下:

import { ref, type FunctionalComponent } from "vue";

interface Props {
  text: string;
}

const num = ref(0);
export const TestFunctionalCom: FunctionalComponent<Props> = (props) => {
  return (
    <div class="aaa">
      {props.text}
      <div onClick={() => num.value++}>{num.value}</div>
    </div>
  );
};

优点:

缺点:

总结

方式适用场景优点缺点
SFC (单文件组件)适用于大多数 Vue 项目结构清晰、官方推荐、支持 script setup需要构建工具
渲染函数 (Render Functions)适用于动态组件/UI 库代码更灵活,适用于动态 VNode 结构可读性较低,维护成本高
JSX / TSX适用于复杂逻辑组件代码灵活,可与 TypeScript 结合需要额外配置,不符合 Vue 传统语法
函数式组件适用于无状态小组件代码简单、性能较高不能使用 ref,全局状态共享有风险

在实际开发中,SFC 是最推荐的方式,大多数 Vue 组件都可以用 SFC 实现。对于动态 VNode 结构,可以考虑 渲染函数JSX/TSX函数式组件 在 Vue 3 中的使用场景很少,通常不推荐使用。

以上就是Vue3定义组件的四种方式的详细内容,更多关于Vue3定义组件的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文