时间多选 给予ant组件二级封装

该代码创建了一个名为SelectorTime的React组件,结合了AntDesign的TreeSelect和DatePicker。组件支持自定义样式和事件处理,如takeValue函数来传递选择的值。同时,它处理了组件之间的高度同步问题,确保TreeSelect的选择不会遮挡DatePicker。
摘要由CSDN通过智能技术生成

import { TreeSelect, DatePicker ,TreeSelectProps,DatePickerProps} from 'antd';
import  { useEffect, useRef, useState, ReactNode} from 'react';
import 'dayjs/locale/zh-cn';
import locale from 'antd/es/date-picker/locale/zh_CN';
import { createStyles, makeStyles } from '@material-ui/core';

const useStyle = makeStyles(
  createStyles({
    divStyle: {
      display: 'flex',
      flexDirection: 'column'
    }
  })
);

type Props = {
    TreeSelectType?:TreeSelectProps //竖向选择器样式
    DatePickerType?:DatePickerProps //时间选择器样式
    SelectorTimeID?:string,//防止冲突 一个页面多个 必传
    children?: ReactNode;
    takeValue?:(value:string[])=>void
  } 


const SelectorTime = ({ SelectorTimeID = '1', ...ages }: Props) => {
  const cls = useStyle();
  const [selectedOptions, setSelectedOptions] = useState<string[]>([]);
  const [selectedDate, setSelectedDate] = useState(null);
  useEffect(() => {
    if (ages.takeValue) {
      ages.takeValue(selectedOptions);
    }
  }, [ages.takeValue, selectedOptions]);

  const handleDatePickerChange = (date: any, dateString: any) => {
    setSelectedDate(date);
    if (dateString) {
      setSelectedOptions((val: any) => {
        return [...val, dateString];
      });
    }
  };
  const handleTreeSelectChange = (value: any) => {
    setSelectedOptions(value);
};
  const handleFocus = () => {
    const div = document.querySelector(`#datePicker${SelectorTimeID}`) as HTMLElement;
    div?.focus();
    div?.click();
  };
  useEffect(() => {
    const TreeSelectss = document.querySelector(`#TreeSelect${SelectorTimeID}`) as HTMLElement;
    const treeDiv = TreeSelectss.parentNode?.parentNode?.parentNode as HTMLElement
    const divSonf = document.querySelector(`#datePicker${SelectorTimeID}`) as HTMLElement;
    const divSon = divSonf?.parentNode?.parentNode as HTMLElement;
    console.log(treeDiv?.getBoundingClientRect().height,'treeDiv');
    
    divSon.style.height = treeDiv?.getBoundingClientRect().height + 'px';
  }, [selectedOptions]);
  return (
    <>
      <div style={{ width: 300, minHeight: 40, position: 'relative' }} className={cls.divStyle} id="parentElement">
        <TreeSelect
          size="middle"
          id={`TreeSelect${SelectorTimeID}`}
          style={{ width: 300, height: 35, position: 'absolute', left: 0, right: 0, top: 0, bottom: 0, zIndex: 99 }}
          multiple
          onChange={handleTreeSelectChange}
          value={selectedOptions}
          onClick={handleFocus}
          dropdownStyle={{
            display: 'none'
          }}
          {...ages.TreeSelectType}
        />
        <DatePicker size="middle" locale={locale} id={`datePicker${SelectorTimeID}`} value={selectedDate} onChange={handleDatePickerChange} style={{ width: 300, height: 32, position: 'absolute', left: 0, right: 0, top: 0, bottom: 0, opacity: 0 }} {...ages.DatePickerType} />
      </div>
    </>
  );
};

export default SelectorTime;

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值