vue創建子組件步驟及注意事項

在 Vue 中創建子組件需要遵循組件化開發的核心原則,并注意數據流、通信機制、復用性等關鍵點。以下是詳細步驟和注意事項,結合代碼示例說明:


一、創建子組件的步驟

1. 定義子組件

創建一個 .vue 文件(單文件組件),包含模板、邏輯和樣式:

<!-- ChildComponent.vue -->
<template><div class="child"><h3>{{ title }}</h3><button @click="handleClick">點擊我</button></div>
</template><script>
export default {props: {title: {type: String,required: true}},emits: ['button-clicked'], // 聲明觸發的事件methods: {handleClick() {this.$emit('button-clicked', '來自子組件的消息');}}
};
</script><style scoped>
.child {border: 1px solid #ccc;padding: 20px;
}
</style>
2. 在父組件中引入并使用子組件
<!-- ParentComponent.vue -->
<template><div class="parent"><ChildComponent title="子組件標題"@button-clicked="handleChildEvent"/></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},methods: {handleChildEvent(message) {console.log(message); // 輸出:"來自子組件的消息"}}
};
</script>

二、關鍵注意事項

1. 組件通信
  • 父 → 子:通過 props 傳遞數據。

    • 單向數據流:子組件不能直接修改 props,需通過事件通知父組件修改。
    <!-- 父組件傳遞數據 -->
    <ChildComponent :title="parentTitle" /><!-- 子組件接收 -->
    <script>
    export default {props: ['title']
    };
    </script>
    
  • 子 → 父:通過 $emit 觸發事件。

    <!-- 子組件觸發事件 -->
    <button @click="$emit('update', newValue)">提交</button><!-- 父組件監聽 -->
    <ChildComponent @update="handleUpdate" />
    
2. 插槽(Slots)

用于在子組件中插入動態內容,增強復用性:

<!-- 子組件 ChildComponent.vue -->
<template><div class="card"><slot name="header"></slot><slot>默認內容(當父組件不傳遞內容時顯示)</slot></div>
</template><!-- 父組件使用 -->
<ChildComponent><template #header><h2>自定義標題</h2></template><p>這是父組件插入的內容</p>
</ChildComponent>
3. 作用域樣式

使用 <style scoped> 隔離子組件樣式,避免全局污染:

<style scoped>
/* 僅對當前組件生效 */
.child {background: #f0f0f0;
}
</style>
4. 性能優化
  • 避免不必要的渲染

    • 使用 v-once 靜態緩存:
      <div v-once>{{ staticContent }}</div>
      
    • 復雜數據使用 computed 屬性緩存:
      computed: {filteredList() {return this.list.filter(item => item.active);}
      }
      
  • 異步組件:按需加載子組件(Vue 3):

    const ChildComponent = defineAsyncComponent(() => import('./ChildComponent.vue'));
    
5. Props 設計規范
  • 類型檢查:明確數據類型和默認值。

    props: {count: {type: Number,default: 0,validator: (value) => value >= 0}
    }
    
  • 復雜對象傳遞:使用 v-bind 綁定對象:

    <!-- 父組件 -->
    <ChildComponent v-bind="userData" /><!-- 等價于 -->
    <ChildComponent :name="userData.name" :age="userData.age" />
    
6. 事件命名規范
  • 自定義事件名:建議使用 kebab-case(短橫線命名),避免與原生事件沖突。
    <!-- 子組件觸發 -->
    this.$emit('custom-event', data);<!-- 父組件監聽 -->
    <ChildComponent @custom-event="handler" />
    

三、Vue 3 的新特性

1. 組合式 API(Composition API)

更靈活的邏輯復用方式(推薦在復雜組件中使用):

<script setup>
import { ref, defineProps, defineEmits } from 'vue';const props = defineProps({title: String
});
const emit = defineEmits(['button-clicked']);const handleClick = () => {emit('button-clicked', '來自子組件的消息');
};
</script>
2. 多個 v-model 綁定

支持在單個組件上綁定多個 v-model

<!-- 父組件 -->
<ChildComponent v-model:name="userName" v-model:age="userAge" /><!-- 子組件 -->
<script setup>
defineProps(['name', 'age']);
defineEmits(['update:name', 'update:age']);
</script>

四、常見問題與解決方案

1. Props 未觸發更新
  • 問題:直接修改對象/數組類型的 props(如 props.list.push(newItem))。
  • 解決:深拷貝數據或通過事件通知父組件修改。
2. 樣式污染
  • 問題:未使用 scoped 導致樣式影響全局。
  • 解決:始終添加 <style scoped> 或使用 CSS Modules。
3. 事件未觸發
  • 問題:未在子組件中聲明 emits(Vue 3 中會警告)。
  • 解決:顯式聲明 emits 選項。

五、總結

核心要點實現方式
創建子組件單文件組件(.vue),包含 <template>, <script>, <style>
父子通信props(父 → 子),$emit(子 → 父)
插槽<slot> 插入動態內容,<slot name="header"> 具名插槽
樣式隔離<style scoped> 或 CSS Modules
性能優化v-oncecomputed、異步組件
Vue 3 特性組合式 API、<script setup>、多個 v-model

通過合理設計組件職責、規范通信機制、優化渲染性能,可以構建 高復用、易維護 的 Vue 子組件。

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

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

相關文章

Cocos Creator版本發布時間線

官網找不到&#xff0c;DeepSeek給的答案&#xff0c;這里做個記錄。 Cocos Creator 1.x 系列 發布時間&#xff1a;2016 年 - 2018 年 1.0&#xff08;2016 年 3 月&#xff09;&#xff1a; 首個正式版本&#xff0c;基于 Cocos2d-x 的 2D 游戲開發工具鏈&#xff0c;集成可…

【Spring AI】基于專屬知識庫的RAG智能問答小程序開發——功能優化:用戶鑒權主體功能開發

系列文章目錄 【Spring AI】基于專屬知識庫的RAG智能問答小程序開發——完整項目&#xff08;含完整前端后端代碼&#xff09;【Spring AI】基于專屬知識庫的RAG智能問答小程序開發——代碼逐行精講&#xff1a;核心ChatClient對象相關構造函數【Spring AI】基于專屬知識庫的R…

【AI神經網絡】深度神經網絡(DNN)技術解析:從原理到實踐

引言 深度神經網絡&#xff08;Deep Neural Network, DNN&#xff09;作為人工智能領域的核心技術&#xff0c;近年來在計算機視覺、自然語言處理、醫療診斷等領域取得了突破性進展。與傳統機器學習模型相比&#xff0c;DNN通過多層非線性變換自動提取數據特征&#xff0c;解決…

目標跟蹤——deepsort算法詳細闡述

deepsort 算法詳解 Unmatched Tracks(未匹配的軌跡) 本質角色: 是已存在的軌跡在當前幀中“失聯”的狀態,即預測位置與檢測結果不匹配。 生命周期階段: 已初始化: 軌跡已存在多幀,可能攜帶歷史信息(如外觀特征、運動模型)。 未被觀測到: 當前幀中未找到對應的檢測框…

Vue-admin-template安裝教程

#今天配置后臺管理模板發現官方文檔的鏡像網站好像早失效了&#xff0c;自己稍稍總結了一下方法# 該項目環境需要node17及以下&#xff0c;如果npm install這一步報錯可能是這個原因 git clone https://github.com/PanJiaChen/vue-admin-template.git cd vue-admin-template n…

Rust從入門到精通之進階篇:14.并發編程

并發編程 并發編程允許程序同時執行多個獨立的任務&#xff0c;充分利用現代多核處理器的性能。Rust 提供了強大的并發原語&#xff0c;同時通過類型系統和所有權規則在編譯時防止數據競爭和其他常見的并發錯誤。在本章中&#xff0c;我們將探索 Rust 的并發編程模型。 線程基…

算法訓練營第二十三天 | 貪心算法(一)

文章目錄 一、貪心算法理論基礎二、Leetcode 455.分發餅干二、Leetcode 376. 擺動序列三、Leetcode 53. 最大子序和 一、貪心算法理論基礎 貪心算法是一種在每一步選擇中都采取當前狀態下的最優決策&#xff0c;從而希望最終達到全局最優解的算法設計技術。 基本思想 貪心算…

css基礎-display 常用布局

CSS display 屬性詳解 屬性設置元素是否被視為塊級或行級盒子以及用于子元素的布局&#xff0c;例如流式布局、網格布局或彈性布局。 一、基礎顯示模式 1. block 作用&#xff1a; 元素獨占一行可設置寬高和內外邊距默認寬度撐滿父容器 應用場景&#xff1a; 布局容器&a…

速賣通API數據清洗實戰:從原始JSON到結構化商品數據庫

下面將詳細介紹如何把速賣通 API 返回的原始 JSON 數據清洗并轉換為結構化商品數據庫。 1. 數據獲取 首先要借助速賣通 API 獲取商品數據&#xff0c;以 Python 為例&#xff0c;可使用requests庫發送請求并得到 JSON 數據。 import requests# 替換為你的 API Key 和 Secret …

【零基礎入門unity游戲開發——2D篇】2D物理系統 —— 2D剛體組件(Rigidbody2D)

考慮到每個人基礎可能不一樣,且并不是所有人都有同時做2D、3D開發的需求,所以我把 【零基礎入門unity游戲開發】 分為成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要講解C#的基礎語法,包括變量、數據類型、運算符、流程控制、面向對象等,適合沒有編程基礎的…

Collectors.toMap / list 轉 map

前言 略 Collectors.toMap List<User> userList ...; Map<Long, User> userMap userList.stream().collect(Collectors.toMap(User::getUserId, Function.identity()));假如id存在重復值&#xff0c;則會報錯Duplicate key xxx, 解決方案 兩個重復id中&#…

熱門面試題第13天|Leetcode 110.平衡二叉樹 257. 二叉樹的所有路徑 404.左葉子之和 222.完全二叉樹的節點個數

222.完全二叉樹的節點個數&#xff08;優先掌握遞歸&#xff09; 需要了解&#xff0c;普通二叉樹 怎么求&#xff0c;完全二叉樹又怎么求 題目鏈接/文章講解/視頻講解&#xff1a;https://programmercarl.com/0222.%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8…

關于Object.assign

Object.assign 基本用法 Object.assign() 方法用于將所有可枚舉屬性的值從一個或者多個源對象source復制到目標對象。它將返回目標對象target const target { a: 1, b: 2 } const source { b: 4, c: 5 }const returnedTarget Object.assign(target, source)target // { a…

GitHub高級篩選小白使用手冊

GitHub高級篩選小白使用手冊 GitHub 提供了強大的搜索功能&#xff0c;允許用戶通過高級篩選器來精確查找倉庫、Issues、Pull Requests、代碼等。下面是一些常用的高級篩選用法&#xff0c;幫助你更高效地使用 GitHub 搜索功能。 目錄 搜索倉庫搜索Issues搜索Pull Requests搜…

手動集成sqlite的方法

注意到sqlite有backup方法&#xff08;https://www.sqlite.org/backup.html&#xff09;。 也注意到android中sysroot下&#xff0c;沒有sqlite3的庫&#xff0c;也沒有相關頭文件。 如果要使用 sqlite 的backup&#xff0c;那么就需要手動集成sqlite代碼到項目中。可以如下操…

藍橋杯真題 2109.統計子矩陣

原題地址:1.統計子矩陣 - 藍橋云課 問題描述 給定一個 NMNM 的矩陣 AA, 請你統計有多少個子矩陣 (最小 1111, 最大 NM)NM) 滿足子矩陣中所有數的和不超過給定的整數 KK ? 輸入格式 第一行包含三個整數 N,MN,M 和 KK. 之后 NN 行每行包含 MM 個整數, 代表矩陣 AA. 輸出格…

藍橋杯—最少操作數

一.題目 分析:每次可以進行三次操作&#xff0c;求在n步操作后可以達到目標數的最小n&#xff0c;和最短路徑問題相似&#xff0c;分層遍歷加記憶化搜索防止時間復雜度過高&#xff0c;還需要減枝操作 import java.util.HashSet; import java.util.LinkedList; import java.ut…

Linux內核NIC網卡驅動實戰案例分析

以下Linux 內核模塊實現了一個虛擬網絡設備驅動程序&#xff0c;其作用和意義如下&#xff1a; 1. 作用 &#xff08;1&#xff09;創建虛擬網絡設備對 驅動程序動態創建了兩個虛擬網絡設備&#xff08;nic_dev[0]和nic_dev[1]&#xff09;&#xff0c;模擬物理網卡的功能。這兩…

Trae初使用心得(Java后端)

1.前提 2025年3月3日&#xff0c;字節跳動正式官宣“中國首個 AI 原生集成開發環境&#xff08;AI IDE&#xff09;”Trae 國內版正式上線&#xff0c;由于之前項目的原因小編沒有及時的去體驗&#xff0c;這幾日專門抽空去體驗了一下感覺還算可以。 2.特點 Trade重在可以白嫖…

[項目]基于FreeRTOS的STM32四軸飛行器: 十二.角速度加速度濾波

基于FreeRTOS的STM32四軸飛行器: 十二.濾波 一.濾波介紹二.對角速度進行一階低通濾波三.對加速度進行卡爾曼濾波 一.濾波介紹 模擬信號濾波&#xff1a; 最常用的濾波方法可以在信號和地之間并聯一個電容&#xff0c;因為電容通交隔直&#xff0c;信號突變會給電容充電&#x…