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

Vue 3 中调用子组件方法

在 Vue 3 中调用子组件方法与 Vue 2 有显著差异,这源于 Vue 3 底层架构的革新。

一、核心差异对比表

特性Vue 2Vue 3
组件实例获取this.$refs.childRefchildRef.value
方法暴露方式自动暴露所有方法需手动使用 defineExpose 暴露
响应式系统Object.definePropertyProxy
Composition API核心架构
类型支持弱类型强类型支持

二、具体实现方式对比

1. Vue 2 实现方式(Options API)
<!-- 父组件 -->
<template><ChildComponent ref="childRef" /><button @click="callChild">调用子组件方法</button>
</template><script>
export default {methods: {callChild() {// 直接通过 $refs 访问子组件实例this.$refs.childRef.childMethod('参数');}}
}
</script><!-- 子组件 -->
<script>
export default {methods: {childMethod(param) {console.log('子组件方法被调用', param);}}
}
</script>
2. Vue 3 实现方式(Composition API + <script setup>
<script setup lang="ts">
import HelloWorld from "./components/HelloWorld.vue";
import {onMounted, ref} from "vue";const helloWorldRef = ref(null)
onMounted(()=>{helloWorldRef.value?.printLog()
})
</script><template><HelloWorld ref="helloWorldRef"></HelloWorld>
</template><!-- 子组件 HelloWorld.vue -->
<script setup lang="ts">
// 必须显式暴露方法
const printLog = () => {console.log('Hello World ===')
}
// 关键!暴露方法给父组件
defineExpose({printLog
})
</script><template><h1>Hello World</h1>
</template>

三、架构差异的本质原因

1. 响应式系统重构(Proxy vs Object.defineProperty)

Vue 3 使用 Proxy 实现响应式:

  • 封装性增强:Proxy 要求明确暴露接口
  • 性能优化:避免 Vue 2 中递归遍历所有属性
  • 安全控制:防止父组件意外修改子组件内部状态
2. 模块化与 Tree-shaking
  • 未暴露的方法不会进入父组件作用域
  • 减少不必要的代码关联
  • 提升应用可维护性

四、原理级差异总结

维度Vue 2Vue 3优势
组件模型类实例模型函数作用域模型更好的 Tree-shaking
访问控制开放所有方法白名单暴露机制增强封装性
响应式追踪全实例追踪精准依赖追踪减少不必要的渲染
内存占用组件实例较大轻量级代理提升大型应用性能
TS 支持类型推导困难精准类型推断开发体验提升

💡 架构演进本质:从 “组件即对象” (OOP) 到 “组件即函数” (FP) 的范式转变,体现了现代前端框架向函数式、组合式、类型安全方向的发展趋势。

这种设计变化虽然增加了显式暴露的步骤,但带来了更好的封装性、类型安全性和长期可维护性,是 Vue 框架走向成熟的重要标志。

http://www.lryc.cn/news/590521.html

相关文章:

  • LLM大语言模型不适合统计算数,可以让大模型根据数据自己建表、插入数据、编写查询sql统计
  • 从洞察到行动:大数据+AI赋能消费者洞察
  • 【前端】HTML语义标签的作用与实践
  • Ubuntu GRUB菜单密码重置教程
  • 重学SpringMVC一SpringMVC概述、快速开发程序、请求与响应、Restful请求风格介绍
  • 【一文解决】块级元素,行内元素,行内块元素
  • 第五章 OB 分布式事务高级技术
  • exports使用 package.json字段控制如何访问你的 npm 包
  • 多人协作游戏中,团队共同获取的装备如何确定按份共有或共同共有
  • 软路由 + 代理 IP 实现多手机不同公网 IP 分配教程
  • 从0开始学习R语言--Day48--Calibration Curves 评估模型
  • JobSet:Kubernetes 分布式任务编排的统一解决方案
  • 【add vs commit】Git 中的 add 和 commit 之间的区别
  • PLUS模型+生态系统服务多情景模拟预测实践技术
  • 大语言模型幻觉检测:语义熵揭秘
  • Reddit Karma是什么?Post Karma和Comment Karma的提升指南
  • 精彩代码分析-1
  • 光伏项目快速获取地址,三种地图赋能设计
  • 倪海厦全套下载,八纲辨证,人纪,天纪,针灸,电子版
  • vue3中高阶使用与性能优化
  • Day04_C语言网络编程20250716
  • Nginx,MD5和Knife4j
  • PHP面向对象编程:类与对象的基础概念与实践
  • Uniapp中双弹窗为什么无法显示?
  • Coze工作流无法更新问题处理
  • React+Next.js+Tailwind CSS 电商 SEO 优化
  • 2_概要设计编写提示词_AI编程专用简化版
  • 正确选择光伏方案设计软件:人力成本优化的关键一步
  • 【技术追踪】基于检测器引导的对抗性扩散攻击器实现定向假阳性合成——提升息肉检测的鲁棒性(MICCAI-2025)
  • 第五届计算机科学与区块链国际学术会议(CCSB 2025)