当前位置: 首页 > news >正文

Vue3 的 expose 介绍

在 Vue 3 中,expose 是一个用于控制组件内部方法和属性暴露给父组件的新功能。这使得父组件可以调用子组件内部的方法或访问其数据,尤其在使用组合式 API(Composition API)时,这种能力非常有用。

1. 基本用法

expose 是一个函数,可以在 setup 函数中调用,用来暴露组件内部的属性和方法。这些被暴露的内容可以被父组件通过 ref 实例来访问和调用。

2. 举例 🌰

子组件

import { defineComponent, ref } from "vue";
export default defineComponent({setup(_, { expose }) {name: 'Child'// 定义组件内部的属性和方法const message = ref('I am child component message');const method = () => {console.log('I am child component method');}// 暴露这些属性和方法expose({message,method});return () => (<div style={{ color: 'red' }}>Child Component</div>);}
});

父组件

import { defineComponent, onMounted, ref } from "vue";
import Child from "./Child";export default defineComponent({setup() {name: 'Father'const childRef = ref();const childValue = ref('');// 方法来调用子组件的暴露方法function callChildMethod() {if (childRef.value) {childRef.value.method();}}// 读取子组件的暴露属性onMounted(() => {if (childRef.value) {childValue.value = childRef.value.message;}});return () => (<div><Child ref={childRef} /><button onClick={callChildMethod} style={{ border: 'none' }}>Call Child Method</button><p style={{ color: 'orange' }}>Child value: {childValue.value}</p></div>);}
});

浅浅解读一下

1)setup 是 Vue3 的组合式 API 中的一个函数,它用于定义组件的响应式状态、计算属性、方法等。它接收两个参数:props 和 context。其中,context 对象包含了 expose 和 emit 等函数。

2)在 setup 函数中调用 expose,传入一个对象,这个对象包含了希望暴露给父组件的属性和方法。父组件可以通过引用子组件实例来访问这些暴露的内容。

3. 注意事项

1、暴露的内容必须是响应式的

当使用 expose 时,需要确保暴露的数据是响应式的,以便父组件可以正确地感知到数据的变化。

2、暴露的接口仅在子组件中有效

只有暴露给父组件的内容可以通过 ref 访问,组件内部的其他内容(例如局部变量)不会被暴露。

3、避免滥用

虽然 expose 提供了很大的灵活性,但过度使用可能会导致组件之间的耦合度增加,从而影响组件的可维护性。尽量保持组件的接口简洁,避免暴露不必要的内容。

4、组合式 API 的用法

expose 与组合式 API 的 setup 函数配合使用。在 setup 中暴露的内容只能通过 expose 明确声明,而不是直接通过 this 访问。

5、expose 的时机

确保在 setup 函数中调用 expose 时,已经完成初始化,这样可以确保父组件在访问这些属性和方法时不会出现未定义的情况。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 代码随想录 day 48 单调栈
  • Chat App 项目之解析(三)
  • 数据结构——关于栈
  • swift微调款框架使用自定义数据集进行通义千问1.5的微调
  • 网站自动化锚文本的实现逻辑
  • Spring websocket并发发送消息异常的解决
  • 保研考研机试攻略:第三章——数学(3)
  • 基于Arch的轻量级发行版Archcraft结合内网穿透实现远程SSH连接
  • Python居然有这么多文件扩展
  • Docker手动在虚拟机上部署前端、后端和数据库
  • SAP LE学习笔记04 - MM与WM跨模块收货到仓库的流程中 如何既创建TR又同时立即在前台创建TO
  • jmeter安装及环境变量配置、Jmeter目录介绍和界面详解
  • Pcie学习笔记(24)
  • Mysql原理与调优-Mysql的内存结构
  • Flask框架探索:轻量级与灵活性的完美结合
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 08.Android之View事件问题
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • CSS实用技巧干货
  • docker容器内的网络抓包
  • ES6核心特性
  • express如何解决request entity too large问题
  • FineReport中如何实现自动滚屏效果
  • java取消线程实例
  • JS基础之数据类型、对象、原型、原型链、继承
  • JS实现简单的MVC模式开发小游戏
  • MySQL数据库运维之数据恢复
  • PAT A1120
  • React16时代,该用什么姿势写 React ?
  • SpiderData 2019年2月16日 DApp数据排行榜
  • SpriteKit 技巧之添加背景图片
  • Vue 动态创建 component
  • webpack入门学习手记(二)
  • 闭包--闭包之tab栏切换(四)
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 一份游戏开发学习路线
  • 栈实现走出迷宫(C++)
  • 中文输入法与React文本输入框的问题与解决方案
  • linux 淘宝开源监控工具tsar
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • UI设计初学者应该如何入门?
  • 国内开源镜像站点
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • # Kafka_深入探秘者(2):kafka 生产者
  • #NOIP 2014# day.1 T2 联合权值
  • (BFS)hdoj2377-Bus Pass
  • (搬运以学习)flask 上下文的实现
  • (二)原生js案例之数码时钟计时
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • .net core 6 redis操作类
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net 无限分类