【前端】 Vue 3 中二次封裝組件

在 Vue 3 中二次封裝組件是提高代碼復用性和維護性的重要手段。以下是詳細的封裝方法和最佳實踐:


一、封裝原則

  1. 功能擴展:在原有組件基礎上添加新功能
  2. 定制樣式:統一項目的 UI 設計規范
  3. 簡化接口:隱藏復雜邏輯,提供簡潔的 API
  4. 復用邏輯:封裝可復用的業務邏輯

二、基礎封裝方法

1. 屬性透傳(Props)
<script setup>
import BaseButton from './BaseButton.vue'const props = defineProps({// 擴展原生屬性size: {type: String,default: 'medium'},// 新增自定義屬性loading: Boolean
})
</script><template><BaseButtonv-bind="$attrs"  // 透傳所有未聲明的屬性:class="[`btn-size-${size}`,{ 'is-loading': loading }]"><slot /> <!-- 插槽透傳 --></BaseButton>
</template>
2. 事件透傳
<script setup>
const emit = defineEmits(['click', 'custom'])function handleClick(e) {// 執行擴展邏輯console.log('擴展的點擊處理')// 透傳原始事件emit('click', e)// 觸發自定義事件if (e.target.value) {emit('custom', e.target.value)}
}
</script><template><BaseInput @click="handleClick"@focus="$emit('focus', $event)"  // 直接透傳/>
</template>

三、高級封裝技巧

1. 插槽透傳(包含作用域插槽)
<template><BaseTable><!-- 默認插槽 --><slot /><!-- 具名插槽透傳 --><template v-for="(_, slotName) in $slots" #[slotName]="scope"><slot :name="slotName" v-bind="scope || {}"/></template><!-- 擴展功能插槽 --><template #actions="scope"><div class="custom-actions"><slot name="custom-actions" v-bind="scope"/><button @click="handleExtraAction">+</button></div></template></BaseTable>
</template>
2. 方法暴露(使用 defineExpose)
<script setup>
import { ref } from 'vue'const innerComponent = ref(null)// 封裝內部組件的 focus 方法
function focus() {innerComponent.value?.focus()
}// 暴露給父組件的方法
defineExpose({focus,customMethod: () => console.log('自定義方法')
})
</script><template><BaseInput ref="innerComponent" />
</template>
3. 全局配置注入
<script setup>
import { inject } from 'vue'// 注入全局配置
const globalConfig = inject('formConfig', {labelWidth: '120px',validateOnChange: true
})const props = defineProps({// 允許組件級覆蓋全局配置labelWidth: String
})// 最終使用的配置
const actualLabelWidth = computed(() => props.labelWidth || globalConfig.labelWidth
)
</script>

四、最佳實踐

1. 支持 TypeScript 類型
<script setup lang="ts">
import type { BaseButtonProps } from './BaseButton.vue'interface ExtendedProps {// 新增屬性loading?: boolean// 繼承基礎組件的類型color?: 'primary' | 'success' | 'warning'
}// 合并原始屬性和擴展屬性
defineProps<BaseButtonProps & ExtendedProps>()
</script>
2. 默認值處理(合并策略)
<script setup>
import { computed } from 'vue'const props = defineProps({modelValue: { type: [String, Number], default: '' },config: {type: Object,default: () => ({maxLength: 100,showCounter: true})}
})const mergedConfig = computed(() => ({maxLength: 200, // 覆蓋默認值showCounter: props.config.showCounter, // 繼承配置trimOnBlur: true // 新增功能
}))
</script>
3. 樣式封裝(Scoped CSS)
<style scoped>
/* 深度選擇器修改子組件樣式 */
:deep(.base-input__inner) {border-radius: 8px;
}/* 封裝通用樣式類 */
.btn.primary {background: linear-gradient(to right, #ff8a00, #da1b60);
}
</style>

五、完整示例:封裝一個增強型 Input

<template><div class="enhanced-input"><label v-if="label">{{ label }}</label><BaseInput:modelValue="innerValue"v-bind="filteredAttrs":class="{ 'has-error': errorMessage }"@update:modelValue="handleChange"><template #prefix><slot name="prefix" /></template></BaseInput><div v-if="showCounter" class="counter">{{ valueLength }}/{{ maxLength }}</div><div v-if="errorMessage" class="error">{{ errorMessage }}</div></div>
</template><script setup>
import { computed, ref, watch, useAttrs } from 'vue'const props = defineProps({modelValue: [String, Number],label: String,maxLength: {type: Number,default: 100},rules: Array // 校驗規則
})const emit = defineEmits(['update:modelValue', 'change'])const attrs = useAttrs()
const innerValue = ref(props.modelValue)
const errorMessage = ref('')// 過濾不需要透傳到 BaseInput 的屬性
const filteredAttrs = computed(() => {const { label, rules, ...rest } = attrsreturn rest
})// 值處理
const valueLength = computed(() => innerValue.value?.toString().length || 0)
const showCounter = computed(() => props.maxLength > 0)// 值變化處理
function handleChange(value) {innerValue.value = valueemit('update:modelValue', value)emit('change', value)validate(value)
}// 校驗邏輯
function validate(value) {if (!props.rules) returnconst rule = props.rules.find(rule => {if (rule.required && !value) return trueif (rule.pattern && !rule.pattern.test(value)) return true// 可擴展更多規則...})errorMessage.value = rule ? rule.message : ''
}// 暴露驗證方法
defineExpose({ validate })
</script>

六、封裝建議

  1. 保持接口簡單:避免暴露過多內部細節
  2. 遵循約定大于配置:提供合理的默認值
  3. 文檔注釋:使用 JSDoc 說明組件用法
  4. 可組合性:將復雜組件拆分為多個小組件
  5. 錯誤處理:添加邊界情況處理
  6. 類型安全:為 TypeScript 項目提供類型定義

通過合理封裝,可以顯著提高開發效率和代碼質量。建議根據實際項目需求選擇合適級別的封裝,避免過度封裝導致的維護成本增加。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85123.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85123.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85123.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分布式詞表示(Distributed Word Representation):自然語言處理的核心基石

分布式詞表示&#xff08;Distributed Word Representation&#xff09;&#xff1a;自然語言處理的核心基石 在自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;如何將離散的詞匯轉化為計算機可理解的數值形式&#xff0c;一直是技術突破的關鍵。傳統的獨熱編碼&…

Windows Playwright NotImplementedError問題深究

原文鏈接&#xff1a;Windows Playwright NotImplementedError問題深究 < Ping通途說 0. 引言 今天來看一下這個困擾我很久的問題。是關于在FastAPI / NiceGUI 等基于Uvicorn環境下使用Async Playwright 提示NotImplementedError的問題。 本解決方案僅適用基于Uvicorn的異步…

QCustomPlot 數據可視化方式詳解

QCustomPlot 數據可視化方式詳解 QCustomPlot 提供了多種靈活的數據顯示方式,可以滿足從簡單靜態圖表到復雜實時數據可視化的各種需求。以下是 QCustomPlot 顯示數據的核心方式和策略: 基本數據顯示方式 1.1 完整數據設置 (setData)// 一次性設置完整數據集 QVector<doub…

家用舊電腦搭建小型服務器操作步驟教程:一步一步本地部署到公網訪問

你家是不是也有一臺吃灰的舊電腦&#xff1f;別急著扔&#xff0c;它其實還能發揮大作用&#xff01;小編最近就把家里一臺十年前的老臺式機&#xff0c;改造成了一個小型服務器&#xff0c;主要用來文件備份、當網站測試環境&#xff0c;還是比較有用的。今天就來手把手教你&a…

Python銀行賬戶系統全解析

完整代碼如下&#xff1a; class BankAccount:def __init__(self, account_holder, initial_balance0):"""初始化銀行賬戶:param account_holder: 賬戶持有人姓名:param initial_balance: 初始余額&#xff0c;默認為0"""self.account_holder …

博世X阿里云:智能座艙接入通義大模型!

近日,全球領先的汽車技術與服務商博世與阿里云宣布在大模型領域達成合作,通義大模型助力博世加速AI技術應用于智能座艙,首次實現座艙環境主動感知和3D數字人交互。 博世AI智能座艙技術原型由博世智能駕控事業部以通義千問和通義萬相為基礎,結合阿里云百煉大模型服務平臺和磐曦數…

高性能計算服務器的主要作用都有哪些?

高性能計算服務器是一種專門為了處理大規模科學計算和數據分析任務所設計的服務器&#xff0c;高性能計算服務器擁有著強大的計算能力和高速的數據傳輸能力&#xff0c;有著高度的可靠性和可擴展性&#xff0c;下面小編就來介紹一下高性能計算服務器的主要作用吧&#xff01; 高…

C++ 進階:深入理解虛函數、繼承與多態

前言 在 C 的面向對象編程中&#xff0c;繼承和多態是兩個核心概念。今天我們將深入探討 C 中與多態密切相關的幾個重要特性&#xff1a;虛函數、virtual 關鍵字、override 關鍵字、多重繼承以及虛繼承。這些內容是理解 C 多態機制和復雜類層次結構的關鍵。 虛函數與 virtual…

為AR眼鏡等多種智能可穿戴設備添加穿戴狀態檢測功能

作者&#xff1a;Azoteq中國 隨著AR/VR眼鏡、頭戴式耳機和入耳式耳塞、智能手表和健身手環等可穿戴電子產品受到越來越多消費者的歡迎&#xff0c;如何設計外形更加時尚迷人、功能更加先進宜人的穿戴產品成為了創新和創意的焦點。作為全球領先的多傳感器解決方案提供商&#xf…

騰訊云國際站縮容:策略、考量與實踐

騰訊云國際站作為連接全球業務的重要云計算樞紐&#xff0c;其資源的靈活調配至關重要。而騰訊云國際站縮容&#xff0c;便是企業在特定發展階段或業務場景下需要深入探究的關鍵議題。 一、騰訊云國際站縮容的背景與動因 隨著企業業務的動態發展&#xff0c;市場需求并非一成…

英語寫作核心詞匯

以下是一些非常常見和實用的單詞和短語分類整理&#xff1a;? 1. 核心高頻動詞 (用于表達觀點、影響、變化等) ?Affect (v.): 影響?Cause (v.): 引起&#xff0c;導致?Influence (v./n.): 影響?Benefit (v./n.): 有益于&#xff1b;好處?Harm (v./n.): 損害&#xff1b…

Python函數參數傳遞機制全解析

Python常見問題解答 1. 函數參數傳遞是值傳遞還是引用傳遞&#xff1f; Python中的參數傳遞是"對象引用傳遞"&#xff08;或稱為"共享對象傳遞"&#xff09;。具體來說&#xff1a; 對于不可變對象&#xff08;如數字、字符串、元組&#xff09;&#x…

MATLAB提供的預訓練神經網絡

CNN 預訓練的神經網絡 Deep Learning Toolbox? provides various pretrained networks that have different sizes, speeds, and accuracies.

【PDF】Qt生成PDF文件,占用存儲小

在 Qt 項目中&#xff0c;如果你希望使用第三方開源庫來生成心電圖的 PDF 報告&#xff0c;并且要求占用磁盤空間最小&#xff0c;以下是一些推薦的選擇&#xff1a; 推薦的開源庫 PoDoFo 簡介&#xff1a;PoDoFo 是一個用于創建和操作 PDF 文件的 C 開源庫。它非常輕量級&…

系統架構設計師 1

第一章 緒論 系統架構設計師(System Architecture Designer)是項目開發活動中的關鍵角色之一。系統架構是系統的一種整體的高層次的結構表示&#xff0c;是系統的骨架和根基&#xff0c;其決定了系統的健壯性和生命周期的長短。 1.1 系統架構概述 1946年第一臺計算機&#x…

2023年面試記錄(base杭州)

阿里外包&#xff08;通過&#xff09; 一面&#xff1a; 1、react 常用hook 2、css的重繪和重排 后面如果進入還有兩輪 二面&#xff1a; 1、解決不同版本的兼容問題能句幾個例子嗎 2、FCP和 CLS 這兩個指標是什么意思能講下嗎 3、具體優化的動作是什么呢 4、放到cdn上為什么…

React 國際化方案最佳實踐調研

文章目錄 前言主流國際化庫對比分析翻譯資源管理策略語言切換方式與自動識別Next.js 中的國際化支持Page Router 模式&#xff08;pages 目錄&#xff09;App Router 模式&#xff08;app 目錄&#xff09; 多語言 SEO 與預渲染注意事項企業級多語言開發與協作流程建議 前言 整…

基于Python實現自然語言處理(主題層次的情感分類)

主題層次的情感分類 1 任務及數據集介紹 該項目作業的具體任務是來自于 BDCI2018-汽車行業用戶觀點主題及情感識別的題目。數據是網絡中公開的用戶對汽車相關內容的評價文本。此任務是對每條文本內容&#xff08;即用戶評論&#xff09;進行分析&#xff0c;確定該條評論中討…

SpringBoot 線程池 配置使用詳解

一、核心特性 Springboot 集成 支持 Async 注解&#xff0c;簡化異步方法調用。 參數可配置化 核心線程數、最大線程數、隊列容量、拒絕策略等均可通過配置調整。 生命周期管理 實現 Lifecycle 接口&#xff0c;支持線程池的啟動和關閉&#xff08;如應用關閉時優雅終止任務…

Elasticsearch/OpenSearch MCP Quickstart

項目概述 elasticsearch-mcp-server 是一個基于 Model Context Protocol (MCP) 的服務器實現&#xff0c;提供了與 Elasticsearch 和 OpenSearch 交互的能力。該服務器允許用戶搜索文檔、分析索引以及管理集群&#xff0c;通過一系列工具函數實現這些功能。 項目結構 項目主…