Antd3.0 基于 DatePicker 实现年份选择器 YearPicker

在开发中需要使用到年份的选择器,由于项目使用的是 Antd3.0 版本,在查看文档后发现并没有可以直接使用的组件,并且在项目的多个地方需要使用到,就打算基于 DatePicker 写一个 YearPicker 组件。

首先在 DatePicker 组件中有一个 mode 属性

该属性控制面板的状态,我们选择使用 year 来让面板显示年份。

只有这个属性是远远不够的,如果要实现选择年份的功能,我们还需要手动控制选择器的弹窗显示,选中后的回调等等。

那么就要用到这两个属性

 onOpenChange 的使用就很简单了

  const [isopen, setIsOpen] = useState<boolean>(false);

  const handleOpenChange = (status: boolean) => {
    setIsOpen(status)
  };

定义一个 isopen 来控制年份选择面板显示和隐藏,当触发 handleOpenChange 方法,直接将 status 赋值给 isopen 即可。

而 handlePanelChange 方法就是我们用来拿到选择年份并处理的方法了,

  // 拿到 value 并进行处理,给 YearPicker 组件赋值
  const handlePanelChange = (value: any) => {
    setIsOpen(false);
    // value 可能是父组件传来的值,也可能是操作组件选择的年份值,需要变为 moment 对象再给组件赋值
    const momentYear = moment(value, 'YYYY');
    // 返回给父组件的值为格式化的值
    const yearFormat = moment(momentYear).format('YYYY');
    // 组件只接受 moment 对象的值
    setYear(momentYear);
    handleChange(Number(yearFormat));
  };

首先该方法拿到的参数可能是我们选择年份面板取到的值,也可能是我们在父组件中需要进行初始化而传来的值,由于组件的 value 只接受 moment 对象的值,所以在赋值之前,先用 moment 转换一下。

这里需要注意的是,第二个参数指定转换的格式,我们需要将年份转换成 moment 对象,所以是 'YYYY'

然后我们拿到值后进行两个操作,一个是给组件赋值,一个是将年份传给父组件进行使用,这里的 handleChange 方法是通过父组件传过来的取到值后进行的操作。

到这里一个简单的 YearPicker 组件差不多就写好了,我们还可以在对其进行稍微加工。

首先,该组件如果使用在搜索表单中,那他可能会需要一个清除的功能,这里我们使用 onChange 方法搭配 allowClear 属性。

当点击清除触发 onChange 方法,直接将组件和父组件的值重新设置。

  const handleChanges = (date: any) => {
    setYear(date);
    handleChange(date);
  };

 最后将 handleChanges、handlePanelChange 方法抛出给父组件,这里使用 useImperativeHandle + forwardRef 方法。

  useImperativeHandle(ref, () => ({
    handleChanges,
    handlePanelChange,
  }));

完整代码

function YearPicker({ handleChange, allowClear = true }: IProps, ref: any) {
  const [year, setYear] = useState<Moment>();
  const [isopen, setIsOpen] = useState<boolean>(false);

  const handleOpenChange = (status: boolean) => {
    setIsOpen(status)
  };
  // 拿到 value 并进行处理,给 YearPicker 组件赋值
  const handlePanelChange = (value: any) => {
    setIsOpen(false);
    // value 可能是父组件传来的值,也可能是操作组件选择的年份值,需要变为 moment 对象再给组件赋值
    const momentYear = moment(value, 'YYYY');
    // 返回给父组件的值为格式化的值
    const yearFormat = moment(momentYear).format('YYYY');
    // 组件只接受 moment 对象的值
    setYear(momentYear);
    handleChange(Number(yearFormat));
  };

  const handleChanges = (date: any) => {
    setYear(date);
    handleChange(date);
  };
  // 传递给父组件 change 方法
  useImperativeHandle(ref, () => ({
    handleChanges,
    handlePanelChange,
  }));

  return (
    <DatePicker
      mode="year"
      placeholder="请选择年份"
      open={isopen}
      format="YYYY"
      value={year}
      onOpenChange={handleOpenChange}
      onPanelChange={handlePanelChange}
      onChange={handleChanges}
      style={{ width: '100%' }}
      allowClear={allowClear}
    />
  );
}

export default forwardRef(YearPicker);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
antdDatePicker组件也可以通过类似的方式实现清空功能。antdDatePicker组件提供了一个allowClear属性,设置为true时就可以显示清空按钮。在清空按钮的点击事件中,可以将DatePicker组件的值设置为null或默认值。 示例代码: ``` import React, { useState } from 'react'; import { DatePicker } from 'antd'; function App() { const [date, setDate] = useState(null); const handleClear = () => { setDate(null); }; return ( <> <DatePicker value={date} onChange={value => setDate(value)} allowClear /> <button onClick={handleClear}>清空</button> </> ); } export default App; ``` 在这个示例中,另一个需要注意的点是,antdDatePicker组件的值是一个Moment.js对象,而不是一个Date对象。因此,在onChange事件中获取到的value是一个Moment.js对象。如果需要将其转换为Date对象,可以使用toDate方法,例如:value.toDate()。 另外,antdDatePicker组件还提供了一个ref属性,可以通过获取到这个ref来调用DatePicker组件的方法,包括clear方法。使用方式与React中的示例类似。 示例代码: ``` import React, { useRef } from 'react'; import { DatePicker } from 'antd'; function App() { const datePickerRef = useRef(null); const handleClear = () => { datePickerRef.current.clear(); }; return ( <> <DatePicker ref={datePickerRef} allowClear /> <button onClick={handleClear}>清空</button> </> ); } export default App; ``` 以上是在React中使用antdDatePicker组件实现清空功能的方法,可以根据实际需要选择适合自己的方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值