当前位置: 首页 > 知识库问答 >
问题:

前端 - vue 开发中内置元素怎么提供提示?

公良育
2024-10-03


换了 Vue-Official 的编辑器扩展后就不生效,如果使用之前的 volar 是可以生效的。

import { Component, SwiperProps, SwiperItemProps, SwiperItem } from '@uni-helper/uni-app-types'
declare global {
  namespace JSX {
    interface IntrinsicElements {
      swiper: SwiperProps
      // swiperItem: SwiperItemProps
      swiperItem: SwiperItem
      swiper20: SwiperItemProps
    }
  }
}

declare module '@vue/runtime-core' {
  interface GlobalComponents {
    swiper: SwiperProps
    swiperItem: SwiperItemProps
    swiper20: SwiperItemProps
  }
}

declare module 'vue3/jsx-runtime' {
  namespace JSX {
    interface IntrinsicElements {
      swiper: SwiperProps
      swiperItem: SwiperItemProps
      swiper20: SwiperItemProps
    }
  }
}

试了一下上面的方式都没用生效,其中 props 结尾的类型是组件的属性类型。SwiperItem 等于 _SwiperItem, type _SwiperItem = _Component<_SwiperItemProps>

共有2个答案

厉钊
2024-10-03

https://uni-typed.netlify.app/guide/uni-app-types.html#%E9%85...

闾丘谦
2024-10-03

在 Vue 开发中,如果你正在使用 JSX 并且想要为自定义组件或内置元素(如你例子中的 swiperswiperItem)提供类型提示,你需要确保你的类型声明正确,并且与你的项目设置(包括使用的编辑器扩展)兼容。

首先,从你提供的代码片段来看,有几个地方可能存在问题或不一致:

  1. 拼写错误:你声明了 SwiperPropsSwiperItemProps,但通常应该是 SwiperSwiperItem 的拼写错误,比如可能是 Swiper 应该是 Swiperswiper(取决于你的组件名),SwiperItemProps 应该是 SwiperItemPropsswiperItemProps(同样取决于你的组件和属性名)。
  2. 全局 JSX 命名空间声明:你的 JSX 命名空间声明看起来是正确的,但是确保你的组件名和属性名与实际的组件和属性名相匹配。
  3. Vue 编辑器扩展:你提到在切换到 Vue-Official 的编辑器扩展后,类型提示不生效。这可能是因为该扩展不完全支持 JSX 或与你的项目配置不兼容。你可以尝试查看该扩展的文档或社区,看看是否有相关的配置或限制。
  4. 类型声明位置:你的类型声明可能需要在正确的位置。通常,这些声明会放在全局的 .d.ts 文件中,或者在你的组件文件旁边。
  5. Vue 3 和 JSX 运行时:你提到 vue3/jsx-runtime,但通常 Vue 3 使用的是 @vue/babel-plugin-jsx 或直接在 Vue 3 的 JSX 转换中处理 JSX。确保你的 Babel 配置或 TypeScript 配置支持 JSX。

解决步骤

  1. 检查拼写:确保所有的组件名和属性名都是正确的,没有拼写错误。
  2. 更新或回退编辑器扩展:如果 Vue-Official 编辑器扩展不工作,尝试回退到之前工作的版本(如 Volar),或者查看是否有更新解决了问题。
  3. 检查类型声明:确保你的类型声明正确,并且与你的组件和属性名匹配。
  4. 配置 TypeScript:确保你的 tsconfig.json 包含了正确的 JSX 配置(如果你在使用 TypeScript)。
  5. 查看文档和社区:查看 Vue、Volar、TypeScript 的文档和社区,看看是否有其他人遇到并解决了类似的问题。
  6. 简化问题:尝试从简单的组件和属性开始,逐步增加复杂度,以便更容易地定位问题。

示例类型声明

以下是一个简化的类型声明示例,用于 Vue 3 和 JSX:

// 在全局的 .d.ts 文件中
declare module '*.vue' {
  import { DefineComponent } from 'vue';
  const component: DefineComponent<{}, {}, any>;
  export default component;
}

// 对于 JSX 自定义元素
declare global {
  namespace JSX {
    interface IntrinsicElements {
      'swiper': {
        // swiper 的 props
        props: {
          // 属性定义
          autoplay?: boolean;
          // ... 其他属性
        };
      };
      'swiper-item': {
        // swiper-item 的 props
        props: {
          // 属性定义
          // ...
        };
      };
    }
  }
}

注意:这里的 'swiper''swiper-item' 应该是你实际使用的组件标签名。

 类似资料:
  • 比如把鼠标悬停在某个函数上,但是 vscode 没有任何智能提示 vue 的插件我都安装了 不知道是不是和这个蓝色波浪号有关系

  • 框架基本固定,开发按结构来就可以了. 许多小功能基本都是一样的逻辑, 增,删,查,改. 数据表基本差不多,少量不一致,不能合表. 一个小功能下来,大多时间都在定义 api,对象,各层参数传递,转换,重复着基本一样的逻辑. 几个小功能下来,写都写烦了. 这个好像又没有好的办法避免,实在是想跳出这种又费力又对耐心的拆磨(虽然不费什么神思考太多,但对精神很是折磨),大家对此有没有经验分享一二. 哈哈,见

  • 时间线8.29下午2点-5点 一面 自我介绍 实习经历 Kafka顺序问题 对Spring的理解 AOP实现原理 注解失效的场景 HashMap 底层 装饰器模式 Redis数据类型 跳表结构 Zset怎么实现按分值进行排序的 Spring Cloud 组件 Feign 过程 Dubbo 比 Feign优势 为什么选择JSON序列化方式 有做数据的压缩嘛 Spring Security用来干嘛的

  • 滴滴一、二面 一面 介绍项目,讲一下项目难点 你的缓存和数据库是怎么保证一致性的 如果在缓存还没过期的时间内,数据库的数据就发生变更了怎么办 超卖问题怎么解决的 分布式锁是怎么做的 看门狗机制是怎么实现的 redis分布式锁底层是基于什么命令实现的 少买是怎么解决的 你的消息队列里面存的是什么内容 如果进队列前返回给用户成功,但是实际上库存已经不足了,这时候进消息队列了,用户实际上是抢不到票的,这

  • 古老的框架有些代码不能提示 都是 $messageModule = kernel::single('class_name');这样调用的 怎么让$messageModule写代码时有提示哪些方法呢

  • 确保最新的pact契约得到验证 使用最新的可用的pact契约访问地址。 不要依赖手动干预(例如,将文件复制到提供者项目中)。因为这个步骤将分解或中断验证过程,导致某些验证任务错误。 不要试图通过手动更新pact契约的方式来“保证”测试通过。 pact:verify是集成验证的金丝雀方式 - 而手动更新就像给金丝雀戴上防毒面具,失去了本来意义。 确保Pact测试作为CI构建的一部分它应该与所有其他测