前言
https://www.antdv.com/components/overview-cn/
主题配置
1 | <template> |
中文
1 | <script setup lang="ts"> |
其中下面的部分是设置日期选择为中文
否则日期选择弹出框还是英文,设置一次就行。
1 | import dayjs from 'dayjs' |
布局类
栅格化
https://www.antdv.com/components/grid-cn
份数
1 | <a-row> |
填充
1 | <a-row> |
填充2
1 | <a-row :wrap="false"> |
间距
水平
1 | <a-space size="middle"> |
垂直
1 | <a-space direction="vertical"></a-space> |
水平换行
水平的时候如果想换行的时候不要用a-space
,这个有BUG,如果有多行的时候底部会生成一个margin-bottom: -16px;
的样式导致样式不对。
1 | <a-space size="middle" :wrap="true" style="width: 100%"> |
可以用a-flex
替代:
1 | <a-flex gap="middle" wrap="wrap" style="width: 100%"></a-flex> |
Flex
水平
1 | <a-flex gap="middle"></a-flex> |
水平自动换行
1 | <a-flex gap="middle" wrap="wrap"></a-flex> |
垂直
1 | <a-flex gap="middle" vertical></a-flex> |
消息提示
1 | import { message } from 'ant-design-vue'; |
加载中
1 | <a-spin tip="加载中..." :spinning="loading"> |
TS
1 | const loading = ref<boolean>(false); |
注意
这个加载中会在抽屉下面
抽屉中建议加载按钮上
1 | <a-button type="primary" :loading="loading">保存</a-button> |
展示类
文字提示
1 | <a-tooltip> |
让div中的文字超出的显示省略号
1 | .z_ellipsis_item { |
图片
https://www.antdv.com/components/image-cn
相比于HTML的img,能够预览图片
1 | <a-image |
走马灯
1 | <a-carousel :autoplay="true"> |
二维码
https://www.antdv.com/components/qrcode-cn
基本示例
1 | <a-qrcode :value="qrCodeUrl" /> |
默认渲染方式是canvas
,会有点糊,可以改为svg
,就会很清晰
1 | <a-qrcode :value="qrCodeUrl" type="svg" /> |
调整大小
1 | <a-qrcode :value="qrCodeUrl" type="svg" size="180" /> |
无边框
1 | <a-qrcode :value="qrCodeUrl" type="svg" size="180" :bordered="false" /> |
TS
1 | const qrCodeUrl = ref('https://www.psvmc.cn') |
拼接URL
1 | const { protocol, host } = window.location |
标签
基本
1 | <template> |
无边框Tag
1 | <template> |
标签删除
1 | <a-tag |
进度条
圆形进度条
1 | <a-progress |
步骤条
1 | <a-steps :current="currStepIndex" :items="stepItems"></a-steps> |
TS
1 | const currStepIndex = ref(0) |
Card
1 | <a-card style="margin: 0.8rem"> |
按钮类
Button
1 | <a-space> |
确认
1 | <a-popconfirm |
气泡卡片
1 | <a-popover placement="bottomRight"> |
也可以使用
1 | <a-dropdown> |
注意
在
a-popover
中使用a-menu
,右侧会多一个竖线。但是在
a-dropdown
中使用a-menu
就没有。
Tab
1 | <a-tabs v-model:activeKey="activeKey"> |
TS
1 | const activeKey = ref('1'); |
弹窗类
抽屉
基本
1 | <a-drawer |
TS
1 | const showAddDrawer = ref(false) |
顶部按钮
1 | <a-drawer |
TS
1 | const showAddDrawer = ref(false) |
项目示例
1 | <a-drawer |
TS
1 | //订单分配 |
组件内
1 | const props = defineProps({ |
弹窗/对话框
https://www.antdv.com/components/modal-cn
弹窗和抽屉后出现的在上层
1 | <a-modal |
TS
1 | const showConfirmModal = ref(false) |
注意,最新Vue版本4.2.5依旧会出现下面的报错,这个在React的版本已经解决了,但是Vue版本依旧有这个问题
Blocked aria-hidden on an element because its descendant retained focus.
解决方法
在a-modal
打开后调用resetModalAttr
。
1 | async function resetModalAttr(){ |
树组件
1 | <template> |
下拉树菜单
https://www.antdv.com/components/tree-select-cn
基本
1 | <a-tree-select |
TS
1 | import type { TreeSelectProps } from 'ant-design-vue' |
自定义属性
1 | <a-tree-select |
TS
1 | import type { TreeSelectProps } from 'ant-design-vue' |
禁止节点选择
对应的节点添加disabled: true
即可。
1 | const treeData = ref<TreeSelectProps['treeData']>([ |
下拉菜单
基本
1 | <a-select v-model:value="formState.couponType" style="width: 120px"> |
多选
1 | <a-select |
TS
1 | const tagValues = ref<string[]>([]) |
或者
1 | <a-select v-model:value="formState.couponType" mode="multiple" style="width: 120px"> |
表单 Form
https://www.antdv.com/components/form-cn
基本示例
1 | <a-form |
TS
1 | interface FormState { |
JS提交
1 | <a-form ref="formRef" |
TS
1 | import type { FormInstance } from 'ant-design-vue' |
如果校验通过会进入then
回调,返回的数据是表单中所有属性的对象,不是表单绑定的对象,只有内部有的属性才会返回。
1 | {"bannerImg":"https://www.psvmc.cn/head.jpg","sortType":1} |
校验失败则会进入catch
。
1 | { |
标题和输入上下分布
1 | <a-form |
就是设置label-col
占一行即可。
单行输入
1 | <a-form-item label="优惠券名称" name="hotWord" :rules="[{ required: true, message: '不能为空!' }]"> |
数字输入
1 | <a-form-item label="热度" name="hotNum" :rules="[{ required: true, message: '不能为空!' }]"> |
设置最大最小
1 | <a-input-number |
多行输入
1 | <a-form-item label="规则说明" name="couponType" :rules="[{ required: true, message: '不能为空!' }]"> |
设置行数
1 | <a-textarea |
下拉菜单
1 | <a-form-item label="优惠券类型" name="couponType" :rules="[{ required: true, message: '不能为空!' }]"> |
开关
1 | <a-switch v-model:checked="checked" /> |
设置选中时的值
1 | <a-switch |
单选按钮
1 | <a-form-item label="优惠券类型" name="couponType" :rules="[{ required: true, message: '不能为空!' }]"> |
样式2
1 | <a-radio-group v-model:value="dateType" button-style="solid"> |
TS
1 | let dateType = ref(1) |
多选
基本
1 | <a-checkbox v-model:checked="checked">Checkbox</a-checkbox> |
多选按钮组
1 | <a-checkbox-group v-model:value="cbValue" name="checkboxgroup" :options="cbItemList" /> |
TS
1 | const cbValue = reactive([1]) |
一行多个
1 | <a-form-item label="使用条件" name="couponType" :rules="[{ required: true, message: '不能为空!' }]"> |
可输入可选择
和下拉菜单的区别是它可以输入也可以单选
1 | <a-auto-complete |
报错
You can set not need to be collected fields into
a-form-item-rest
原因是一个表单项下出现了多个输入项
第一种,使用多个 a-form-item
:
1 | <a-form-item> |
第二种,使用 a-form-item-rest
组件:
它会阻止数据的收集,你可以将不需要收集校验的表单项放到这个组件中即可,它和第一种方式很类似,但它不会产生额外的 dom 节点。
1 | <a-form-item> |
日期选择
https://www.antdv.com/components/date-picker-cn
单个日期
1 | <template> |
注意绑定的日期类型不是字符串
1 | import type { Dayjs } from 'dayjs' |
禁止选择
1 | <a-date-picker |
TS
1 | const endDateObj = ref<Dayjs>() |
这里是时间选择必须在props.realEnd
之后。
日期和时间
示例1
1 | <a-date-picker show-time placeholder="选择日期时间" v-model:value="beginDateObj"/> |
TS
1 | const beginDateObj = ref<Dayjs>() |
示例2
1 | <a-date-picker show-time placeholder="选择日期时间" format="YYYY-MM-DD HH:mm:ss" @change="onChange" @ok="onOk" /> |
日期也可以控制不选秒
1 | <a-date-picker show-time placeholder="选择日期时间" format="YYYY-MM-DD HH:mm" @change="onChange" @ok="onOk" /> |
TS
1 | const onChange = (value: Dayjs, dateString: string) => { |
日期段
单个组件
1 | <a-range-picker v-model:value="dateRange" /> |
TS
1 | import type { Dayjs } from 'dayjs' |
重置的时候
1 | dateRange.value = undefined |
多个组件
1 | <a-space align="center"> |
TS
1 | import type { Dayjs } from 'dayjs' |