uni-app vue3 setup写法时如果创建一个大驼峰或者是小驼峰的和组件名相同的变量时easycom失效
uni-app vue3 setup写法时如果创建一个大驼峰或者是小驼峰的和组件名相同的变量时easycom失效
示例代码:
<template>
<view class="page">
hello ,这是一个组件 ↓
<c-address-item></c-address-item>
</view>
</template>
<script setup>
</script>
如果创建一个大驼峰或者是小驼峰的和组件名相同的变量,页面就会不加载组件,并且没有任何报错提醒!
<template>
<view class="page">
hello ,这是一个组件 ↓
<c-address-item></c-address-item>
</view>
</template>
<script setup>
let CAddressItem
//或者是
let cAddressItem
</script>
操作步骤:
- 打开页面
预期结果:
- 组件正常加载
实际结果:
- 组件未被加载,没有任何报错
- 微信小程序中的Wxml查看显示,编译出的结果标签缺失了"is"属性
is="components/c-address-item/c-address-item"
bug描述:
如果创建一个大驼峰或者是小驼峰的和组件名相同的变量,页面就会不加载组件,并且没有任何报错提醒!
信息类别 | 信息内容 |
---|---|
产品分类 | uniapp/小程序/微信 |
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | win11 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 3.99 |
第三方开发者工具版本号 | 1.06.2402040 |
基础库版本号 | 3.3.5 |
项目创建方式 | HBuilderX |
在使用 uni-app
和 Vue 3
的 setup
语法时,如果你创建了一个与组件名相同的大驼峰或小驼峰命名的变量,可能会导致 easycom
自动组件注册失效。这是因为 easycom
依赖于组件名的全局注册,而如果你在局部作用域中定义了一个同名的变量,可能会覆盖或干扰 easycom
的组件解析。
问题原因
easycom
是 uni-app
提供的一种自动组件注册机制,它会根据组件的命名规则自动查找并注册组件。当你使用 setup
语法时,如果你在局部作用域中定义了一个与组件名相同的变量,Vue
可能会优先使用局部变量,从而导致 easycom
失效。
解决方案
为了避免这个问题,你可以采取以下几种解决方案:
-
避免使用与组件名相同的变量名: 确保你在
setup
中定义的变量名不会与组件名冲突。例如,如果你有一个组件名为MyComponent
,不要在你的setup
中定义一个名为MyComponent
的变量。export default { setup() { const myComponentData = ref(null); // 避免使用 MyComponent return { myComponentData, }; }, };
-
使用不同的命名风格: 如果你确实需要使用与组件名相似的变量名,可以考虑使用不同的命名风格,例如在变量名前面加上
local
或其他前缀。export default { setup() { const localMyComponent = ref(null); // 使用不同的命名风格 return { localMyComponent, }; }, };
-
显式导入组件: 如果你希望确保组件能够正确注册,可以显式地导入组件,而不是依赖
easycom
。import MyComponent from '@/components/MyComponent.vue'; export default { components: { MyComponent, }, setup() { const myComponentData = ref(null); return { myComponentData, }; }, };
-
使用
unplugin-vue-components
插件: 如果你使用的是Vite
或Webpack
,可以考虑使用unplugin-vue-components
插件来自动导入组件,这样可以避免手动导入和easycom
的冲突。// vite.config.js import Components from 'unplugin-vue-components/vite'; import { VantResolver } from 'unplugin-vue-components/resolvers'; export default { plugins: [ Components({ resolvers: [VantResolver()], }), ], };