vue-ant-design踩坑

作者在维护一个基于Vue的老项目时遇到a-list组件不工作的问题,尝试了版本切换和赋值时机调整,但未解决问题。最终改用table组件成功展示了字符串列表,总结指出在Vue开发中应使用SFC和现代构建工具,以及遇到问题时可尝试更换组件或排查版本差异。

Ant-Design-Vue踩坑经历(a-list组件)

1.踩坑背景

由于论文组需要,最近维护一个比较老vue的项目,并在此基础上根据需要做出一些更改。

项目的需求从业务背景抽象出来是是展示一个可以动态调整的字符串列表

这个项目没有使用SFC,没有一个个的.vue文件组合起来,因此代码之间存在较强的耦合性,维护起来不太方便。

这个项目也没有使用vite这样的打包工具,是直接在服务器上运行html文件得到的。

使用的组件是ant组件库,因此我考虑在ant组件库中寻找一个展示列表的组件,再通过数据绑定,当字符串数组的内容变化时,界面上组件的内容也会自动相应变化。

2.出现的问题

经查找,ant组件库中的a-list组件比较符合要求:a-list组件链接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0rkldBaX-1680523025664)(C:\Users\Zhai yanbo\AppData\Roaming\Typora\typora-user-images\image-20230403191641666.png)]

对应的模板代码如下,其中data作为一个字符串数组即可。

<h3 :style="{ margin: '16px 0' }">Small Size</h3>
  <a-list size="small" bordered :data-source="data">
    <template #renderItem="{ item }">
      <a-list-item>{{ item }}</a-list-item>
    </template>
    <template #header>
      <div>Header</div>
    </template>
    <template #footer>
      <div>Footer</div>
    </template>
  </a-list>

于是,我的项目中使用了这个组件:

在html文件中写入模板代码:

$VDRR~VKNL28MDU8Z7LNSID

数据来源为**showList**.

index.js文件中也声明了showList列表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rCX8MUVh-1680523025666)(D:\Pictures\blog\ant踩坑\js.png)]

但是在页面中显示的是空列表:

(https://img-blog.csdnimg.cn/5fa9f078c7da49c2bb04f58645697d12.png)

console.log出来也是正常的:

但还是空白,就很奇怪,dom树中也没有渲染出来:

1

令笔者百思不得其解。

3.所做出的尝试

考虑到可能是赋值的时间问题,可能是渲染的时候还未赋值。

因此在onMounted函数里再次对showList列表进行赋值:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M0Zkh4WG-1680523025668)(D:\Pictures\blog\ant踩坑\init.png)]

仍未解决…

又怀疑是版本问题,使用了其它版本的ant组件库中a-list组件的模板代码。

仍未解决……

这个问题总共困扰了3天……

4.解决方案

换了个其它组件table,也可以满足我进行字符串数组数据展示的需求。

table组件链接

展示图:

在这里插入图片描述

代码:

 <!--        高亮的数据表列表-->
        <div class="show-list">
            <a-table :data-source="showList" :columns="columns" :scroll="{ y: 240 }" :pagination="false"/>
        </div>
      <div class="graphInfos-container">
        Nodes:{{ curNodesNum }}, Edges:{{ curEdgesNum }}
        <p v-show="filterMethod==='delete'">
          过滤点边规模 Nodes:{{originalGraph.nodeNum-curNodesNum}},
          Edges:{{originalGraph.edgeNum-curEdgesNum}}
        </p>
      </div>
// 初始化showlist和columns
const initShowlist = () => {

                reactiveData.showList = [{
                    key: '1',
                    num: '1',
                    table_id: 'd57100c7-e4bd-4a2b-8a73-e7696c256639',
                },
                    {
                        key: '2',
                        num: '2',
                        table_id: '17a7c56d-0709-440c-a1d7-7688b5370ce2',
                    },
                    {
                        key: '2',
                        num: '2',
                        table_id: '17a7c56d-0709-440c-a1d7-7688b5370ce2',
                    },
                    {
                        key: '2',
                        num: '2',
                        table_id: '17a7c56d-0709-440c-a1d7-7688b5370ce2',
                    },
                    {
                        key: '2',
                        num: '2',
                        table_id: '17a7c56d-0709-440c-a1d7-7688b5370ce2',
                    },
                    {
                        key: '2',
                        num: '2',
                        table_id: '17a7c56d-0709-440c-a1d7-7688b5370ce2',
                    },
                    {
                        key: '2',
                        num: '2',
                        table_id: '17a7c56d-0709-440c-a1d7-7688b5370ce2',
                    },
                    {
                        key: '2',
                        num: '2',
                        table_id: '17a7c56d-0709-440c-a1d7-7688b5370ce2',
                    },
                    {
                        key: '2',
                        num: '2',
                        table_id: '17a7c56d-0709-440c-a1d7-7688b5370ce2',
                    },
                    {
                        key: '2',
                        num: '2',
                        table_id: '17a7c56d-0709-440c-a1d7-7688b5370ce2',
                    },
                ],

                reactiveData.columns= [
                    {
                        title: '序号',
                        dataIndex: 'num',
                        key: 'num',
                        width: 50,
                    },
                    {
                        title: '数据表id',
                        dataIndex: 'table_id',
                        key: 'table_id',
                    }
                   ]
            }

5.总结

1.进行vue开发时尽量使用SFC开发模式,使用vite这类的打包工具进行工程化开发。容易差错,代码耦合性不强,易于维护。

2.在维护一些老项目时,在一些组件不能生效时,可以多换几个版本的写法

table组件在v3中数据来源的写法是dataSource,在V1中的是data-source。我自己的项目中标的是antV3但是使用dataSource是不能生效的,还是空白,当改为data-source时终于恢复正常。

3.当一个组件用不了时,可以更换为其他组件试试,既能帮助排错,也可能直接解决问题。

哈哈遇到困难应该绕着走而不是迎难而上。


最后附上我请教的一个学长的回答:

根据我的经验,要么就是vue哪里没写好,要么就是a-list没用对.

最后排查的原因也可能是漏了什么步骤或者哪里没写对.

这种情况得自己查.

要么再仔细看看文档,要么再仔细看看代码.


好像说了,但又好像没说,但是很有道理,问题只能出在这里。前端的排错就是这么折磨人…

<think>嗯,用户在使用Vue3、TypeScript和Ant-Design-Vue时遇到了组件缺少类型定义的报错问题。我需要根据提供的引用内容来找出解决方案。首先,引用[1]中提到,问题可能出在tsconfig.json的exclude配置排除了ant-design-vue的lib目录,导致无法找到类型定义文件。正确的做法应该是排除整个node_modules下的ant-design-vue目录,而不是只排除lib部分。这可能是因为原来的配置过于具体,导致TypeScript编译器跳过了必要的类型声明。 然后,用户需要检查他们的tsconfig.json文件,看看exclude数组里是否有类似"node_modules/ant-design-vue/lib/**"这样的条目。如果有的话,应该改成"node_modules/ant-design-vue/**",这样就不会排除整个ant-design-vue库的类型文件了。修改后需要重新编译,看看是否解决了问题。 另外,引用[3]提到TypeScript在编译时会去掉类型,生成纯JavaScript,所以确保TypeScript配置正确非常重要。可能还需要确认是否正确安装了ant-design-vue的类型包,虽然官方库可能已经自带了类型定义,但有时候可能需要额外的@types包。不过根据引用[1]的情况,可能不需要额外安装,只需要调整exclude配置。 还有,引用[4]中的例子显示在组件中使用TypeScript时,如何正确绑定类型,比如getContainer函数返回HTMLElement。这可能提示用户需要检查组件中使用Ant-Design-Vue组件时的类型注解是否正确,避免因为类型不匹配导致的错误。不过用户当前的问题主要是类型定义缺失,所以重点还是在tsconfig的配置上。 总结下来,解决方案应该是修改tsconfig.json中的exclude数组,确保不排除ant-design-vue的类型文件,并检查安装和导入是否正确。如果用户已经按照引用[1]的方法修改了配置,但问题依旧,可能需要进一步检查其他配置,比如include或files的设定,或者重新安装依赖确保ant-design-vue的版本兼容。</think>### Vue3+TypeScript+Ant-Design-Vue 组件类型定义报错解决方案 #### 1. 检查 TypeScript 配置 **核心问题**:`tsconfig.json` 中 `exclude` 配置排除了 Ant-Design-Vue 的类型定义文件[^1]。 **修复步骤**: ```json // 修改前(错误示例): "exclude": ["node_modules/ant-design-vue/lib/**"] // 修改后(正确示例): "exclude": ["node_modules/ant-design-vue/**"] ``` 此修改确保 TypeScript 编译器能正确读取 Ant-Design-Vue 的 `lib/index.d.ts` 类型声明文件。 #### 2. 验证组件引入方式 **典型错误**:未通过 Vue3 的按需加载插件(如 `unplugin-vue-components`)自动注册组件类型。 **解决方案**: ```typescript // 手动引入带类型声明的组件(示例) import { Button } from 'ant-design-vue'; app.use(Button); ``` #### 3. 检查依赖版本兼容性 确保以下依赖版本匹配: ```json "ant-design-vue": "^3.2.15", "typescript": "^4.5.5", "vue": "^3.2.36" ``` 版本冲突可能导致类型系统失效[^3]。 #### 4. 补充类型声明(可选) 若仍存在特定组件类型缺失,可手动声明: ```typescript // global.d.ts declare module 'ant-design-vue' { export const YourComponent: DefineComponent<...>; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值