vue3組件通信與props

来源:https://www.cnblogs.com/Amd794/p/18225300
-Advertisement-
Play Games

title: vue3組件通信與props date: 2024/5/31 下午9:00:57 updated: 2024/5/31 下午9:00:57 categories: 前端開發 tags: Vue3組件 Props詳解 生命周期 數據通信 模板語法 Composition API 單向數據 ...



title: vue3組件通信與props
date: 2024/5/31 下午9:00:57
updated: 2024/5/31 下午9:00:57
categories:

  • 前端開發

tags:

  • Vue3組件
  • Props詳解
  • 生命周期
  • 數據通信
  • 模板語法
  • Composition API
  • 單向數據流

image

Vue 3 組件基礎

在 Vue 3 中,組件是構建用戶界面的基本單位,它們是可復用的 Vue 實例,具有自己的模板、數據、方法等。組件化開發使得代碼更加模塊化,易於管理和維護。以下是 Vue 3 組件的基礎知識:

1. 組件的創建與註冊

在 Vue 3 中,組件需要先定義後使用。定義組件的方式有兩種:全局註冊和局部註冊。

全局註冊

全局註冊的組件可以在任何地方使用,通過 app.component 方法進行註冊:

import { createApp } from 'vue';
import App from './App.vue';

const app = createApp(App);

app.component('my-component', {
  // 組件選項
});

app.mount('#app');

局部註冊

局部註冊的組件只能在註冊它的組件內部使用,通常在組件的 components 選項中進行註冊:

export default {
  components: {
    'my-component': {
      // 組件選項
    }
  }
}

2. 組件選項

組件選項包括模板、數據、方法、生命周期鉤子等。

模板 (Template)

組件的模板定義了組件的結構,可以使用 HTML 和 Vue 的模板語法:

<template>
  <div>
    <h1>{{ title }}</h1>
    <p>{{ content }}</p>
  </div>
</template>

數據 (Data)

組件的數據是響應式的,需要是一個函數,返回一個數據對象:

export default {
  data() {
    return {
      title: 'Hello Vue 3',
      content: 'Welcome to Vue 3 component basics.'
    };
  }
}

方法 (Methods)

組件的方法定義在 methods 選項中,可以在模板中通過事件綁定來調用:

export default {
  methods: {
    greet() {
      alert('Hello from Vue 3 component!');
    }
  }
}

生命周期鉤子 (Lifecycle Hooks)

Vue 3 提供了多個生命周期鉤子,允許你在組件的不同階段執行代碼。例如:

export default {
  created() {
    console.log('Component created');
  },
  mounted() {
    console.log('Component mounted');
  }
}

3. 組件通信

組件之間的通信是 Vue 應用中的常見需求,Vue 3 提供了多種通信方式,包括 props、自定義事件、插槽等。

Props

Props 允許父組件向子組件傳遞數據:

// 子組件
export default {
  props: {
    message: String
  }
}

// 父組件
<child-component :message="hello"></child-component>

自定義事件

子組件可以通過自定義事件向父組件傳遞數據:

// 子組件
this.$emit('my-event', data);

// 父組件
<child-component @my-event="handleEvent"></child-component>

插槽 (Slots)

插槽允許父組件向子組件傳遞內容:

<!-- 子組件 -->
<slot></slot>

<!-- 父組件 -->
<child-component>
  <p>This content is passed to the child component via slot.</p>
</child-component>

4. 組件的復用與組合

Vue 3 鼓勵組件的復用和組合,通過 props、插槽等方式,可以構建出高度可復用的組件庫。同時,Vue 3 還引入了 Composition API,使得組件的邏輯更加清晰和易於復用。

什麼是 props?

在 Vue.js 框架中,props 是一個組件的屬性,它可以接收來自父組件的數據,並將其傳遞到子組件中。props 使得子組件能夠接收外部傳入的信息,從而可以在不需要知道外部具體細節的情況下,實現與父組件的交互和數據傳遞。

Props 的作用

  1. 傳參:父組件可以通過 props 將數據傳遞給子組件。
  2. 驗證數據類型:在定義 props 時,可以指定期望的數據類型,這樣 Vue 會在開發過程中進行類型檢查,併在瀏覽器控制臺中拋出警告,有助於提前發現潛在問題。
  3. 設置預設值:如果父組件沒有傳遞相應的 prop,可以設置預設值以確保子組件能夠接收到一個合理的預設值。

Props 的使用

在 Vue 3 中,定義 props 的方式有幾種,包括使用字元串數組、對象形式以及使用 TypeScript 的類型註解。

字元串數組形式

export default {
  props: ['message']
}

這表示組件期望接收一個名為 message 的 prop,它是一個字元串類型。

對象形式

export default {
  props: {
    message: String,
    title: {
      type: String,
      default: 'Default Title'
    }
  }
}

這種方式下,message 被指定為字元串類型,而 title 被指定為字元串類型,並且有一個預設值。

TypeScript 類型註解

在使用 TypeScript 時,可以利用類型註解來定義 props

export default {
  props: {
    message: string,
    title: string
  }
}

Props 的傳遞

在父組件中,通過在模板中使用 v-bind 指令或者簡寫為 : 來傳遞 props

<!-- 父組件 -->
<child-component :message="parentMessage"></child-component>

在這裡,parentMessage 是父組件中的一個數據屬性,它將被傳遞給名為 child-component 的子組件。

Props 的驗證

在 Vue.js 中,props 驗證是指對組件傳入的 props 進行類型檢查和預設值設置等驗證。Vue 提供了一個可選的驗證功能,可以在定義 props 時進行設置。以下是一些常見的 props 驗證規則:

  1. 類型驗證:可以指定 props 的類型,如 StringNumberBooleanArrayObject 等。
  2. 預設值:可以為 props 設置預設值,如果未傳入 prop,則使用預設值。
  3. 必需性:可以指定 props 是否為必需,如果為必需,則必須在父組件中傳入。
  4. 自定義驗證:可以使用 validator 函數進行自定義驗證。
  5. 單位轉換:對於數值類型,可以指定單位,如 px% 等,Vue 會自動進行單位轉換。

下麵是一個使用 props 驗證的例子:

export default {
  props: {
    // 基本類型驗證
    title: {
      type: String,
      default: '預設標題'
    },
    // 數值類型驗證,可以指定單位
    width: {
      type: Number,
      default: 100,
      validator: (value) => {
        return value >= 0; // 自定義驗證,確保寬度非負
      }
    },
    // 數組類型驗證
    items: {
      type: Array,
      default: () => []
    },
    // 對象類型驗證
    config: {
      type: Object,
      default: () => ({})
    },
    // 布爾值類型驗證
    isActive: {
      type: Boolean,
      default: false
    }
  }
}

在這個例子中,title 被驗證為字元串類型,有一個預設值;width 被驗證為數值類型,有一個預設值,並且有一個自定義的驗證函數確保它非負;items 被驗證為數組類型,有一個預設的空數組;config 被驗證為對象類型,有一個預設的空對象;isActive 被驗證為布爾類型,有一個預設的 false 值。

如果父組件傳遞給子組件的 props 不滿足這些驗證規則,Vue 將拋出一個警告。這些驗證規則有助於確保組件接收到的數據是預期的類型和格式,從而提高組件的健壯性。AD:首頁 | 一個覆蓋廣泛主題工具的高效線上平臺

動態Props

在Vue中,動態Props指的是父組件向子組件傳遞的Props值可以在運行時動態確定。這可以通過使用v-bind指令或簡寫為:來實現。動態Props的值可以是表達式、計算屬性或方法返回的結果。

<template>
  <ChildComponent :prop-name="dynamicValue" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      dynamicValue: '動態值'
    };
  }
};
</script>

單向數據流

在Vue中,單向數據流指的是數據只能從父組件流向子組件,不能反向流動。這是通過propsemit方法實現的。props用於父組件向子組件傳遞數據,而emit方法允許子組件向父組件發送事件。
AD:專業搜索引擎

父子組件通信

父子組件通信主要有以下幾種方式:

  1. Props:父組件通過Props向子組件傳遞數據。
  2. **\(emit 方法**:子組件通過`\)emit方法觸發事件,父組件通過@eventName`監聽這些事件。
<!-- 父組件 -->
<template>
  <ChildComponent @child-event="handleChildEvent" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleChildEvent(data) {
      console.log('收到子組件的事件:', data);
    }
  }
};
</script>
<!-- 子組件 -->
<template>
  <button @click="sendMessageToParent">發送消息給父組件</button>
</template>
<script>
export default {
  methods: {
    sendMessageToParent() {
      this.$emit('child-event', 'Hello from child!');
    }
  }
};
</script>

非父子組件通信

非父子組件通信有以下幾種方式:

  1. Provide 和 Inject:祖先組件通過provide選項來提供變數,所有的子孫組件都可以通過inject選項來接收這個變數。
    AD:漫畫首頁
  2. Event Bus:創建一個中央事件匯流排實例,不同組件通過觸發或監聽事件來進行通信。
// 創建Event Bus實例
const eventBus = new Vue();

// 祖先組件
eventBus.$emit('update-data', 'some data');

// 後代組件
eventBus.$on('update-data', (data) => {
  console.log('收到數據:', data);
});

Props 的限制

  1. 類型限制:可以指定props的類型,如StringNumberBoolean等。
  2. 預設值:可以為props設置預設值。
  3. 必需性:可以指定props是否為必需。
  4. 自定義驗證:可以使用validator函數進行自定義驗證。
  5. 單位轉換:對於數值類型,可以指定單位,如px%等,Vue會自動進行單位轉換。

總結

Vue.js通過提供靈活的組件通信機制,使得前端開發更加高效和模塊化。父子組件之間的通信通過propsemit實現,遵循單向數據流原則;非父子組件間則可以通過provideinject,或者事件匯流排來實現。這些通信機制不僅使得組件之間的數據傳遞更加清晰,也提高了應用的可維護性。同時,props的驗證機制確保了組件接收到的數據是符合預期格式的,增加了組件的穩定性。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Vue3簡單項目流程分享——工作室主頁 零、寫在最前 以下是項目相關的一些鏈接: 源代碼GitHub倉庫(需要魔法上網):倉庫 網頁示例(需要魔法上網):網頁示例 UI圖(來源@設計師楊賀):MasterGo主頁 補充:由於時間關係,該網頁沒有適配手機端,最佳展示效果為網頁端1440p寬度。 如果你 ...
  • FormCreate 是一個可以通過 JSON 生成具有動態渲染、數據收集、驗證和提交功能的表單生成組件。支持5個UI框架,並且支持生成任何 Vue 組件。內置20種常用表單組件和自定義組件,再複雜的表單都可以輕鬆搞定 FormCreate官網:https://www.form-create.com ...
  • 初探富文本之基於虛擬滾動的大型文檔性能優化方案 虛擬滾動是一種優化長列表性能的技術,其通過按需渲染列表項來提高瀏覽器運行效率。具體來說,虛擬滾動只渲染用戶瀏覽器視口部分的文檔數據,而不是整個文檔結構,其核心實現根據可見區域高度和容器的滾動位置計算出需要渲染的列表項,同時不渲染額外的視圖內容。虛擬滾動 ...
  • title: Vue.js 動態組件與非同步組件 date: 2024/6/2 下午9:08:50 updated: 2024/6/2 下午9:08:50 categories: 前端開發 tags: Vue概覽 動態組件 非同步載入 性能提升 路由管理 狀態控制 工具生態 第1章 Vue.js 簡介 ...
  • 從零學習Vue.js 目錄 引言 準備工作 Vue.js 基礎 3.1 Vue 實例 3.2 模板語法 3.3 數據綁定 3.4 計算屬性和偵聽器 3.5 Class 與 Style 綁定 3.6 條件渲染 3.7 列表渲染 3.8 事件處理 3.9 表單輸入綁定 Vue.js 組件 4.1 組件基 ...
  • title: Vue插槽與作用域插槽 date: 2024/6/1 下午9:07:52 updated: 2024/6/1 下午9:07:52 categories: 前端開發 tags: VueSlot ScopeSlot 組件通信 Vue2/3插槽 作用域API 動態插槽 插槽優化 第1章:插槽 ...
  • 一、背景 在日常佈局中,無論是兩欄佈局還是三欄佈局,使用的頻率都非常高 兩欄佈局 兩欄佈局實現效果就是將頁面分割成左右寬度不等的兩列,寬度較小的列設置為固定寬度,剩餘寬度由另一列撐滿, 比如 Ant Design 文檔,藍色區域為主要內容佈局容器,側邊欄為次要內容佈局容器 這裡稱寬度較小的列父元素為 ...
  • XML Web服務是基於WSDL、SOAP、RDF和RSS等標準的網路應用程式組件技術。WSDL描述服務介面和消息格式,SOAP用於結構化信息交換,RDF描述網路資源,RSS則用於發佈網站更新。Web服務特點是自包含、自描述,基於開放協議,可重用且能連接現有軟體。WSDL文檔包含`types`、`m... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...