【无标题】一个可以使用v-model和allow-clear的ant design vue 1.x 的年picker

动手封装一个antdv的年picker

业务中使用antdv 1.x版本,想使用年份选择器,但是只有样式,没有逻辑。那就自己写一个吧。

pane的打开与关闭

首先可以封装一个在组件中嵌套用的picker,只需要仿照着官方提供的思路,补充几个方法,就可以使用了。

allow-clear的设置

像官方这么设置,可以是可以,但是如果需要allow-clear的属性,清空year-picker的内容,好像有点行不通,所以还需要继续搞。

根据这篇文章,参考着select组件可以找到allow-clear的icon在哪里,给他绑定上相关的点击事件就Ok。

之后发现,点击allow-clear的icon之后,会接着触发date-picker的面板打开,推测是父组件捕获了子组件冒泡的方法。所以尝试加一个阻止冒泡也就解决了。

之后,封装组件的时候一直告诉我修改了父组件内容,是个warning,怎么说 0 error(s), 0 warning(s)是个梦想,但是能用就行。

还有点bug,就是如果为空的时候,选择日期之后,红色框框中的内容总是是本年年份(比如今年是2022年,我选择了2020年,但是会先出现下2022之后再变到2020),不怎么影响使用,但是体验稍微有点点不好。
在这里插入图片描述

好像可以把上面的输入框给干掉,但是又找不到如何干掉,所以就先这个样子吧。

关于赋值,参考着vue中的关于组件自定义model的方法,可以直接使用v-model获取其中的值,但是没有测试能否在a-form或者a-form-model中的使用。

代码如下。

<template>
  <a-date-picker
    placeholder="年维度统计"
    mode="year"
    format="YYYY"
    valueFormat="YYYY"
    :style="{ width: '128px' }"
    :open="yearSelectorPanelOpenStatus"
    @openChange="changeYearSelectPanelOpenStatus"
    @panelChange="yearSelectPanelChange"
    v-model="date"
    allow-clear
    @mouseenter="mouseenter"
  />
</template>

<script>
import moment from 'moment'

export default {
  name: 'YearPicker',
  // 设置父组件中传入的值
  props: {
    date: {
      type: moment,
      default: () => moment(),
      require: true
    }
  },
  // 设置自定义model, 和触发父组件值改变的方法.
  model: {
    prop: 'date',
    event: 'dateChange'
  },
  data () {
    return {
      // 年选择器日期面板打开状态
      yearSelectorPanelOpenStatus: false,
      // 被选择的年份,避免直接修改父组件传的值
      selectedYear: this.date
    }
  },
  methods: {
    /**
     * 当日期面板关闭时的方法
     * 将改变过的年份赋值, 并触发改变的方法
     * @callback
     * @param value {String} 选择的年份
     */
    yearSelectPanelChange (value) {
      this.selectedYear = moment(value)
      this.$emit('dateChange', value)
      this.yearSelectorPanelOpenStatus = false
    },
    /**
     * @description 修改年选择器开启关闭的状态
     * @callback
     */
    changeYearSelectPanelOpenStatus () {
      this.yearSelectorPanelOpenStatus = !this.yearSelectorPanelOpenStatus
    },
    /**
     * 设置绑定的事件监听器, 点击 allow-clear icon 的时候清空父组件绑定的值
     * @param event
     */
    mouseenter (event) {
      const clearDom = event.path[0].children[0].children[1]
      clearDom.addEventListener('click', (e) => {
        e.stopPropagation()
        this.$emit('dateChange', null)
      })
    }
  }
}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值