vue3專題1------父組件中更改子組件的屬性

理解 Vue 3 中父組件如何引用子組件的屬性是一個很重要的概念。 這里涉及到 defineExpose 和 ref 這兩個關鍵點。

方法:使用?defineExpose?在子組件中暴露屬性,然后在父組件中使用?ref?獲取子組件實例并訪問暴露的屬性。

下面我將詳細解釋這個過程:

1. 子組件 (Child Component):

  • 創建 Ref:?首先,在子組件中使用?ref?創建你想要暴露的屬性。
  • 使用?defineExpose?暴露:?使用?defineExpose?顯式聲明你想讓父組件訪問的屬性。只有通過?defineExpose?暴露的屬性才能被父組件訪問。
// ChildComponent.vue<template><div><p>子組件 Count: {{ count }}</p><button @click="increment">Increment</button></div>
</template><script setup>
import { ref } from 'vue';const count = ref(0);const increment = () => {count.value++;
};// 暴露 count 和 increment 方法給父組件defineExpose({count,increment
})</script>

說明:

  • defineExpose?接受一個對象,該對象包含你想暴露給父組件訪問的屬性和方法。
  • 在上面的例子中,我們通過defineExpose?暴露了?count?(ref 對象) 和?increment?方法,否則父組件也無法訪問它。

2. 父組件 (Parent Component):

  • Template Ref:?在父組件的模板中,使用?ref?特殊 attribute 給子組件命名,以便稍后獲取子組件的實例。
  • 獲取子組件實例:?在父組件中,創建一個與模板中?ref?特殊 attribute 同名的?ref。 當組件掛載后,這個?ref?將會持有子組件的實例。
  • 訪問暴露的屬性:?在?onMounted?生命周期鉤子中,訪問子組件實例上的暴露屬性。 需要在組件掛載后才能訪問子組件的實例。
// ParentComponent.vue
<template><div><ChildComponent ref="childComponentRef" /><p>父組件 Count: {{ childCount }}</p><button @click="incrementChild">Increment Child</button></div>
</template><script>
import { ref, onMounted } from 'vue';
import ChildComponent from './ChildComponent.vue';const childComponentRef = ref(null); //  初始值必須為 null
const childCount = ref(0);onMounted(() => {// 確保 childComponentRef.value 存在if (childComponentRef.value) {// 訪問子組件暴露的 count 屬性childCount.value = childComponentRef.value.count.value;// 可以調用子組件暴露的方法} else {console.warn('Child component ref is not yet available.');}
});const incrementChild = () => {if (childComponentRef.value) {childComponentRef.value.increment(); // 調用子組件的方法childCount.value = childComponentRef.value.count.value; // 更新父組件的 count}
};</script>

說明:

  • childComponentRef?的初始值必須為?null
  • onMounted?鉤子是至關重要的。在這個鉤子被調用時,子組件已經被掛載,childComponentRef.value?將指向子組件的實例。
  • 通過?childComponentRef.value.count.value?訪問子組件暴露的?count?屬性。 注意,由于?count?本身是一個?ref,所以需要使用?.value?兩次才能獲取其值。
  • 通過?childComponentRef.value.increment()?調用子組件暴露的?increment?方法。
  • 在訪問子組件的屬性或方法之前,最好檢查?childComponentRef.value?是否存在,以避免錯誤。

總結:

  1. 子組件:?使用?ref?創建響應式屬性,并使用?defineExpose?暴露要給父組件訪問的屬性和方法。
  2. 父組件:?在模板中使用?ref?特殊 attribute 引用子組件,并在?setup?中創建同名的?ref。 在?onMounted?鉤子中,通過?ref.value?訪問子組件的實例,并訪問暴露的屬性和方法。

重要提示:

  • 單向數據流:?雖然可以從父組件訪問子組件的屬性,但應該盡量避免直接修改子組件的狀態。 更好的做法是讓子組件通過?emit?觸發事件,父組件監聽這些事件并做出相應的更新。 這有助于維護清晰的單向數據流。
  • 避免過度暴露:?只暴露父組件真正需要的屬性和方法。 避免暴露不必要的內部狀態,以保持子組件的封裝性。

注意:在父組件修改子組件的屬性時,通常推薦暴露方法,而不是直接暴露屬性

理由:

1. 維護單向數據流:

  • 暴露屬性 (不推薦):?直接暴露子組件的屬性給父組件修改,容易打破單向數據流。 父組件可以隨意更改子組件的狀態,導致子組件的狀態變化不可預測,增加了調試和維護的難度。 這就像父組件直接“篡改”了子組件的數據,子組件可能不了解發生了什么變化。

  • 暴露方法 (推薦):?通過暴露方法,子組件可以控制如何修改其內部狀態。 父組件調用這些方法來請求子組件進行更新。 這種方式保持了清晰的數據流方向:父組件 "請求" 子組件修改數據,子組件 "響應" 請求并執行修改。 子組件可以驗證傳入的數據、執行一些副作用操作 (例如,在數據更改后更新本地存儲) 等,從而更好地控制自身的狀態。

2. 更好的封裝性:

  • 暴露屬性:?直接暴露屬性會破壞子組件的封裝性。 父組件需要了解子組件內部的屬性結構和類型,這增加了父組件和子組件之間的耦合度。 如果子組件內部的屬性發生變化,可能需要修改父組件的代碼。

  • 暴露方法:?通過暴露方法,子組件可以隱藏其內部的實現細節。 父組件只需要知道如何調用這些方法,而不需要了解子組件內部是如何存儲和處理數據的。 這樣可以更容易地修改子組件的內部實現,而不會影響到父組件。

3. 更好的控制和驗證:

  • 暴露屬性:?父組件可以直接設置屬性值,沒有機會進行驗證或控制。

  • 暴露方法:?子組件可以在方法內部對傳入的參數進行驗證,確保數據的有效性。 此外,子組件還可以在方法內部執行一些額外的邏輯,例如觸發自定義事件或更新其他相關的狀態。

示例:

假設子組件有一個?count?屬性,父組件想要增加它的值。

推薦 (暴露方法):

// ChildComponent.vue
<script setup>
import { ref } from 'vue';const count = ref(0);const increment = (amount = 1) => {count.value += amount;
};defineExpose({increment, // 暴露 increment 方法
});</script>// ParentComponent.vue
<script setup>
import { ref, onMounted } from 'vue';
import ChildComponent from './ChildComponent.vue';const child = ref(null);
onMounted(() => {child.value.increment(5); // 調用子組件的 increment 方法
});</script>

總結:

在設計組件時,應該盡量遵循單向數據流的原則,提高組件的封裝性和可維護性。 因此,在父組件需要修改子組件狀態的情況下,推薦暴露方法 (actions),而不是直接暴露屬性。?這使得子組件可以更好地控制其內部狀態,并提供更大的靈活性。

當然,在非常簡單的情況下,如果父組件只需要讀取子組件的狀態,并且不需要進行任何修改,那么暴露屬性是可以接受的。 但總的來說,暴露方法是更安全、更靈活、更推薦的做法

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

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

相關文章

數據倉庫分層架構解析:從理論到實戰的完整指南??

數據倉庫分層是構建高效數據體系的核心方法論。本文系統闡述ODS、DWD、DWS、ADS四層架構的設計原理&#xff0c;結合電商用戶行為分析場景&#xff0c;詳解各層功能及協作流程&#xff0c;并給出分層設計的原則與避坑指南&#xff0c;幫助讀者掌握分層架構的落地方法。 一、為什…

從零搭建一套前端開發環境

一、基礎環境搭建 1.NVM(Node Version Manager)安裝 簡介 nvm&#xff08;Node Version Manager&#xff09; 是一個用于管理多個 Node.js 版本的工具&#xff0c;允許開發者在同一臺機器上輕松安裝、切換和使用不同版本的 Node.js。它特別適合需要同時維護多個項目&#xff…

計算機組成原理筆記(十六)——4.1基本算術運算的實現

計算機中最基本的算術運算是加法運算&#xff0c;加、減、乘、除運算最終都可以歸結為加法運算。 4.1.1加法器 一、加法器的基本單元 加法器的核心單元是 全加器&#xff08;Full Adder, FA&#xff09;&#xff0c;而所有加法器都由 半加器&#xff08;Half Adder, HA&…

利用Qt創建一個模擬問答系統

界面&#xff1a; 添加了聊天顯示區域&#xff08;QTextEdit&#xff09; 添加了發送按鈕和清空對話按鈕 優化了布局和窗口大小添加了時間戳顯示 2、功能&#xff1a; 支持實時對話可以清空對話歷史 支持按回車發送消息 添加了簡單的關鍵詞匹配響應系統 交互體驗&#x…

神經光子渲染:物理級真實感圖像生成——從麥克斯韋方程到深度學習

一、技術背景與核心突破 2025年&#xff0c;神經光子渲染&#xff08;Photonic Neural Rendering, PNR&#xff09;技術通過物理光學方程與神經輻射場的深度融合&#xff0c;在AIGC檢測工具&#xff08;如GPTDetector 5.0&#xff09;的識別準確率從98%降至12%。該技術突破性地…

Linux中手動安裝7-Zip軟件文檔

7zip位于EPEL源中&#xff0c;如果服務器可以聯網或者配置了本地EPEL源則可以直接安裝 yum install p7zip p7zip-plugins -y對于無法聯網且沒有配置本地EPEL源的服務器&#xff0c;可以通過官網下載安裝包后&#xff0c;上傳至服務器&#xff0c;手動安裝 ## 下載地址&#x…

[密碼學基礎]GM/T 0018-2023 密碼設備應用接口規范深度解析:技術革新與開發者實踐

GM/T 0018-2023 密碼設備應用接口規范深度解析&#xff1a;技術革新與開發者實踐 GM/T 0018-2023《密碼設備應用接口規范》是中國密碼行業的重要標準&#xff0c;于2023年12月4日發布&#xff0c;2024年6月1日正式實施&#xff0c;替代了2012年版標準。該標準旨在規范密碼設備…

8.QT-按鈕類控件|Push Button|Radio Button|Check Box|Tool Button(C++)

Push Button 使? QPushButton 表??個按鈕.這也是當前我們最熟悉的?個控件了. QPushButton 繼承? QAbstractButton .這個類是?個抽象類.是其他按鈕的?類 在Qt Designer中也能夠看到這?的繼承關系 屬性說明text按鈕中的?本icon按鈕中的圖標iconSize按鈕中圖標的尺?sh…

CFIS-YOLO:面向邊緣設備的木材缺陷檢測輕量級網絡解析

論文地址:https://arxiv.org/pdf/2504.11305 目錄 一、論文核心貢獻 二、創新點詳解 2.1 CARAFE動態上采樣 工作原理 優勢對比 2.2 C2f_FNB輕量模塊 計算效率 2.3 Inner-SIoU損失函數 三、實驗驗證 3.1 消融實驗 3.2 對比實驗 四、應用部署 4.1 邊緣設備部署流程…

BUUCTF PWN刷題筆記(1-9)

才知道&#xff0c;由于棧對齊&#xff0c;直接動調看棧估計會錯&#xff0c;用cyclic看 1.test_your_nc NC連接一下&#xff0c;這個網站似乎直接訪問是不中的&#xff0c;懷疑是沒開啟web的端口。NC鏈接輸入cat flag就OK了&#xff0c;應該只是讓我這樣的小菜鳥培養自信用的…

C#處理網絡傳輸中不完整的數據流

1、背景 在讀取byte數組的場景&#xff08;例如&#xff1a;讀取文件、網絡傳輸數據&#xff09;中&#xff0c;特別是網絡傳輸的場景中&#xff0c;非常有可能接收了不完整的byte數組&#xff0c;在將byte數組轉換時&#xff0c;因字符的缺失/增多&#xff0c;轉為亂碼。如下…

PostgreSQL 用戶資源管理

PostgreSQL 用戶資源管理 PostgreSQL 提供了多種機制來管理和限制用戶對數據庫資源的使用&#xff0c;以下是全面的資源管理方法&#xff1a; 1 連接限制 1.1 限制最大連接數 -- 在 postgresql.conf 中設置 max_connections 100 -- 全局最大連接數-- 為特定用戶設置連接限…

新書速覽|OpenCV計算機視覺開發實踐:基于Qt C++

《OpenCV計算機視覺開發實踐:基于Qt C》 本書內容 OpenCV是計算機視覺領域的開發者必須掌握的技術。《OpenCV計算機視覺開發實踐:基于Qt C》基于 OpenCV 4.10與Qt C進行編寫&#xff0c;全面系統地介紹OpenCV的使用及實戰案例&#xff0c;并配套提供全書示例源碼、PPT課件與作…

【上位機——MFC】消息映射機制

消息映射機制 Window消息分類消息映射機制的使用代碼示例 MFC框架利用消息映射機制把消息、命令與它們的處理函數映射起來。具體實現方法是在每個能接收和處理消息的類中&#xff0c;定義一個消息和消息函數指針對照表&#xff0c;即消息映射表。 在不重寫WindowProc虛函數的大…

docker學習筆記2-最佳實踐

一、在容器中啟動mysql的最佳實踐 &#xff08;一&#xff09;查找目錄 1、mysql的配置文件路徑 /etc/mysql/conf.d 2、mysql的數據目錄 /var/lib/mysql 3、環境變量 4、端口 mysql的默認端口3306。 &#xff08;二&#xff09;啟動命令 docker run -d -p 3306:3306 …

Vue3核心源碼解析

/packages/complier-core 定位??&#xff1a;??編譯時核心??&#xff0c;處理 Vue 模板的編譯邏輯。??核心功能??&#xff1a; ??模板解析??&#xff1a;將 .vue 文件的模板語法&#xff08;HTML-like&#xff09;解析為 ??抽象語法樹 (AST)??。??轉換優化…

n8n 中文系列教程_05.如何在本機部署/安裝 n8n(詳細圖文教程)

n8n 是一款強大的開源工作流自動化工具&#xff0c;可幫助你連接各類應用與服務&#xff0c;實現自動化任務。如果你想快速體驗 n8n 的功能&#xff0c;本機部署是最簡單的方式。本教程將手把手指導你在 Windows 或 MacOS 上通過 Docker 輕松安裝和運行 n8n&#xff0c;無需服務…

【python】pyCharm常用快捷鍵使用-(2)

pyCharm常用快捷鍵使用 快速導入任意類 【CTRLALTSPACE】代碼補全【CTRLSHIFTENTER】代碼快速修正【ALTENTER】代碼調試快捷鍵

Docker 鏡像、容器和 Docker Compose的區別

前言&#xff1a;Docker 的鏡像、容器和 Docker Compose 是容器化技術的核心組件&#xff0c;以下是對它們的詳細解析及使用場景說明。 ??1、Docker 鏡像&#xff08;Image&#xff09;?? ??定義??&#xff1a; 鏡像是只讀模板&#xff0c;包含運行應用程序所需的代碼、…

算法——背包問題(分類)

背包問題&#xff08;Knapsack Problem&#xff09;是一類經典的組合優化問題&#xff0c;廣泛應用于資源分配、投資決策、貨物裝載等領域。根據約束條件和問題設定的不同&#xff0c;背包問題主要分為以下幾種類型&#xff1a; 1. 0-1 背包問題&#xff08;0-1 Knapsack Probl…