硅谷甄選運營平臺-vue3組件通信方式

vue3組件通信方式

vue2組件通信方式:

  • props:可以實現父子組件、子父組件、甚至兄弟組件通信
  • 自定義事件:可以實現子父組件通信
  • 全局事件總線$bus:可以實現任意組件通信
  • pubsub:發布訂閱模式實現任意組件通信
  • vuex:集中式狀態管理容器,實現任意組件通信
  • ref:父組件獲取子組件實例VC,獲取子組件的響應式數據以及方法
  • slot:插槽(默認插槽、具名插槽、作用域插槽)實現父子組件通信........

1.1props(父組件給子組件傳)

props可以實現父子組件通信,在vue3中我們可以通過defineProps獲取父組件傳遞的數據。且在組件內部不需要引入defineProps方法可以直接使用!

父組件給子組件傳遞數據

<Child info="我愛祖國" :money="money"></Child>

?子組件獲取父組件傳遞數據:方式1

let props = defineProps({info:{type:String,//接受的數據類型default:'默認參數',//接受默認數據},money:{type:Number,default:0
}})

子組件獲取父組件傳遞數據:方式2

let props = defineProps(["info",'money']);

子組件獲取到props數據就可以在模板中使用了,但是切記props是只讀的(只能讀取,不能修改)

1.2自定義事件(子組件給父組件傳)

在vue框架中事件分為兩種:一種是原生的DOM事件,另外一種自定義事件。

原生DOM事件可以讓用戶與網頁進行交互,比如click、dbclick、change、mouseenter、mouseleave....

自定義事件可以實現子組件給父組件傳遞數據

1.2.1原生DOM事件

代碼如下:

 <pre @click="handler">我是祖國的老花骨朵</pre>

?當前代碼級給pre標簽綁定原生DOM事件點擊事件,默認會給事件回調注入event事件對象。當然點擊事件想注入多個參數可以按照下圖操作。但是切記注入的事件對象務必叫做$event.

 <div @click="handler1(1,2,3,$event)">我要傳遞多個參數</div>

在vue3框架click、dbclick、change(這類原生DOM事件),不管是在標簽、自定義標簽上(組件標簽)都是原生DOM事件。

<!--vue2中卻不是這樣的,在vue2中組件標簽需要通過native修飾符才能變為原生DOM事件-->

1.2.2自定義事件

自定義事件可以實現子組件給父組件傳遞數據.在項目中是比較常用的。

比如在父組件內部給子組件(Event2)綁定一個自定義事件

<Event2  @xxx="handler3"></Event2>

?在Event2子組件內部觸發這個自定義事件defineEmits(["xxx"]);

<template><div><h1>我是子組件2</h1><button @click="handler">點擊我觸發xxx自定義事件</button></div>
</template><script setup lang="ts">
let $emit = defineEmits(["xxx"]);
const handler = () => {$emit("xxx", "法拉利", "茅臺");
};
</script>
<style scoped>
</style>

在script標簽內部,使用了defineEmits方法,此方法是vue3提供的方法,不需要引入直接使用。defineEmits方法執行,傳遞一個數組,數組元素即為將來組件需要觸發的自定義事件類型,此方執行會返回一個$emit方法用于觸發自定義事件。

當點擊按鈕的時候,事件回調內部調用$emit方法去觸發自定義事件,第一個參數為觸發事件類型,第二個、三個、N個參數即為傳遞給父組件的數據。

需要注意的是:代碼如下

<Event2  @xxx="handler3" @click="handler"></Event2>

正常說組件標簽書寫@click應該為原生DOM事件,但是如果子組件內部通過defineEmits定義就變為自定義事件了

let $emit = defineEmits(["xxx",'click']);

項目舉例

1.3全局事件總線

全局事件總線可以實現任意組件通信,在vue2中可以根據VM與VC關系推出全局事件總線。

但是在vue3中沒有Vue構造函數,也就沒有Vue.prototype.以及組合式API寫法沒有this,

那么在Vue3想實現全局事件的總線功能就有點不現實啦,如果想在Vue3中使用全局事件總線功能

可以使用插件mitt實現。

mitt:官網地址:mitt - npm

1.4v-model

v-model指令可是收集表單數據(數據雙向綁定),除此之外它也可以實現父子組件數據同步

而v-model實指利用props[modelValue]與自定義事件[update:modelValue]實現的。

下方代碼:相當于給組件Child傳遞一個props(modelValue)與綁定一個自定義事件update:modelValue

實現父子組件數據同步

<Child v-model="msg"></Child>

vue3中一個組件可以通過使用多個v-model,讓父子組件多個數據同步,下方代碼相當于給組件Child傳遞兩個props分別是pageNo與pageSize,以及綁定兩個自定義事件update:pageNo與update:pageSize實現父子數據同步

<Child v-model:pageNo="msg" v-model:pageSize="msg1"></Child>

?v-model解析

1.5useAttrs

在Vue3中可以利用useAttrs方法獲取組件的屬性與事件(包含:原生DOM事件或者自定義事件),次函數功能類似于Vue2框架中$attrs屬性與$listeners方法。

比如:在父組件內部使用一個子組件my-button

<my-button type="success" size="small" title='標題' @click="handler"></my-button>

子組件內部可以通過useAttrs方法獲取組件屬性與事件.因此你也發現了,它類似于props,可以接受父組件傳遞過來的屬性與屬性值。需要注意如果defineProps接受了某一個屬性,useAttrs方法返回的對象身上就沒有相應屬性與屬性值。

<script setup lang="ts">
import {useAttrs} from 'vue';
let $attrs = useAttrs();
</script>

1.6ref與$parent

ref,提及到ref可能會想到它可以獲取元素的DOM或者獲取子組件實例的VC。既然可以在父組件內部通過ref獲取子組件實例VC,那么子組件內部的方法與響應式數據父組件可以使用的。

比如:在父組件掛載完畢獲取組件實例

父組件內部代碼:

<template><div><h1>ref與$parent</h1><Son ref="son"></Son></div>
</template>
<script setup lang="ts">
import Son from "./Son.vue";
import { onMounted, ref } from "vue";
const son = ref();
onMounted(() => {console.log(son.value);
});
</script>

但是需要注意,如果想讓父組件獲取子組件的數據或者方法需要通過defineExpose對外暴露,因為vue3中組件內部的數據對外“關閉的”,外部不能訪問

<script setup lang="ts">
import { ref } from "vue";
//數據
let money = ref(1000);
//方法
const handler = ()=>{
}
defineExpose({money,handler
})
</script>

?項目舉例:

$parent可以獲取某一個組件的父組件實例VC,因此可以使用父組件內部的數據與方法。必須子組件內部擁有一個按鈕點擊時候獲取父組件實例當然父組件的數據與方法需要通過defineExpose方法對外暴露

<button @click="handler($parent)">點擊我獲取父組件實例</button>

1.7provide與inject

provide[提供]

inject[注入]

vue3提供兩個方法provideinject,可以實現隔輩組件傳遞參數

組件組件提供數據:

provide方法用于提供數據,此方法執需要傳遞兩個參數,分別提供數據的key與提供數據value

<script setup lang="ts">
import {provide} from 'vue'
provide('token','admin_token');
</script>

?后代組件可以通過inject方法獲取數據,通過key獲取存儲的數值

<script setup lang="ts">
import {inject} from 'vue'
let token = inject('token');
</script>

1.8pinia

pinia官網:Pinia 中文文檔

pinia也是集中式管理狀態容器,類似于vuex。但是核心概念沒有mutation、modules,使用方式參照官網?

1.9slot

插槽:默認插槽、具名插槽、作用域插槽可以實現父子組件通信.

默認插槽:

在子組件內部的模板中書寫slot全局組件標簽

<template><div><slot></slot></div>
</template>
<script setup lang="ts">
</script>
<style scoped>
</style>

在父組件內部提供結構:Todo即為子組件,在父組件內部使用的時候,在雙標簽內部書寫結構傳遞給子組件

注意開發項目的時候默認插槽一般只有一個

<Todo><h1>我是默認插槽填充的結構</h1>
</Todo>

具名插槽:

顧名思義,此插槽帶有名字在組件內部留多個指定名字的插槽。

下面是一個子組件內部,模板中留兩個插槽

<template><div><h1>todo</h1><slot name="a"></slot><slot name="b"></slot></div>
</template>
<script setup lang="ts">
</script><style scoped>
</style>

?父組件內部向指定的具名插槽傳遞結構。需要注意v-slot:可以替換為#

<template><div><h1>slot</h1><Todo><template v-slot:a>  //可以用#a替換<div>填入組件A部分的結構</div></template><template v-slot:b>//可以用#b替換<div>填入組件B部分的結構</div></template></Todo></div>
</template><script setup lang="ts">
import Todo from "./Todo.vue";
</script>
<style scoped>
</style>

?

作用域插槽(可以傳數據的插槽)

作用域插槽:可以理解為,子組件數據由父組件提供,但是子組件內部決定不了自身結構與外觀(樣式)

子組件Todo代碼如下:

<template><div><h1>todo</h1><ul><!--組件內部遍歷數組--><li v-for="(item,index) in todos" :key="item.id"><!--作用域插槽將數據回傳給父組件--><slot :$row="item" :$index="index"></slot></li></ul></div>
</template>
<script setup lang="ts">
defineProps(['todos']);//接受父組件傳遞過來的數據
</script>
<style scoped>
</style>

父組件內部代碼如下:

<template><div><h1>slot</h1><Todo :todos="todos"><template v-slot="{$row,$index}"><!--父組件決定子組件的結構與外觀--><span :style="{color:$row.done?'green':'red'}">{{$row.title}}</span></template></Todo></div>
</template><script setup lang="ts">
import Todo from "./Todo.vue";
import { ref } from "vue";
//父組件內部數據
let todos = ref([{ id: 1, title: "吃飯", done: true },{ id: 2, title: "睡覺", done: false },{ id: 3, title: "打豆豆", done: true },
]);
</script>
<style scoped>
</style>

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

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

相關文章

camunda最終章-springboot

1.實現并行流子流程 1.畫圖 2.創建實體 package com.jmj.camunda7test.subProcess.entity;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable; import java.util.ArrayList; import java.util.List;Data …

C語言 | Leetcode C語言題解之第230題二叉搜索樹中第K小的元素

題目&#xff1a; 題解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int search_num(struct TreeNode* root, int k, int *result, int num) {if(num k 1){retu…

《Foundation 側邊欄》

《Foundation 側邊欄》 介紹 Foundation 是一個強大的前端框架,它提供了一套豐富的工具和組件,幫助開發者快速構建響應式、移動優先的網站和應用程序。在 Foundation 中,側邊欄是一個常用的組件,用于展示導航鏈接、菜單或其他相關信息。本文將詳細介紹如何在 Foundation …

FastGPT連接OneAI接入網絡模型

文章目錄 FastGPT連接OneAI接入網絡模型1.準備工作2.開始部署2.1下載 docker-compose.yml2.2修改docker-compose.yml里的參數 3.打開FastGPT添加模型3.1打開OneAPI3.2接入網絡模型3.3重啟服務 FastGPT連接OneAI接入網絡模型 1.準備工作 本文檔參考FastGPT的官方文檔 主機ip接…

JDBC 實例分享——簡易圖書管理系統

目錄 前言 數據表的建立 操作包各個類的實現 增加類 刪除類 展示類 借閱與歸還類 前言 書接上文 JDBC編程的學習——MYsql版本-CSDN博客 本期我們通過對先前圖書管理系統進行改造,是它的數據能保存在數據庫中 完整代碼我已經保存在github中,能不能給個星呢!!!! call…

記一次若依框架和Springboot常見報錯的實戰漏洞挖掘

目錄 前言 本次測實戰利用圖? 1.判段系統框架 2.登錄頁面功能點測試 2.1 弱口令 2.2 webpack泄露信息判斷 2.3 未授權接口信息發現 3.進一步測試發現新的若依測試點 3.1 默認弱口令 3.2 歷史漏洞 4.訪問8080端口發現spring經典爆粗 4.1 druid弱口令 4.2 SwaggerU…

熱鍵危機:揭秘Memcached中的熱鍵問題及其解決方案

熱鍵危機&#xff1a;揭秘Memcached中的熱鍵問題及其解決方案 Memcached是一種廣泛使用的高性能分布式內存緩存系統&#xff0c;它通過緩存數據來減少對后端數據庫的訪問壓力&#xff0c;從而提高應用性能。然而&#xff0c;Memcached也可能遇到熱鍵&#xff08;hot key&#…

淺析Kafka-Stream消息流式處理流程及原理

以下結合案例&#xff1a;統計消息中單詞出現次數&#xff0c;來測試并說明kafka消息流式處理的執行流程 Maven依賴 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…

Okhttp實現原理

OkHttp 是一個高效的 HTTP 客戶端庫&#xff0c;廣泛應用于 Android 和 Java 應用中。它提供了簡潔的 API&#xff0c;支持多種協議&#xff0c;如 HTTP/1.x 和 HTTP/2&#xff0c;并且內置了緩存和重試機制。下面是結合源碼分析的 OkHttp 的實現原理&#xff1a; 核心組件 O…

Swift 數據類型

Swift 數據類型 Swift 是一種強類型語言,這意味著在 Swift 中聲明的每個變量和常量都必須具有明確的類型。Swift 的類型系統旨在幫助開發者編寫清晰、安全的代碼。本文將詳細介紹 Swift 中的基本數據類型,包括整數、浮點數、布爾值、字符和字符串。 整數類型 Swift 提供了…

音頻語言學習領域數據集現狀、分類及評估

Audio Language Learning (Audio-Text Learning) 是一個新興的研究領域&#xff0c;專注于處理、理解和描述聲音。它的發展動力是機器學習技術的進步以及越來越多地將聲音與其相應的文本描述相結合的數據集的可用性。 Audio Language Models (ALMs) 是這個領域的關鍵技術&#…

MATLAB中的SDPT3、LMILab、SeDuMi工具箱

MATLAB中的SDPT3、LMILab、SeDuMi工具箱都是用于解決特定數學優化問題的工具箱&#xff0c;它們在控制系統設計、機器學習、信號處理等領域有廣泛的應用。以下是對這三個工具箱的詳細介紹&#xff1a; 1. SDPT3工具箱 簡介&#xff1a; SDPT3&#xff08;Semidefinite Progra…

基于QT開發的反射內存小工具

前言 最近項目需要需要開發一個反射內存小工具&#xff0c;經過2天的修修改終于完成了。界面如下&#xff1a; 功能簡介 反射內存指定地址數據讀取反射內存指定地址數據寫入反射內存指定地址數據清理十進制、十六進制、二進制數據相互轉換 部分代碼 void RfmMain::setWOthe…

SqlSugar-使用SqlSugar進行多數據庫操作

使用SqlSugar進行多數據庫操作主要涉及以下幾個步驟&#xff1a; 1. 配置數據庫連接 首先&#xff0c;你需要在項目的配置文件中&#xff08;如appsettings.json、web.config或app.config&#xff09;配置多個數據庫的連接字符串。每個連接字符串都對應一個不同的數據庫。 例…

攻防世界(PHP過濾器過濾)file_include

轉換過濾器官方文檔&#xff1a;https://www.php.net/manual/zh/filters.convert.php#filters.convert.iconv 這道題因為convert.base64-encode被過濾掉了&#xff0c;所以使用convert.iconv.*過濾器 在激活 iconv 的前提下可以使用 convert.iconv.* 壓縮過濾器&#xff0c; 等…

Win10安裝MongoDB(詳細版)

文章目錄 1、安裝MongoDB Server1.1. 下載1.2. 安裝 2、手動安裝MongoDB Compass(GUI可視工具)2.1. 下載2.2.安裝 3、測試連接3.1.MongoDB Compass 連接3.2.使用Navicat連接 1、安裝MongoDB Server 1.1. 下載 官網下載地址 https://www.mongodb.com/try/download/community …

【第28章】MyBatis-Plus之插件主體

文章目錄 前言一、MybatisPlusInterceptor 概覽1. 屬性2. InnerInterceptor 接口 二、使用示例1.Spring 配置2.Spring Boot 配置3 .mybatis-config.xml 配置 三、攔截忽略注解 InterceptorIgnore四、手動設置攔截器忽略執行策略五、本地緩存 SQL 解析總結 前言 MyBatis-Plus 提…

android 固定圖片大小

在Android中&#xff0c;固定圖片大小可以通過多種方法實現&#xff0c;這些方法主要涉及到ImageView控件的使用、Bitmap類的操作&#xff0c;以及第三方庫&#xff08;如Glide&#xff09;的輔助。以下是幾種常見的方法&#xff1a; 1. 使用ImageView控件 在Android的布局文…

利用docker容器安裝node,使用vue的開發環境

目錄 vue-app ├── docker-data │ ├── site │ ├── app ├── docker-compose.yaml └── deploy.sh docker-compose.yaml yaml文件執行 version: 3.8services:node:image: node:latestcontainer_name: vue-appports:- "8080:8080" # 宿主8080映射容器8…

系統服務綜合項目

要求&#xff1a; 現有主機 node01 和 node02&#xff0c;完成如下需求&#xff1a; 1、在 node01 主機上提供 DNS 和 WEB 服務 2、dns 服務提供本實驗所有主機名解析 3、web服務提供 www.rhce.com 虛擬主機 4、該虛擬主機的documentroot目錄在 /nfs/rhce 目錄 5、該目錄由 no…