douzi8 / lechebang

乐车邦h5文档
2 stars 1 forks source link

选店页顶部日期栏组件实现思路 #8

Closed qubitsky closed 4 years ago

qubitsky commented 7 years ago

使用说明

店列表页顶部的日期选择栏是一个block级组件

使用示例:

<UIDatePicker
  :allDate="datesArray"
  :actived="dateString"
  :length="5"
  @datePick="datePickAction"
  @calendar="calendarAction"
/>

具有3个属性:

两个自定义的组件事件:

注意! 当用户点击某个日期后,并不会自动高亮激活相应的日期,需要重设actived属性值,才会激活actived对应的日期

实现思路

交互要求:

假设length属性值为5 为了实现这种交互,先定义了组件内状态

data () {
  return {
    /* 首个日期在allDate数组中的索引,用于计算要展示的5个日期 */
    startIndex: getInitStartIndex(this.allDate, this.actived, this.length),
    /* 用于记住用户点击的日期 */
    pickedDate: null,
    /* 用于记住用户点击日期的相对位置,值为 0 ~ 5 */
    pickedPos: null
  }
}

有一个 computed 数据 list,表示展示的5个日期,由 startIndexlength 计算得到, 这样只要更新 startIndex 就能更新这5个日期

重点

watch: {
  actived (val) {
    if (val === this.pickedDate) {
      if (this.pickedPos === this.length - 1) {
        this.startIndex = Math.min(this.startIndex + 1, this.allDate.length - this.length)
      } else if (this.pickedPos === 0) {
        this.startIndex = Math.max(this.startIndex - 1, 0)
      }
    } else {
      this.startIndex = getInitStartIndex(this.allDate, this.actived, this.length)
    }
  }
}

监听 actived 属性值的变化,当 actived 更新,就根据 pickedDatepickedPosactived 的值去重新计算 startIndex 的值。如果 pickedDateactived 的值一致,就说明是用户点击日期后更新激活项,相应地把 startIndex 加1或减1,如果不一致,就计算 startIndex 使激活的日期放在第二位置。

点击日历图标时,会把 pickedDate 置空