封装日历组件
基于封装日历组件,学会封装业务组件到使用的流程
- 新建baseCalendar文件夹(具体步骤👉微信小程序-二次封装组件和自定义组件)
- 在该文件夹下的json文件中添加
1
2
3
4
5
6
7{
"component": true,
"styleIsolation": "shared",
"usingComponents": {
"van-calendar": "@vant/weapp/calendar/index" // 要封装组件的路径
}
} - 从原组件的js文件中将props中需要的内容复制到封装组件的js文件中的properties中
- 在封装组件的wxml文件下使用原组件和添加插槽
- 在app.json中的usingComponents定义的封装组件标签名和路径
- 页面通过使用封装组件的标签来使用原组件加自定义的方法和样式
- 更改组件的样式,通过官方的文档找到对应组件的样式和属性进行更改
组件的传值
页面使用: 页面中的组件要使用这个属性或方法
1
minDate="{{ minTimestamp }}"
页面数据初始化: 在js文件中的data定义变量,并给一个默认值
1
minTimestamp: 0
组件类型初始化: 在js文件中的properties中写上属性名及其类型, 两种写法
1
2
3
4
5方式一:minDate: Number
方式二:minDate:{
type: Number,
value: 0
}组件使用: wxml中使用
1
minDate="{{ minDate }}"
页面更改: js文件的函数去更改minTimestamp的值,以此更新页面数据 — 完成传值(简单类型)
调接口获取数据后 页面向组件传值(以动态显示该日期是否约满为例)
页面请求并获取约满的数据,fullTimes要初始化
1
2
3
4
5
6
7
8
9
10data: {
fullTimes: []
}
async getFullTimes() {
const result = await API.getFullTimes()
this.setData({
fullTimes: result.result.list
})
}页面在onLoad()中调用并初始化请求
1
2
3onLoad() {
this.getFullTimes()
}页面组件使用这个属性或方法
1
fullTimes="{{ fullTimes }}"
自定义组件在js文件中的properties中定义属性名及其类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15properties:{
fullTimes: {
type: Array,
value: [],
// 监听这边是否接收到fullTimes,有数据才初始化,防止二次初始化
observer(newFullTimes) {
if (newFullTimes.length) {
this.initCalendarDateFormat()
}
},
},
},
data: {
formatter: null // 初始化
}自定义组件在wxml文件中使用该变量
1
formatter="{{ formatter }}"
自定义组件中初始化日历的状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23methods:{
initCalendarDateFormat() {
const fullTimes = this.data.fullTimes
const formatter = (day) => {
// 此处使用了封装的函数
const today = isTodday(Date.now(), day.date.valueOf())
// includes() 方法:判断fullTimes是否包含一个day.date.valueOf()值
if (fullTimes.includes(day.date.valueOf())) {
day.type = 'disabled'
day.bottomInfo = '约满'
}
if (today) {
day.type = 'disabled'
day.bottomInfo = '今天'
}
return day
}
this.setData({
formatter
})
}
}自定义组件在lifetimes中的ready再次初始化 — 完成传值(复杂类型)