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)文章
一文帶你深入了解V-model實(shí)現(xiàn)數(shù)據(jù)雙向綁定
這篇文章主要為大家詳細(xì)介紹了V-model實(shí)現(xiàn)數(shù)據(jù)雙向綁定的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
vscode中使用vue的一些插件總結(jié)(方便開(kāi)發(fā))
對(duì)于很多使用vscode編寫(xiě)vue項(xiàng)目的新手同學(xué)來(lái)說(shuō),可能不知道使用什么插件,下面這篇文章主要給大家介紹了關(guān)于vscode中使用vue的一些插件,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
前端vue如何通過(guò)URL訪(fǎng)問(wèn)存儲(chǔ)在服務(wù)器或磁盤(pán)的圖片
在Vue中,通常需要將圖片存儲(chǔ)在服務(wù)器端,并通過(guò)url地址來(lái)訪(fǎng)問(wèn),下面這篇文章主要給大家介紹了前端vue如何通過(guò)URL訪(fǎng)問(wèn)存儲(chǔ)在服務(wù)器或磁盤(pán)的圖片的相關(guān)資料,需要的朋友可以參考下2024-02-02
vue和element上傳圖片以及進(jìn)行拖拽圖片排序問(wèn)題
這篇文章主要介紹了vue和element上傳圖片以及進(jìn)行拖拽圖片排序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Vue首評(píng)加載速度及白屏?xí)r間優(yōu)化詳解
這篇文章主要介紹了vue項(xiàng)目?jī)?yōu)化首評(píng)加載速度,以及白屏?xí)r間過(guò)久的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09
Vue Router中獲取路由傳遞過(guò)來(lái)的參數(shù)(方法詳解)
在VueRouter中,可以通過(guò)動(dòng)態(tài)路由匹配和查詢(xún)參數(shù)`query`來(lái)傳遞參數(shù),并將路由參數(shù)或查詢(xún)參數(shù)作為組件的`props`傳遞,動(dòng)態(tài)路由匹配使用`route.params`訪(fǎng)問(wèn)參數(shù),查詢(xún)參數(shù)使用`route.query`訪(fǎng)問(wèn),本文給大家介紹Vue Router中獲取路由傳遞過(guò)來(lái)的參數(shù),感興趣的朋友一起看看吧2025-02-02

