欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue3定義組件的四種方式

 更新時間:2025年03月04日 08:43:56   作者:前端大衛(wèi)  
Vue 作為一款流行的前端框架,提供了多種方式來定義組件,包括單文件組件、渲染函數(shù)、、JSX/TSX 以及函數(shù)式組件、不同的方式適用于不同的場景,本文將對這四種方式進行詳細對比,幫助你找到最適合自己項目的方案,需要的朋友可以參考下

背景

Vue 作為一款流行的前端框架,提供了多種方式來定義組件,包括單文件組件 (SFC)、渲染函數(shù) (Render Functions)、JSX/TSX 以及函數(shù)式組件 (Functional Components)。不同的方式適用于不同的場景,開發(fā)者在選擇時需要考慮可讀性、性能和靈活性等因素。本文將對這四種方式進行詳細對比,幫助你找到最適合自己項目的方案。

1. SFC (Single-File Component)

單文件組件,以 *.vue 作為文件擴展名,是 Vue 官方推薦的方式。

特點:

  • 模板和邏輯分離,結(jié)構(gòu)清晰,官方推薦。
  • 支持 Vue 內(nèi)置功能,如 script setup、CSS 作用域、單文件組件熱更新等。
  • 適合大多數(shù) 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>

優(yōu)點:

  • 代碼結(jié)構(gòu)清晰,符合 MVVM 模式,模板部分易讀。
  • script setup 提供更簡潔的語法,減少模板和邏輯之間的代碼切換。
  • 具有良好的工具鏈支持 (Vue 官方生態(tài)、Vite、Vue Loader 等)。

缺點:

  • 需要額外的構(gòu)建工具 (如 Vite 或 Webpack) 進行編譯,不能直接在瀏覽器運行。
  • 在某些場景下 (如動態(tài)創(chuàng)建組件) 可能不如渲染函數(shù)靈活。

2. 渲染函數(shù) (Render Functions)

Vue 提供了一個 h() 函數(shù)用于創(chuàng)建虛擬節(jié)點 vnodes。

特點:

  • 需要引入 hdefineComponent 函數(shù),沒有模板語法。
  • 適合動態(tài)組件或 UI 庫開發(fā)。

h 是一個 helper 函數(shù),用于創(chuàng)建虛擬 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)]);
  }
});

優(yōu)點:

  • 代碼更靈活,適用于需要動態(tài)控制 VNode 結(jié)構(gòu)的場景,如表單渲染器、可拖拽組件等。
  • 體積更小,不需要 SFC 解析器。

缺點:

  • 代碼可讀性較低,沒有模板語法,編寫復(fù)雜組件時維護成本較高。
  • 開發(fā)體驗不如 SFC 友好,特別是對于不熟悉 JSX/TSX 的開發(fā)者。

3. JSX / TSX

JSX 和 TSX 是 React 的語法擴展,Vue 也支持這種語法。

特點:

  • 語法類似 React,允許在 Vue 組件中使用 JSX/TSX 語法。
  • 適用于更靈活的邏輯處理,且無需引入 h() 函數(shù)。

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>
    );
  }
});

優(yōu)點:

  • 代碼靈活,適用于復(fù)雜 UI 組件開發(fā)。
  • 在 TypeScript 項目中擁有更好的類型推導(dǎo)支持。

缺點:

  • 需要額外的 @vitejs/plugin-vue-jsx 插件支持,并在 tsconfig.json 配置 JSX 選項。
  • 代碼風格不符合 Vue 傳統(tǒng)的模板語法,可能不適合所有團隊。

4. 函數(shù)式組件 (Functional Components) — 不推薦

特點:

  • 組件本質(zhì)上是一個純函數(shù),ref 只能定義在組件外部,屬于全局共享狀態(tài)。
  • 適用于只依賴 props 進行渲染,且無狀態(tài) (stateless) 的組件。

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>
  );
};

優(yōu)點:

  • 代碼簡單,適用于簡單的展示組件 (如按鈕、圖標等)。
  • 沒有響應(yīng)式數(shù)據(jù)追蹤開銷,性能更高。

缺點:

  • 不能在組件內(nèi)部使用 refreactive,狀態(tài)必須是全局變量或 props 傳入。
  • 全局 ref 可能導(dǎo)致多個組件實例共享狀態(tài),引發(fā)意外的狀態(tài)同步問題。

總結(jié)

方式適用場景優(yōu)點缺點
SFC (單文件組件)適用于大多數(shù) Vue 項目結(jié)構(gòu)清晰、官方推薦、支持 script setup需要構(gòu)建工具
渲染函數(shù) (Render Functions)適用于動態(tài)組件/UI 庫代碼更靈活,適用于動態(tài) VNode 結(jié)構(gòu)可讀性較低,維護成本高
JSX / TSX適用于復(fù)雜邏輯組件代碼靈活,可與 TypeScript 結(jié)合需要額外配置,不符合 Vue 傳統(tǒng)語法
函數(shù)式組件適用于無狀態(tài)小組件代碼簡單、性能較高不能使用 ref,全局狀態(tài)共享有風險

在實際開發(fā)中,SFC 是最推薦的方式,大多數(shù) Vue 組件都可以用 SFC 實現(xiàn)。對于動態(tài) VNode 結(jié)構(gòu),可以考慮 渲染函數(shù)JSX/TSX函數(shù)式組件 在 Vue 3 中的使用場景很少,通常不推薦使用。

以上就是Vue3定義組件的四種方式的詳細內(nèi)容,更多關(guān)于Vue3定義組件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • VeeValidate 的使用場景以及配置詳解

    VeeValidate 的使用場景以及配置詳解

    這篇文章主要介紹了VeeValidate 的使用場景以及配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 解決iView中時間控件選擇的時間總是少一天的問題

    解決iView中時間控件選擇的時間總是少一天的問題

    下面小編就為大家分享一篇解決iView中時間控件選擇的時間總是少一天的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • 詳解vue中axios封裝與api接口封裝管理

    詳解vue中axios封裝與api接口封裝管理

    axios的封裝和api接口的統(tǒng)一管理,其實主要目的就是在幫助我們簡化代碼和利于后期的更新維護,在vue項目中,和后臺交互獲取數(shù)據(jù)這塊,我們通常使用的是axios庫,本文就給大家介紹一下axios封裝與api接口封裝管理,需要的朋友可以參考下
    2023-06-06
  • vue實現(xiàn)物流時間軸效果

    vue實現(xiàn)物流時間軸效果

    這篇文章主要為大家詳細介紹了vue實現(xiàn)物流時間軸效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • vue頁面加載閃爍問題的解決方法

    vue頁面加載閃爍問題的解決方法

    這篇文章主要介紹了vue頁面加載閃爍問題的解決方法,文中給大家提到了v-if 和 v-show 的區(qū)別,解決vue頁面加載時出現(xiàn){{message}}閃退的兩種方法,感興趣的朋友一起看看吧
    2018-03-03
  • 在React和Vue中使用Mock.js模擬接口的實現(xiàn)方法

    在React和Vue中使用Mock.js模擬接口的實現(xiàn)方法

    本文將介紹如何在React和Vue項目中使用Mock.js來模擬接口攔截請求,幫助開發(fā)者在不依賴后端的情況下高效地進行前端開發(fā),文中有詳細的代碼示例供大家參考,需要的朋友可以參考下
    2024-08-08
  • vue3實現(xiàn)手機上可拖拽元素的組件

    vue3實現(xiàn)手機上可拖拽元素的組件

    這篇文章主要介紹了vue3實現(xiàn)手機上可拖拽元素的組件,用vue3實現(xiàn)一個可在手機上拖拽元素的組件,可拖拽至任意位置,并且可以防止拖拽元素移出屏幕邊緣
    2022-09-09
  • 詳解如何在Vue中動態(tài)添加類名

    詳解如何在Vue中動態(tài)添加類名

    本文主要介紹了如何在Vue中動態(tài)添加類名,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 基于vue--key值的特殊用處詳解

    基于vue--key值的特殊用處詳解

    這篇文章主要介紹了基于vue--key值的特殊用處詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 一步步帶你用vite簡單搭建ts+vue3全家桶

    一步步帶你用vite簡單搭建ts+vue3全家桶

    Vue3與TS的聯(lián)合是大趨勢,下面這篇文章主要給大家介紹了關(guān)于用vite簡單搭建ts+vue3全家桶的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07

最新評論