【山竹记账前端-vue】14.制作 ItemList 页面
大纲链接 §
[toc]
1. 重构 time ⇧
改用 Class Time ⇧
期望实现更多其他api:
firstDayOfMonth、firstDayOfYear、lastDayOfMonth、lastDayOfYear、add、subtract
- 需要改用原型链,节省内存
@/shared/time.ts
|
|
- 使用
new Time(new Date('2027-01-31')).format('YYYY-MM-DD HH:mm:ss.sss')
实现 add(1, 'month') ⇧
|
|
- 当前月份第一天的日期
- 使用
this.date.setDate(1)会改当前调用的日期,不符合预期,并不想修改日期,而是创建一个新的 - 改用
new Time(new Date())来构造:new Time(new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0,0,0)) - 当前月的最后一天就是下月的0号
- 使用
- 暂不考虑闰秒的情况
add需要考虑月份的特殊情况date.setMonth(date.getMonth() + amount)const d1 = new Date(2000, 0, 31)闰年1月份加上一个月的日期d1为Mon Jan 31 2000 00:00:00 GMT+0800 (中国标准时间)符合预期d1.setMonth(d1.getMonth() + 1),再查看d1变为Thu Mar 02 2000 00:00:00 GMT+0800 (中国标准时间)不符合预期- 加上的是当前月份的天数:一月加一个月就是加上31天,二月加一个月就是加上28或者29天
- 1月31号加29天应该是29号,因为2000年是闰年
- 需要改为人类容易理解的判断方式
@/shared/dateTime.ts
|
|
- 测试使用
const t = new DateTime(new Date(2000, 0, 31, 0, 0, 0,))console.log( t.add(1, 'month').getRawDate() )
@/modules/items/DateInput.tsx
|
|
2. 打算实现 ItemSummary,完成 ItemList 页面基本结构样式 ⇧
<ItemSummary startDate="2026-11-01" endDate="2026-12-31" />- 日期区间为左开右闭,因为包含时间
2026-11-01 00:00:00开始,不包含2027-01-01 00:00:00,表示2026-12-31 12:59:59
- 日期区间为左开右闭,因为包含时间
@/views/ItemList.tsx
|
|
@/modules/items/ItemSummary.tsx基本结构样式
|
|
[&>li]:[--sibling-idx:calc(1*sibling-index())] [&>li>div.sign]:bg-[oklch(70%_0.15_calc(var(--sibling-idx)*70))]- 使用
sibling-index()计算相邻元素下标;再使用oklch(70%_0.15_calc(var(--sibling-idx)*70))动态计算颜色 - 需要让父元素强制锁死
sibling-index()这个值,而不是默认会原封不动地拿到当前的子元素节点上再进行计算,都算成 1 - 必须借助
@property(显式注册整型变量)或@container style()(容器样式查询) - 需要在
unocss.config.ts中配置preflight
- 使用
uno.config.ts
|
|
之后可以改为使用
v-for或.map()循环遍历下标index来计算
3. 给 ItemList 页面添加对话框,使用 Vant 的 Overlay 组件实现 ⇧
@/views/ItemList.tsx
|
|
- 在嵌套内容添加阻止事件传播
onClick={(e: MouseEvent) => e.stopPropagation()}
4. 封装 From 和 FormItem 组件 ⇧
可以统一封装
Form结构:标题、内容/穿餐,伪代码:
|
|
- 业务轮子只需考虑满足所有业务需求即可
- 支持 text、emojiSelector、date 等类型
- 实现 FormItem 的 v-model 双向绑定与错误提示显示
- 添加表单标签、冒号后缀及额外提示信息渲染
- 支持通过插槽自定义表单项内容,例如 文本、按钮等
@/components/form/FormItem.tsx
|
|
- 父组件可使用
useId生成唯一 id,传参uniqId,可以区分类型相同的表单项,并且在 label 标签上的 for 属性上- 但不可放在
key属性上,否则每次输入时都会重新渲染组件
- 但不可放在
- 使用计算属性作为
v-model的双向绑定值const getModelValue = computed({ get() {...}, set(value) {...}, }) - 在
itemContent后续可继续扩展其他类型的表单项,例如date hasErrorPlaceholder用来给存在错误提示的表单项作为占位,防止高度抖动
@/components/form/FormContainer.tsx
|
|
@src/modules/tags/TagForm.tsx
|
|
对比之前的
@src/modules/tags/TagForm.tsx
|
|
5. 完成自定义时间弹出框 ⇧
封装 DatePickerPopup.tsx 组件,改造 DateInput.tsx ⇧
封装 今日日期数组 工具函数
@/const/genDateArrayOfToday.ts
|
|
@/modules/items/DatePickerPopup.tsx
|
|
@/modules/items/DateInput.tsx
|
|
对比原来
DateInput.tsx
|
|
处理日期格式字符串 Vant 的 DatePicker 绑定值互相转换的问题 ⇧
重构
@/const/genDateArrayOfToday.ts为@/const/genDateStr.ts生成通用日期数组
|
|
@/components/form/DatePickerPopup.tsx
|
|
- 外部传参改为
dateStr - 发布事件名称改为
'update:dateStr' - 引用该组件的双向绑定需要改为
v-model:dateStr={} - 可写的计算属性
getDateStrArrayTransfer需要在'2026-10-22' <-> [2026, 10, 22]格式之间转换- 返回值使用
dateStr.split('-')转换'2026-10-22' -> [2026, 10, 22] - 设置值使用
value.join('-')转换[2026, 10, 22] -> '2026-10-22'
- 返回值使用
- 其他相关数据涉及同样修改
lastDateStrRefconfirmDatecancelDate
@/modules/items/DateInput.tsx
|
|
为 FormItem.tsx 添加 弹出日期选择器组件 的类型选项 ⇧
@/components/form/FormItem.tsx
|
|
- 添加
type类型的FormItem- 只读属性
readonly={true} - 数据为日期字符串
value={getModelValue.value} - 点击打开日期选择弹出框
onClick={() => {dateVisibleRef.value = true}}
- 只读属性
完成 ItemList.tsx 自定义日期范围 ⇧
@/components/form/FormItem.tsx
|
|
后续自定义时间限制;最早时间,日期跨度最大前后3年
参考文章
- ItemList 最终代码为:https://github.com/FrankFang/UU85n20nnISV/commits/master
相关文章
- 无
- 作者: Joel
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名