Vue3 defineExpose要在方法声明定义以后使用的教程
作者:feixianxing 发布时间:2024-05-21 10:30:03
defineExpose要在变量和方法声明定义之后再使用,否则浏览器的控制台会输出很多警告,并且最终将该页面卡死。
[Vue3] defineExpose要在方法声明定义以后使用
Vue3
中的setup
默认是封闭的,如果要从子组件向父组件暴露属性和方法,需要用到defineExpose
.
和defineProps, defineEmits
一样,这三个函数都是内置的,不需要import
.
不过defineProps, defineEmits
都会返回一个实例,而defineExpose
是无返回值的.
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>
总结
向外暴露的时候变量会自动解包,比如上面子组件的name:ref<String>
暴露到父组件的时候自动变成了name:String
.
注:defineExpose一定要在变量和方法声明定义之后再使用。
不知道以后会不会有修改,不过在2023/02/17
,如果defineExpose
写在变量和函数前面,那么浏览器的控制台会输出很多警告,并且最终将该页面卡死。
扩展:vue3 defineExpose
vue3使用 setup 语法糖后如何在父组件用ref调用子组件的方法
什么是setup语法糖
更少的样板内容,更简洁的代码。
能够使用纯 Typescript 声明 props 和抛出事件。
更好的运行时性能 (其模板会被编译成与其同一作用域的渲染函数,没有任何的中间代理)。
//要使用这个语法,需要将 setup attribute 添加到 <script> 代码块上:
<script setup>
console.log('hello script setup')
//里面的代码会被编译成组件 setup() 函数的内容。这意味着与普通的 <script> 只在组件被首次引入的时候执行一次不同,<script setup> 中的代码会在每次组件实例被创建的时候执行。
</script>
当我们的组件使用这种语法时,是不可以用setup()这种语法的写法获取子组件的数据或方法
为了在 script setup 组件中明确要暴露出去的属性,使用 defineExpose 编译器宏:
<script setup>
import { ref } from 'vue'
const a = 1
const b = ref(2)
defineExpose({
a,
b
})
//当父组件通过模板 ref 的方式获取到当前组件的实例,获取到的实例会像这样 { a: number, b: number } (ref 会和在普通实例中一样被自动解包)
</script>
下面是vue3 使用setup()后 父组件获取子组件的方法
1、父组件
template中
<Table ref="eleTable" @handle="handleFun"></Table>
import { ref } from 'vue'
2、子组件
setup() {
//ref方法
const eleTable = ref() //eleTable是页面ref后面对应的名字
const clickSon = () => {
eleTable.value.changeShowText() //调用子组件的方法
let arr = eleTable.value.tableData //获取子组件 setup 里面定义的变量
}
}
使用语法糖之后的写法
父组件
<FastreplySettingTable
ref="FastreplySettingTableRef"
v-if="sysStore.msgList"
:groupType="Math.abs(state.currentTab - 1)"
:currentTab="state.currentTab"
></FastreplySettingTable>
<script>
const FastreplySettingTableRef = ref();
//该方法是一个点击事件
function sendEvent(action) {
if (FastreplySettingTableRef) {
//拿到FastreplySettingTableRef组件里的dispatchEvent方法 并且穿一些参数
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";
// 希望被父组件调用到的方法
//这个方法必须写在defineExpose 上面才会生效
const dispatchEvent = ({ action, groupType }) => {
switch (action) {
case 'tabClick': {
state.searchKeyword = '',
state.activeGroup = 'all'
}; break;
case 'addfastMsg': {
//上报
openMask('addfastMsg');
// state.DialogTitle = state.groupType ? "快捷消息管理-添加团队内容" : "快捷消息管理-添加个人内容"
// spiderReport.paq(props.groupType ? "快捷消息管理-添加团队内容" : "快捷消息管理-添加个人内容");
}; break;
default: {
// state.[action](groupType);
}
}
}
defineExpose({
dispatchEvent
})
来源:https://www.cnblogs.com/feixianxing/archive/2023/02/17/define-expose-used-after-the-method-declaration-definition.html


猜你喜欢
- 1. random库基本介绍Random库时使用随机数的python标准库伪随机数:采用梅森旋转算法生成的(伪)随机序列中的元素Random
- 先给大家展示下效果图,如果大家感觉还不错,请继续参考实现思路详解。布局1.左右各一半(col-md-6)2.左侧登录框占左侧一半的10/12
- 在python3.6版本中去掉了os.path.walk()函数os.walk()函数声明:walk(top,topdown=True,on
- 一、赋值不会开辟新的内存空间,只是复制了新对象的引用。所以当一个数据发生变化时,另外一个数据也会随之改变。二、浅拷贝创建新对象,其内容是对原
- 一、绪论在使用python开发过程中经常会使用到第三方库。因此就涉及到了如何安装、复制移动。二、安装方式第三方库的安装方式1、python自
- 在 MySQL 中通常我们使用 limit 来完成页面上的分页功能,但是当数据量达到一个很大的值之后,越往后翻页,接口的响应速度就越慢。本文
- MYSQL模块暂时还不支持python3.0以上的版本,由于我下载的python是3.0版本的,所以想要连接数据库只能利用其它的方法。Pyt
- 一个XML文档如果符合一些基本的规范,那它就是结构规范的。XML格式有一套比HTML简单的解析规则,允许XML解析器不需要外部描述或了解数据
- 写在前面Omi框架可以通过在组件上声明 data-* 把属性传递给子节点。Omi从设计之初,就是往标准的DOM标签的标准传递方式靠齐。比如:
- IN主要用于传入参数,可以是变量,常量,表达式,在子程序内部不能改变其值. 代码如下:DECLARE n NUMBER := 10; PRO
- 2012年,Hinton的学生Alex Krizhevsky提出了深度卷积神经网络模型AlexNet,它可以算是LeNet的一种更深更宽的版
- 当然如果想了解更多编辑器的原理制作方法,只有你自己去下载一个在线编辑器,慢慢研究,相信会有更多的收获!HTML在线编辑器的基本概念1,什么是
- Pydicom单张影像的读取使用 pydicom.dcmread() 函数进行单张影像的读取,返回一个pydicom.dataset.Fil
- 目录1. 测试环境1.1 软硬件1.2 表结构2. 测试目的2.1 压缩空间对比2.2 查询性能对比3. 测试工具3.1 mysqlslap
- GOPATH设置go 命令依赖一个重要的环境变量:$GOPATH1(注:这个不是Go安装目录。下面以笔者的工作目录为说明,请替换自己机器上的
- var str = "pig cat fish、dog horse monkey bear、lion、fox&quo
- 闪回区爆满问题也是经常会遇到的问题,最关键的是闪回设置大小以及归档被默认存放在了闪回目录,恰巧今天又遇到了这个问题,就记录下处理步骤,仅供遇
- 在这个简短的教程中,我会介绍将python列表转换为字符串的不同方法。为什么要将python列表转换为字符串?将python列表转换为字符串
- 一个完整的数据挖掘模型,最后都要进行模型评估,对于二分类来说,AUC,ROC这两个指标用到最多,所以 利用sklearn里面相应的函数进行模
- 第一种: php部分 <?php if($_FILES['file']['error']&