vue3-組件傳參及計算屬性

?🌈個人主頁:前端青山
🔥系列專欄:Vue篇
🔖人終將被年少不可得之物困其一生

依舊青山,本期給大家帶來vue篇專欄內容:vue3-組件傳參及計算屬性

目錄

vue3中的組件傳參

1、父傳子

2、子傳父

toRef 與 toRefs

vue3中的計算屬性

vue3 中的 watch監聽器

vue3中的組件傳參

組件關系:

父子 props、$panrent

子父 emit自定義事件 $children $refs

兄弟 eventbus中央事件總線 vue3如果需要實現eventbus 安裝第三方庫mitt

跨層級 provider inject

組件狀態共享工具: vuex pinia

1、父傳子

  • 在父組件中給子組件設置自定義屬性 tit,將要傳遞的參數賦值給tit屬性

<!--父組件  -->
<template><p></p><Testvue3 :tit="schoolName"><span>123</span></Testvue3>
</template>
?
<script>
import Testvue3 from "@/components/Testvue3";
export default {name: "App",components: { Testvue3 },setup() {let schoolName = "千鋒"; // 定義要傳給子組件的數據 ?return {schoolName, // 要使用的變量拋出去,這樣就可以在頁面模板中使用該變量};},
};
</script>
  • 在子組件中接收傳過來的屬性通過props ,這個和vue2 一樣沒有變化。

<!-- 子組件 -->
<template><p>{{ tit }}</p><button>點擊事件,子傳父</button>
</template>
?
<script>
export default {data() {return {};},props: ["tit"],setup(props) { // 參數props即為父組件傳過來的參數console.log(props)return {//setup函數返回值為一個對象};},
};
</script>

2、子傳父

  • 給子組件綁定自定義事件,然后在setup中定義該事件對應的方法,因為setup中沒有this ,this為undefined,所以vue的開發者為了解決該問題,在setup中提供了2個形參,prop和context

    • props 為父傳子的參數

    • context 上下文對象,里面有emit 方法,可以實現子傳父

  • 子組件中多了 emits選項,該選項類似于props,接收父組件給子組件綁定的自定義方法,如果不加該選項,vue3 會提示警告。但不影響功能

<!-- 子組件 -->
<template><p>{{ tit }}</p><button @click="emit">點擊事件,子傳父</button>
</template>
<script>
import { reactive } from "vue";
export default {data() {return {};},emits: ["transfer"], // 在子組件中使用emits配置項,接收父組件給我綁定的自定義事件,用法類似于props,                       // 不加該配置項,控制臺會提示警告setup(props, context) {console.log(11, props);console.log(22, context);// 定義方法function emit() {// 子傳父 此處不用this,使用context上下文對象context.emit("transfer", 666);}return {//setup函數返回值為一個對象emit,};},
};
</script>
  • 在父組件接收自定義事件,該事件對應的執行函數的形參就是傳過來的數據,這個就和vue2一樣啦。

    <!--父組件  -->
    <template><p></p><Testvue3 @transfer="showdata"><span>123</span></Testvue3>
    </template>
    <script>
    import Testvue3 from "@/components/Testvue3";
    export default {name: "App",components: { Testvue3 },setup() {function showdata(value) {console.log(value);}return {showdata,};},
    };
    </script>

    toRef 與 toRefs

    定義:toRef 創建一個ref 響應數據

    語法:let name = toRef(person,'name') 將響應對象person中的name屬性單獨拿出來變成響應屬性。

    應用:一般用于將響應對象中的某個屬性單獨提供給外部使用

  • 如下是使用toRef 前的代碼: 插值表達式模板中的 person 有點繁瑣

  • <!-- 子組件 -->
    
    <template><div><p>{{ person.name }} -- {{ person.age }} -- {{ person.job.type }} --{{ person.job.salary }}</p></div>
    </template>
    ?
    <script>
    import { reactive } from "vue";
    export default {setup() {let person = reactive({name: "張三",age: 20,job: {type: "web前端開發",salary: 30,},});return {person,};},
    };
    </script>

  • 如下是使用toRef 后 的代碼,

  • <!-- 子組件 -->
    
    <template><div><p><!-- 在模板中直接使用name,age,type,salary -->{{ name }} -- {{ age }} -- {{ type }} --{{ salary }}</p><p><button @click="name += '-'">修改name</button><button @click="salary++">修改薪水</button></p></div>
    </template>
    ?
    <script>
    import { reactive, toRef } from "vue";
    export default {setup() {let person = reactive({name: "張三",age: 20,job: {type: "web前端開發",salary: 30,},});// 將person 中的name 屬性轉換成ref 響應式數據,這樣就可以直接在模板中使用了,以此類推let name = toRef(person, "name"); let age = toRef(person, "age");let type = toRef(person.job, "type");let salary = toRef(person.job, "salary");return {name,age,type,salary,};},
    };
    </script>
    <style scoped>
    /* @import url(); 引入css類 */
    </style>

  • 使用toRefs 可以將對象中的多個屬性轉換成響應數據,代碼如下:

  • <!-- 子組件 -->
    
    <template><div><p>{{ name }} -- {{ age }} -- {{ job.type }} --{{ job.salary }}</p><p><button @click="name += '-'">修改name</button><button @click="job.salary++">修改薪水</button></p></div>
    </template>
    ?
    <script>
    import { reactive, toRefs } from "vue";
    export default {setup() {let person = reactive({name: "張三",age: 20,job: {type: "web前端開發",salary: 30,},});//toRefs返回一個響應對象,該對象中每個屬性都變成了響應屬性了。這樣就可以直接拿來在模板插值表達式中使用了let person1 = toRefs(person);// console.log(person1);return {...person1, // 使用后擴展運算符展開對象};},
    };
    </script>
    <style scoped>
    /* @import url(); 引入css類 */
    </style>

    關于數據響應式設置的問題:

    1、如何設置一個響應式數據? ref reactive

    2、如何將非響應式數據轉為響應式數據? toRef toRefs

    3、如何將數據設置為只讀數據?不能夠修改 readOnly

vue3中的計算屬性

同vue2不同,使用計算屬性需要引入computed 方法

<template><p>姓:<input type="text" v-model="data.firstname" /></p><p>名:<input type="text" v-model="data.lastname" /></p><p>姓名:<input type="text" v-model="data.fullname" /></p>
</template>
?
<script>
// 引入對應的計算屬性方法
import { reactive, computed } from "vue";
export default {name: "App",setup() {let data = reactive({firstname: "",lastname: "",fullname: "",});// 計算屬性--簡寫// data.fullname = computed(() => {// ? return data.firstname + data.lastname;// });// 計算屬性--完整寫法data.fullname = computed({get() {return data.firstname + data.lastname;},set(value) {console.log(value);data.firstname = value.substr(0, 1);data.lastname = value.substr(1);},});return {data,};},
};
</script>

vue3 中的 watch監聽器

vue3 中的watch 也是 組合式api中的一個方法,所以使用時,需要引入

<template><p>{{ sum }} <button @click="sum++">sum++</button></p><p>{{ fullname }} <button @click="fullname += '-'">修改姓名</button></p><p>{{ userinfo.name }}--{{ userinfo.age }}--{{ userinfo.job.type }}--{{userinfo.job.salary}}K<button @click="userinfo.age++">修改年齡</button><button @click="userinfo.job.salary++">修改薪水</button></p>
</template>
<script>
// 引入對應的計算屬性方法
import { ref, watch, reactive } from "vue";
export default {name: "App",setup() {let sum = ref(0);let fullname = ref("張三");let userinfo = reactive({name: "李四",age: 20,job: {type: "web開發",salary: 20,},});//1、監聽ref定義的響應式數據 immediate初始化就執行watchwatch(sum, (newvalue, oldvalue) => {console.log(newvalue, oldvalue);},{immediate:true});//2、 監聽ref定義的多個響應式數據,immediate初始化就執行watchwatch([sum, fullname], (newvalue, oldvalue) => {console.log(newvalue, oldvalue);}, { immediate: true });
?//3、 監聽reactive 定義的響應式數據// 注意:此處oldvalue 無效(新值與舊值一樣),默認是深度監聽,immediate初始化就執行watchwatch(userinfo,(newvalue, oldvalue) => {console.log(newvalue, oldvalue);},{ immediate: true });return {sum,fullname,userinfo,};},
};
</script>

watchwatchEffect 都能響應式地執行有副作用的回調。它們之間的主要區別是追蹤響應式依賴的方式:

  • watch 只追蹤明確偵聽的數據源。它不會追蹤任何在回調中訪問到的東西。另外,僅在數據源確實改變時才會觸發回調。watch 會避免在發生副作用時追蹤依賴,因此,我們能更加精確地控制回調函數的觸發時機。

  • watchEffect,則會在副作用發生期間追蹤依賴。它會在同步執行過程中,自動追蹤所有能訪問到的響應式屬性。這更方便,而且代碼往往更簡潔,但有時其響應性依賴關系會不那么明確。

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

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

相關文章

數據結構 查找基本概念

敬請期待。。。 1. 適用于折半查找的表的存儲方式及元素排列要求為&#xff08;順序方式存儲&#xff0c;元素有序 &#xff09;。 2. 有一個按元素值排好序的順序表(長度大于2)&#xff0c;分別用順序查找和折半查找與給定值相等的元素&#xff0c;比較次數分別是s和b&am…

拼接合并yuv序列轉成mp4

ffmpeg需要用支持libx264的版本&#xff0c;如果需要&#xff0c;可以從這個網站下載編譯支持libx264\x265的ffmpeg https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-6.1-essentials_build.7z #-*- coding:utf-8-*- import osif __name__ "__main__":# 1 輸入…

實例講解:在3dMax中如何使用python腳本?

如果你是Python或Maxscript的新手&#xff0c;你現在可以跟著這篇文章開始做一些代碼了&#xff0c;本文將讓我們從非常基本的東西開始學習。 如何在3dmax中獲取選定的節點并打印出它們的名稱&#xff1f;所有場景對象如何&#xff1f;我們直接看代碼&#xff1a; import MaxP…

Word/PPT/PDF怎么免費轉為JPG圖片?

1、打開金鳴表格文字識別網站。 2、點擊導航條上的“軟件下載” 3、安裝并打開金鳴表格文字識別軟件。 4、點擊頂部導航欄的“文件轉圖片”。 5、選擇需要轉換成圖片的文件&#xff08;支持Word/PPT/PDF&#xff09;. 6、點“打開”程序將自動分頁轉換為圖片。

【論文閱讀筆記】Smil: Multimodal learning with severely missing modality

Ma M, Ren J, Zhao L, et al. Smil: Multimodal learning with severely missing modality[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2021, 35(3): 2302-2310.[開源] 本文的核心思想是探討和解決多模態學習中的一個重要問題&#xff1a;在訓練和測…

【dart線程之怎么處理異步和順序異步任務隊列】

dart線程之怎么處理異步和順序異步任務隊列 單線程的dart怎么處理異步任務的&#xff1f; 事件循環模型就是實現異步處理任務的核心。 關于阻塞式調用和非阻塞式調用的概念 阻塞和非阻塞關注的是程序在等待調用結果&#xff08;消息、返回值&#xff09;時的狀態阻塞式調用…

JS中的OOP

JS中的OOP OOP 為我們解決了什么問題&#xff1f;想象一下&#xff0c;我們希望為教師提供一個平臺&#xff0c;每位注冊的教師都可以提交分數&#xff0c;并為課程分配作業和其他內容。 如果有一個地方&#xff08;在本例中是一個對象&#xff09;&#xff0c;可以訪問所有教…

Python編寫的爬蟲為什么受歡迎?

每每回想起我當初學習python爬蟲的經歷&#xff0c;當初遇到的各種困難險阻至今都歷歷在目。即便當初道阻且長&#xff0c;窮且益堅&#xff0c;我也從來沒有想過要放棄。今天我將以我個人經歷&#xff0c;和大家聊一聊有關Python語音編寫的爬蟲的事情。談一談為什么最近幾年py…

C#中的事件(委托的發布和訂閱、事件的發布和訂閱、EventHandler類、Windows事件)

目錄 一、委托的發布和訂閱 1.訂閱操作符號“"和取消訂閱操作符號“-” 2.示例源碼 二、事件的發布和訂閱 三、EventHandler類 四、Windows事件 C#中的事件是指某個類的對象在運行過程中遇到的一些特定事情&#xff0c;而這些特定的事情有必要通知給這個對象的使用者…

【海德教育】河北初級職稱報名條件:

河北助理工程師 學歷要求 大專畢業后滿3年&#xff0c;工程類專業 本科畢業后滿1年 &#xff0c;工程類專業 非工程類專業&#xff0c;年限增加2年即可。

多線程,線程池,線程的創建,線程池的參數

文章目錄 多線程-1 高并發〇、使用多線程的場景1. 為什么使用多線程 1. 線程概述1.1 線程和進程1.2 并發和并行1.3 多線程的優勢1.4 程序運行原理1.5 主線程 1.6 線程的 6 種狀態2. 線程的創建和啟動2.1 Thread類2.2創建線程有哪幾種方法2.2.1 繼承**Thread**類&#xff0c;重寫…

centos7 安裝docker

1.卸載舊版本&#xff0c;不管裝沒裝過&#xff0c;執行一下&#xff0c;防止版本沖突 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine 2. yum安裝gcc相關 以及 安…

electron27-react-mateos:基于electron+react18仿matePad桌面系統

基于Electron27React18ArcoDesign搭建桌面版OS管理系統。 electron-react-mateos 基于最新前端跨端技術棧electron27.xreact18arco-designzustand4sortablejs構建的一款仿制matePad界面多層級路由管理OS系統。 ElectronReactOS支持桌面多路由配置&#xff0c;新開窗口彈窗開啟路…

YB4051系列設備是高度集成的 Li-lon 和 Li-Pol 線性充電器,針對便攜式應用的小容量電池。

YB4051H 300mA 單電池鋰離子電池充電器0.1 mA 終端&#xff0c;45nA 電池漏電流 概述&#xff1a; YB4051系列設備是高度集成的 Li-lon 和 Li-Pol 線性充電器&#xff0c;針對便攜式應用的小容量電池。它是一個完整的恒流/恒壓線性充電器。不需要外部感應電阻&#xff0c;由于…

51單片機利用I/O口高阻狀態實現觸摸控制LED燈

51單片機利用I/O口高阻狀態實現觸摸控制LED燈 1.概述 這篇文章介紹使用I/O口的高阻狀態實現一個觸摸控制LED燈亮滅的實驗。該實驗通過手觸摸P3.7引腳&#xff0c;改變電平信號控制燈的亮滅。 2.實驗過程 2.1.實驗材料 名稱型號數量單片機STC12C20521LED彩燈無1晶振12MHZ1電…

Elasticsearch:ES|QL 函數及操作符

如果你對 ES|QL 還不是很熟悉的話&#xff0c;請閱讀之前的文章 “Elasticsearch&#xff1a;ES|QL 查詢語言簡介???????”。ES|QL 提供了一整套用于處理數據的函數和運算符。 功能分為以下幾類&#xff1a; 目錄 ES|QL 聚合函數 AVG COUNT COUNT_DISTINCT 計數為近…

geemap學習筆記013:為遙感動態GIF圖添加圖名

前言 遙感動態GIF圖可以展示地理區域隨時間的變化&#xff0c;這對于監測自然災害、濕地變化、城市擴展、農田變化等方面非常有用&#xff0c;并且可以反復觀察圖像&#xff0c;以更深入地了解地表的動態變化。本節主要是對遙感動態GIF圖添加圖名&#xff0c;以便于更好地理解…

聚觀早報 |一加12正式開啟預訂;OPPO Reno11系列賣點

【聚觀365】11月24日消息 一加12正式開啟預訂 OPPO Reno11系列賣點 小鵬第三季度營收財報 Claude 2.1 聊天機器人公布 現代汽車將與倫敦大學學院合作 一加12正式開啟預訂 全新的一加12系列公開亮相已有一段時間&#xff0c;不久前一加官方宣布&#xff0c;該機將于12月4日…

android:The application could not be installed: INSTALL_FAILED_TEST_ONLY

1、問題描述 在android12 &#xff08;OPPO PEEM00&#xff09;上安裝APP時&#xff0c;提示上述異常 原因分析&#xff1a; android:testOnly&#xff1a;應用是否是為了測試&#xff0c;它可能向外暴露數據&#xff0c;引發安全漏洞。因此國內廠商的手機檢測到這個屬性為t…

ebpf實戰(一)-------監控udp延遲

問題背景: 為了分析udp數據通信中端到端的延遲,我們需要對整個通信鏈路的每個階段進行監控,找出延遲最長的階段. udp接收端有2個主要路徑 1.數據包到達本機后&#xff0c;由軟中斷處理程序將數據包接收并放入udp socket的接收緩沖區 數據接收流程 2. 應用程序調用recvmsg等a…