Vue3 defineExpose要在方法聲明定義以后使用的教程
defineExpose要在變量和方法聲明定義之后再使用,否則瀏覽器的控制臺(tái)會(huì)輸出很多警告,并且最終將該頁(yè)面卡死。
[Vue3] defineExpose要在方法聲明定義以后使用
Vue3
中的setup
默認(rèn)是封閉的,如果要從子組件向父組件暴露屬性和方法,需要用到defineExpose
.
和defineProps, defineEmits
一樣,這三個(gè)函數(shù)都是內(nèi)置的,不需要import
.
不過(guò)defineProps, defineEmits
都會(huì)返回一個(gè)實(shí)例,而defineExpose
是無(wú)返回值的.
const props = defineProps({}) const emit = defineEmits([]) defineExpose({})
defineExpose的使用
子組件Child.vue
<template> {{ name }} </template> <script setup> import { ref } from 'vue' const name = ref("Nicholas.") const sayName = ()=>{ console.log("my name is "+name.value) } defineExpose({ name, sayName }); </script>
父組件Father.vue
<template> <Child ref="child"></Child> </template> <script setup> import { ref, onMounted } from 'vue' const child = ref(null) onMounted(()=>{ console.log(child.value.name) // "Nicholas" child.value.sayName() // "my name is Nicholas" }) </script>
總結(jié)
向外暴露的時(shí)候變量會(huì)自動(dòng)解包,比如上面子組件的name:ref<String>
暴露到父組件的時(shí)候自動(dòng)變成了name:String
.
注:defineExpose一定要在變量和方法聲明定義之后再使用。
不知道以后會(huì)不會(huì)有修改,不過(guò)在2023/02/17
,如果defineExpose
寫(xiě)在變量和函數(shù)前面,那么瀏覽器的控制臺(tái)會(huì)輸出很多警告,并且最終將該頁(yè)面卡死。
擴(kuò)展:vue3 defineExpose
vue3使用 setup 語(yǔ)法糖后如何在父組件用ref調(diào)用子組件的方法
什么是setup語(yǔ)法糖
- 更少的樣板內(nèi)容,更簡(jiǎn)潔的代碼。
- 能夠使用純 Typescript 聲明 props 和拋出事件。
- 更好的運(yùn)行時(shí)性能 (其模板會(huì)被編譯成與其同一作用域的渲染函數(shù),沒(méi)有任何的中間代理)。
//要使用這個(gè)語(yǔ)法,需要將 setup attribute 添加到 <script> 代碼塊上: <script setup> console.log('hello script setup') //里面的代碼會(huì)被編譯成組件 setup() 函數(shù)的內(nèi)容。這意味著與普通的 <script> 只在組件被首次引入的時(shí)候執(zhí)行一次不同,<script setup> 中的代碼會(huì)在每次組件實(shí)例被創(chuàng)建的時(shí)候執(zhí)行。 </script>
當(dāng)我們的組件使用這種語(yǔ)法時(shí),是不可以用setup()這種語(yǔ)法的寫(xiě)法獲取子組件的數(shù)據(jù)或方法
為了在 script setup 組件中明確要暴露出去的屬性,使用 defineExpose 編譯器宏:
<script setup> import { ref } from 'vue' const a = 1 const b = ref(2) defineExpose({ a, b }) //當(dāng)父組件通過(guò)模板 ref 的方式獲取到當(dāng)前組件的實(shí)例,獲取到的實(shí)例會(huì)像這樣 { a: number, b: number } (ref 會(huì)和在普通實(shí)例中一樣被自動(dòng)解包) </script>
下面是vue3 使用setup()后 父組件獲取子組件的方法
1、父組件
template中
<Table ref="eleTable" @handle="handleFun"></Table> import { ref } from 'vue'
2、子組件
setup() { //ref方法 const eleTable = ref() //eleTable是頁(yè)面ref后面對(duì)應(yīng)的名字 const clickSon = () => { eleTable.value.changeShowText() //調(diào)用子組件的方法 let arr = eleTable.value.tableData //獲取子組件 setup 里面定義的變量 } }
使用語(yǔ)法糖之后的寫(xiě)法
父組件
<FastreplySettingTable ref="FastreplySettingTableRef" v-if="sysStore.msgList" :groupType="Math.abs(state.currentTab - 1)" :currentTab="state.currentTab" ></FastreplySettingTable> <script> const FastreplySettingTableRef = ref(); //該方法是一個(gè)點(diǎn)擊事件 function sendEvent(action) { if (FastreplySettingTableRef) { //拿到FastreplySettingTableRef組件里的dispatchEvent方法 并且穿一些參數(shù) FastreplySettingTableRef.value.dispatchEvent({ action, groupType: Math.abs(state.currentTab - 1) }) } } </script>
子組件
import { getCurrentInstance, onMounted, reactive, onBeforeUnmount, defineProps, defineEmits, computed, onBeforeMount, onUnmounted, watch, ref, //這里必須引入 defineExpose } from "vue"; // 希望被父組件調(diào)用到的方法 //這個(gè)方法必須寫(xiě)在defineExpose 上面才會(huì)生效 const dispatchEvent = ({ action, groupType }) => { switch (action) { case 'tabClick': { state.searchKeyword = '', state.activeGroup = 'all' }; break; case 'addfastMsg': { //上報(bào) openMask('addfastMsg'); // state.DialogTitle = state.groupType ? "快捷消息管理-添加團(tuán)隊(duì)內(nèi)容" : "快捷消息管理-添加個(gè)人內(nèi)容" // spiderReport.paq(props.groupType ? "快捷消息管理-添加團(tuán)隊(duì)內(nèi)容" : "快捷消息管理-添加個(gè)人內(nèi)容"); }; break; default: { // state.[action](groupType); } } } defineExpose({ dispatchEvent })
到此這篇關(guān)于Vue3 defineExpose要在方法聲明定義以后使用的教程的文章就介紹到這了,更多相關(guān)Vue3 defineExpose內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Vue 2中的? initState 狀態(tài)初始化
這篇文章主要介紹了詳解Vue 2中的initState狀態(tài)初始化,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08vue移動(dòng)端使用canvas簽名的實(shí)現(xiàn)
這篇文章主要介紹了vue移動(dòng)端使用canvas簽名的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Vue通過(guò)WebSocket建立長(zhǎng)連接的實(shí)現(xiàn)代碼
這篇文章主要介紹了Vue通過(guò)WebSocket建立長(zhǎng)連接的實(shí)現(xiàn)代碼,文中給出了問(wèn)題及解決方案,需要的朋友可以參考下2019-11-11Vue3全局掛載使用Axios學(xué)習(xí)實(shí)戰(zhàn)
這篇文章主要為大家介紹了Vue3全局掛載使用Axios學(xué)習(xí)實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Vue單頁(yè)面應(yīng)用做預(yù)渲染的方法實(shí)例
vue是一個(gè)單頁(yè)面的應(yīng)用,這導(dǎo)致一些爬蟲(chóng)和百度無(wú)法搜索到,如果你想針對(duì)你應(yīng)用的其中某些頁(yè)面進(jìn)行SEO優(yōu)化,讓他們可以被爬蟲(chóng)和百度搜索到,你可以進(jìn)行預(yù)渲染操作,下面這篇文章主要給大家介紹了關(guān)于Vue單頁(yè)面應(yīng)用做預(yù)渲染的相關(guān)資料,需要的朋友可以參考下2021-10-10vue在響應(yīng)頭response中獲取自定義headers操作
這篇文章主要介紹了vue在響應(yīng)頭response中獲取自定義headers操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07vue 使用rules對(duì)表單字段進(jìn)行校驗(yàn)的步驟
這篇文章主要介紹了vue 使用rules對(duì)表單字段進(jìn)行校驗(yàn)的步驟,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下2020-12-12