前提条件

这是一个使用vite + vue3 + ts的项目,包依赖环境如下所示:其中package.josn如下所示

{
  "name": "vue3-ts-vite-wen-zhang-ji-lu-xiang-mu",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "element-plus": "^2.4.2",
    "vue": "^3.3.4"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^4.2.3",
    "sass": "^1.69.5",
    "typescript": "^5.0.2",
    "vite": "^4.4.5",
    "vue-tsc": "^1.8.5"
  }
}

Uncaught ReferenceError: defineProps is not defined

XXX.vue如下所示

<template>
  <div style="width: 100%; height: 100%;">
    这是内容
  </div>
</template>

<script lang="ts">
// 这是一个宏,是不需要额外引入的,如果报错,说明这vue文件有问题,缺少了点什么
defineProps<{
  name?: string;
}>()
</script>


<style scoped lang="scss">
.el-container {
  width: 100%;
  height: 100%;
}
</style>

出现了如下所示的报错
在这里插入图片描述

Uncaught ReferenceError: defineProps is not defined

即使导入也不行

<template>
  <div style="width: 100%; height: 100%;">
    这是内容
  </div>
</template>

<script lang="ts">
import { defineProps } from 'vue'
// 这是一个宏,是不需要额外引入的,如果报错,说明这vue文件有问题,缺少了点什么
defineProps<{
  name?: string;
}>()
</script>


<style scoped lang="scss">
.el-container {
  width: 100%;
  height: 100%;
}
</style>

会报警告的,一样不能拿到vue3组件中的props中的数据,警告如下所示:
在这里插入图片描述

“[Vue warn]: defineProps() is a compiler-hint helper that is only usable inside script setup of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.”

报错原因

defineProps() 是一个编译提示辅助函数,专为在 Vue 3 单文件组件(SFC)的 <script setup> 中使用而设计。它允许你在一种更简洁的方式下声明和可选地为组件的 props 指定类型,而无需在 props 选项中单独定义它们。

<script setup> 中使用 defineProps() 时,编译器会推断 prop 的类型,并生成必要的代码以确保组件能够正确接收其 props。这意味着在运行时传递给 defineProps() 的参数实际上不会产生任何效果,因为所有相关逻辑都在编译阶段完成了。

换句话说,defineProps() 的主要作用是在编译阶段帮助生成类型安全的 prop 接口,从而在开发过程中提供更好的类型检查和代码补全支持。一旦编译完成,运行时的代码中将不再保留 defineProps() 的调用,因此它不会对最终的运行时行为造成影响。

对于那些关心性能或最小化运行时包大小的开发者来说,这是一个重要的细节,因为它意味着 defineProps() 不会在运行时增加额外的开销。同时,这也强调了 <script setup> 和 defineProps() 等语法糖的主要价值在于提高开发效率和代码质量,而不是在运行时执行特定的任务。

解决办法

在这里插入图片描述

<template>
  <div style="width: 100%; height: 100%;">
    这是内容
  </div>
</template>

<script setup lang="ts">
// 这是一个宏,是不需要额外引入的,如果报错,说明这vue文件有问题,缺少了点什么
defineProps<{
  name?: string;
}>()
</script>


<style scoped lang="scss">
.el-container {
  width: 100%;
  height: 100%;
}
</style>
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐