ant design学习第一天

umi的始终控制不好,老实用antdesign吧

1、创建antdesign样例程序

npm i @ant-design/pro-cli -g 创建一个ant design pro的程序

pro create fapi-frontend 开始一个程序,提供一个脚手架

2、运行yarn,安装依赖

3、npm install react-icons增加运行库

React icons preview for gr

4、新增加布局

新增布局
在脚手架中我们通过嵌套路由来实现布局模板。routes.ts 是一个数组,其中第一级数据就是我们的布局,如果你需要新增布局可以再直接增加一个新的一级数据。

layouts 文件时一个约定,layout 都应该放入其中。v5 没有了内置的布局,所以没有这个文件夹,如果你的项目中没有手动创建即可。


export default [
 // user
 {
  path: '/user',
  component: '../layouts/UserLayout',
  routes:[...]
 },
 // app
 {
  path: '/',
  component: '../layouts/BasicLayout',
  routes:[...]
 },
 // new
 {
  path: '/new',
  component: '../layouts/new_page',
  routes:[...]
 },
]

5、组件 ant design的Card和PageContainer

<think>我们使用Ant Design Vue (for Vue 3)来实现需求。根据用户要求,需要两个日期选择器(开始日期和结束日期),并实现以下功能: 1. 结束日期不能大于开始日期(即结束日期必须大于等于开始日期,且不超过开始日期所在年份的最后一天)。 2. 选择开始日期后,结束日期的最晚可选日期为开始日期所在年份的最后一天。 3. 结束日期选择器中,超过当年最后一天的日期需要被禁选。 我们将使用`<a-date-picker>`组件,并利用`disabledDate`属性来实现日期的禁选逻辑。 步骤: 1. 定义两个状态:`startDate`和`endDate`,用于绑定开始日期和结束日期。 2. 为开始日期选择器设置`change`事件,当开始日期改变时,更新`startDate`并重置`endDate`(如果结束日期小于新的开始日期或超过新的年份最后一天)。 3. 为结束日期选择器设置`disabledDate`属性,该属性是一个函数,用于判断哪些日期需要被禁用。在函数中,我们需要: - 如果开始日期未选择,则禁用所有日期(或者也可以不禁用,但要求先选开始日期,所以我们选择禁用所有日期)。 - 如果开始日期已选择,则禁用以下日期: a. 小于开始日期的日期(即今天之前的日期不需要禁用,因为我们要求结束日期可以等于开始日期,所以禁用小于开始日期的日期) b. 大于开始日期所在年份的最后一天的日期。 4. 同时,我们也可以为结束日期选择器设置`disabled`属性,当开始日期未选择时,整个结束日期选择器禁用(可选,提升用户体验)。 注意:我们使用`dayjs`来处理日期(Ant Design Vue 3.x默认使用dayjs,如果使用moment需要配置,但推荐dayjs)。 具体代码实现: ```vue <template> <div> <a-date-picker v-model:value="startDate" placeholder="请选择开始日期" :disabledDate="disabledStartDate" @change="handleStartChange" /> <a-date-picker v-model:value="endDate" placeholder="请选择结束日期" :disabled="!startDate" :disabledDate="disabledEndDate" /> </div> </template> <script setup> import { ref } from 'vue'; import dayjs from 'dayjs'; const startDate = ref(null); const endDate = ref(null); // 开始日期的禁选逻辑(如果需要的话,这里根据需求可以设置开始日期不能选择今天之后的日期?但用户需求没有明确,所以先不做) // 如果不需要限制开始日期,可以去掉disabledDate const disabledStartDate = (current) => { // 例如,开始日期只能选择今天及之前?这里根据实际情况调整,用户需求没有明确,所以先不禁用任何开始日期 return false; }; // 处理开始日期变化 const handleStartChange = () => { // 当开始日期改变后,检查结束日期是否还合法(即结束日期是否在开始日期之后且不超过开始日期的年份最后一天) // 如果不合法,则重置结束日期 if (startDate.value && endDate.value) { const yearEnd = dayjs(startDate.value).endOf('year'); if (endDate.value < startDate.value || endDate.value > yearEnd) { endDate.value = null; } } else { endDate.value = null; } }; // 结束日期的禁选逻辑 const disabledEndDate = (current) => { // 如果没有选择开始日期,则结束日期所有都禁用(或者不禁用,但这里我们要求先选开始日期,所以禁用) if (!startDate.value) { return true; } // 注意:current 是dayjs对象,startDate.value是dayjs对象(因为v-model绑定的是dayjs对象) // 1. 禁用小于开始日期的日期(注意:开始日期当天是可选的,所以是current < startDate.value) // 2. 禁用大于开始日期所在年份最后一天的日期 const start = dayjs(startDate.value); const yearEnd = start.endOf('year'); // 当年最后一天 // 注意:current是当天0点,而startDate.value也是当天的0点,所以比较时使用dayjs的isBefore和isAfter return current && (current < start || current > yearEnd); }; </script> ``` 注意:上面的代码中,我们使用了`disabledEndDate`函数来动态计算结束日期的禁用状态。我们同时处理了两种情况:日期小于开始日期,或者日期大于开始日期所在年份的最后一天。 另外,我们为结束日期选择器设置了`disabled`属性,当开始日期未选择时,整个结束日期选择器不可用,这样用户就不会误操作。 关于表单验证:如果是在表单中,我们可能还需要在提交时进行验证。这里我们只关注了界面交互的禁用。 如果需要表单验证,可以在提交时检查: ```js if (!endDate.value || endDate.value < startDate.value || endDate.value > dayjs(startDate.value).endOf('year')) { // 提示错误 } ``` 或者使用Ant Design Vue的表单验证规则,这里不展开。 ### 相关问题 §§相关问题§§ 1. 在Ant Design Vue中如何实现日期范围选择组件(RangePicker)的类似校验? 2. 如何在Ant Design Vue中设置日期组件的动态默认值(例如默认选择当月第一天和最后一天)? 3. Ant Design Vue日期组件如何配合表单验证规则进行字段联动验证? 4. 在Vue 3中,如何处理Ant Design日期组件的时区问题? </think>### Ant Design Vue 3 日期组件校验实现 以下是在 Vue 3 中使用 Ant Design Vue 实现日期组件校验的完整方案,满足您的需求:结束日期不能大于开始日期,且结束日期最晚只能选择开始日期所在年份的最后一天。 #### 组件实现代码 ```vue <template> <a-form :model="formState" layout="vertical"> <a-form-item label="开始日期" name="startDate"> <a-date-picker v-model:value="formState.startDate" format="YYYY-MM-DD" placeholder="请选择开始日期" @change="handleStartDateChange" /> </a-form-item> <a-form-item label="结束日期" name="endDate"> <a-date-picker v-model:value="formState.endDate" format="YYYY-MM-DD" placeholder="请选择结束日期" :disabled="!formState.startDate" :disabled-date="disabledEndDate" /> </a-form-item> </a-form> </template> <script setup> import { reactive } from 'vue'; import dayjs from 'dayjs'; const formState = reactive({ startDate: null, endDate: null }); // 处理开始日期变化 const handleStartDateChange = (date) => { formState.startDate = date; // 如果结束日期已存在但超出新范围,则重置 if (formState.endDate) { const yearEnd = dayjs(date).endOf('year'); if (formState.endDate < date || formState.endDate > yearEnd) { formState.endDate = null; } } }; // 结束日期禁用规则 const disabledEndDate = (current) => { if (!formState.startDate) return true; const startDate = dayjs(formState.startDate); const yearEnd = startDate.endOf('year'); // 禁用早于开始日期或晚于当年最后一天的日期 return ( current < startDate.startOf('day') || current > yearEnd ); }; </script> ``` #### 表单验证规则 ```vue <template> <a-form :model="formState" :rules="rules" ref="formRef"> <!-- 日期选择器同上 --> </a-form> </template> <script setup> // ...其他代码同上 const rules = reactive({ endDate: [ { validator: validateEndDate, trigger: 'change' } ] }); // 自定义验证规则 const validateEndDate = (rule, value) => { if (!formState.startDate) { return Promise.reject('请先选择开始日期'); } const start = dayjs(formState.startDate); const end = dayjs(value); const yearEnd = start.endOf('year'); if (end < start) { return Promise.reject('结束日期不能早于开始日期'); } if (end > yearEnd) { return Promise.reject('结束日期不能超过当年最后一天'); } return Promise.resolve(); }; </script> ``` #### 关键实现说明 1. **动态日期禁用** - 使用 `disabled-date` 属性实现日期禁用逻辑 - 结束日期不能早于开始日期:`current < startDate.startOf('day')` - 结束日期不能超过当年最后一天:`current > startDate.endOf('year')` - 未选择开始日期时禁用整个结束日期选择器 2. **日期联动逻辑** ```js const handleStartDateChange = (date) => { // 当开始日期变化时重置不合法的结束日期 if (formState.endDate && (formState.endDate < date || formState.endDate > yearEnd)) { formState.endDate = null; } } ``` 3. **表单验证** - 使用 Ant Design Vue 的自定义验证规则 - 验证结束日期是否在有效范围内 - 实时反馈错误信息给用户 4. **日期处理** - 使用 `dayjs` 库进行日期计算 - `startDate.endOf('year')` 获取当年最后一天 - `startDate.startOf('day')` 确保日期比较精度 #### 实现效果 1. 选择开始日期前,结束日期选择器被禁用 2. 选择开始日期后,结束日期只能选择: - 开始日期当天及之后 - 开始日期所在年份的最后一天之前 3. 超出范围的日期在日历中被禁用(灰色显示) 4. 表单提交时验证日期范围有效性 ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值