如何在vue项目中使用AntDesign

2,282 阅读3分钟

前言

Ant Design是目前比较流行的一个UI框架,也有vue版本,今天就来看看如何在vue项目中使用它。

依赖

通过下面命令来安装依赖

pnpm install ant-design-vue

如果要使用其中的图标功能,还需要额外安装一个依赖,如下:

pnpm install @ant-design/icons-vue

按需加载

我们可以在App.vue中完整引入,但是更好的方式是按需加载,要想实现按需加载可以使用vite-plugin-components,通过下面命令安装依赖:

pnpm install unplugin-vue-components -D

然后需要在vite.config.js中配置,如下:

...
import Components from "unplugin-vue-components/vite";
import { AntDesignVueResolver } from "unplugin-vue-components/resolvers";

export default defineConfig({
  resolve: {
    ...
  },
  plugins: [
    Components({
      resolvers: [
        AntDesignVueResolver({
          importStyle: "less"
        })
      ],
      // 解决组件命名冲突问题
      directoryAsNamespace: true
    }),
    vue(),
    ...
  ],
  ...
});

这样就可以在vue文件中直接通过import { XXX } from 'ant-design-vue';来使用组件了。

如果没有配置Components,直接使用组件就会发现没有任何样式。

启动javascript

完成上面步骤启动服务后发现报错

[plugin:vite:css] [less] Inline JavaScript is not enabled. Is it set in your options?

还需要在vite.config.js中配置一下,如下:

...
import Components from "unplugin-vue-components/vite";
import { AntDesignVueResolver } from "unplugin-vue-components/resolvers";

export default defineConfig({
  resolve: {
    ...
  },
  plugins: [
    Components({
      resolvers: [
        AntDesignVueResolver({
          importStyle: "less"
        })
      ],
      // 解决组件命名冲突问题
      directoryAsNamespace: true
    }),
    vue(),
    ...
  ],
  ...
  css: {
    preprocessorOptions: {
      less: {
        javascriptEnabled: true,
        modifyVars: {
          "@primary-color": "#0083FF"
        }
      }
    }
  }
});

这样就为less开启了javascript,就可以正常显示了。

样式失效

使用时会发现部分样式失效,比如message,无法悬浮导致显示不正常,这是因为按需加载组件的bug导致的,解决方法就是在一开始手动引入一下,在main.js中如下:

import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";

//自动按需加载组件BUG,需单独引用下
import "ant-design-vue/lib/message/style/index.less";
import "ant-design-vue/lib/modal/style/index.less";
import "ant-design-vue/lib/notification/style/index.less";

import "./style.css";

createApp(App).use(store).use(router).mount("#app");

这里将我们常用的message、modal和notification的样式手动引入进来,如果需要其他的也需要手动引入一下才行。

问题总结

在使用过程中或多或少会遇到各种各样的问题,这里总结一些我遇到的问题和走过的坑,看看能不能帮助大家。

树形table展开一行所有行都展开了

AntDesign的表格—————table是支持树结构的,如果某一条数据中含有children字段,就会自动将其当成子条目集合,当然也支持我们自定义处理子条目。

当一条数据有子数据的时候,会在前面显示一个“+”号,点击"+"号就自动展开。但是使用时你可能发现当多行都有子结构的时候,点击展开其中一行发现所有带字结构的行都展开了。

这是因为缺少key,仔细观察官方案例可以发现在表格的数据中每一条都有一个"key"字段,这就是用来做区分的,但是官方并没有强调这一点,而且我们的数据如果是服务端返回不做处理的话很难有这个字段。

这时候可以通过table的rowKey来处理,如下:

<a-table
  class="table"
  :dataSource="curList"
  :columns="columns"
  @change="pageChange"
  :rowKey="record => record.goodsId"
>
  ...
</a-table>  

rowkey可以是字符串,也可以是一个函数,这里我们使用函数。record就是一条数据对象,这样我们就可以在现有数据中选一个字段来作为行的唯一key。

再展开行的时候就可以看到只有当前行展开了。