news 2026/7/27 10:52:27

在 Vue 3 的 setup() 函数中,this 是 undefined。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在 Vue 3 的 setup() 函数中,this 是 undefined。

Vue3的setup()函数中this为undefined,这是Composition API的重要改变。


替代方案包括:通过参数直接访问props和context(包含attrs、slots、emit等),使用解构语法简化写法。


相比Options API,Composition API不再依赖this,而是通过显式参数访问组件属性和方法,如用emit()替代this.$emit,用ref替代this.$el。


这种设计使代码更清晰明确,提升了TypeScript支持度,减少了this的"魔术性"访问。


在 Vue 3 的setup()函数中,thisundefined

这是 Vue 3 Composition API 的一个重要改变。


为什么this是 undefined?

setup()函数中,组件实例尚未被完全创建,所以this不可用。


替代方案

1.访问 Props

import { defineProps } from 'vue'; export default { props: ['title'], setup(props) { // props 作为第一个参数 console.log(props.title); // ✅ 正确 // console.log(this.title); // ❌ 错误!this 是 undefined } };

2.访问 Context(上下文)

export default { setup(props, context) { // context 作为第二个参数 // context 包含以下属性: console.log(context.attrs); // 非 props 的属性 console.log(context.slots); // 插槽 console.log(context.emit); // 触发事件的方法 console.log(context.expose); // 暴露公共属性 } };

3.使用解构语法

export default { setup(props, { attrs, slots, emit, expose }) { emit('myEvent', 'data'); // ✅ 触发事件 } };

4.完整示例

import { ref } from 'vue'; export default { props: ['initialCount'], emits: ['count-changed'], // 声明自定义事件 setup(props, { emit }) { const count = ref(props.initialCount || 0); const increment = () => { count.value++; emit('count-changed', count.value); // 使用 emit 而不是 this.$emit }; return { count, increment }; } };

与 Options API 的对比

// Options API (Vue 2 / Vue 3 兼容) export default { mounted() { console.log(this.$el); // ✅ 可以访问 console.log(this.$props); // ✅ 可以访问 this.$emit('event'); // ✅ 可以访问 } }; // Composition API export default { setup(props, { emit }) { onMounted(() => { // console.log(this.$el); // ❌ 错误!this 是 undefined console.log(props); // ✅ 使用 props 参数 emit('event'); // ✅ 使用 context.emit }); // 如果需要访问模板引用,使用 ref const myElement = ref(null); return { myElement // 在模板中通过 ref="myElement" 绑定 }; } };

主要变化总结

Options APIComposition API
this.$emit()emit()(从 context 获取)
this.$propsprops(setup 参数)
this.$attrsattrs(从 context 获取)
this.$slotsslots(从 context 获取)
this.$el模板引用 (ref)
this.$parent避免使用,考虑 Provide/Inject

这种设计让代码更加明确,减少了this的魔术性,提高了 TypeScript 的支持度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/18 14:24:32

ESP32语音处理终极指南:从零构建智能语音交互系统

ESP32语音处理终极指南:从零构建智能语音交互系统 【免费下载链接】xiaozhi-esp32 小智 AI 聊天机器人是个开源项目,能语音唤醒、多语言识别、支持多种大模型,可显示对话内容等,帮助人们入门 AI 硬件开发。源项目地址:…

作者头像 李华
网站建设 2026/7/19 3:51:28

Opus音频测试文件完整指南:获取4个高质量立体声样本

想要测试Opus音频格式的卓越性能吗?Universal-Tool/a75ce项目为您提供了完美的解决方案!这个开源项目包含4个专业的Opus格式音频测试文件,每个文件都是48kHz采样率的立体声,时长约2分钟,大小仅2MB。无论您是音频开发者…

作者头像 李华
网站建设 2026/7/26 22:15:56

频率响应测试完整指南:系统性能验证的深度剖析

打开系统黑箱的钥匙:频率响应测试实战全解析你有没有遇到过这样的场景?一台精心设计的Buck电源,在负载突变时突然“抽风”振荡;一款高端蓝牙音箱,播放高频音乐时却发出刺耳的啸叫;某个压力传感器&#xff0…

作者头像 李华
网站建设 2026/7/25 18:46:14

ggplot2数据可视化入门:从零开始掌握专业图表制作

ggplot2数据可视化入门:从零开始掌握专业图表制作 【免费下载链接】ggplot2 项目地址: https://gitcode.com/gh_mirrors/ggp/ggplot2 想要快速掌握数据可视化的核心技能吗?ggplot2作为R语言中最强大的绘图系统,能够帮助你轻松创建专业…

作者头像 李华
网站建设 2026/7/24 2:30:16

基于IAR软件的温度控制系统项目应用

如何用 IAR 打造高精度温度控制系统?实战全解析 你有没有遇到过这样的问题:明明 PID 参数调得头都大了,温度还是上蹿下跳;或者代码烧进去后,系统跑着跑着就“死机”——查来查去发现是堆栈溢出,而根本原因是…

作者头像 李华
网站建设 2026/7/19 13:18:36

Komga漫画服务器完整指南:从零开始构建个人数字漫画库

Komga漫画服务器完整指南:从零开始构建个人数字漫画库 【免费下载链接】komga Media server for comics/mangas/BDs/magazines/eBooks with API and OPDS support 项目地址: https://gitcode.com/gh_mirrors/ko/komga Komga是一款功能强大的漫画服务器软件&a…

作者头像 李华