reactjs - Anpassad react-datumväljare med typescript
Jag försöker skapa en anpassad datumväljare enligt instruktionerna i dokumentationen och efter en lång tid lyckades jag göra det, men jag får fortfarande ett fel som säger "Funktionskomponenter kan inte ges refs. Försök att komma åt denna ref kommer att misslyckas. Menade du att använda React.forwardRef()?" Jag använder TypeScript i mitt projekt.
import DatePicker from "react-datepicker";
import React, { useContext, useState } from "react";
import "react-datepicker/dist/react-datepicker.css";
const Feed: React.FC = () => {
const [startDate, setStartDate] = useState();
const ExampleCustomInput = ({
value,
onClick,
}: {
value?: any;
onClick?: any;
}) => (
<DateFilter className="example-custom-input" onClick={onClick}>
{value || "Escolha uma data"}
<CalendarIcon />
</DateFilter>
);
return (
<Container>
<LeftContent>
<NewPost onClick={openModal}>+ Novo post</NewPost>
<DatePicker
dateFormat="dd/MM/yyyy"
selected={startDate}
onChange={(date: any) => setStartDate(date)}
customInput={<ExampleCustomInput />}
/>
</LeftContent>
</Container>
);
};
export default Feed;Svar #1
Om jag förstår din fråga korrekt. För att exportera din anpassade react-datepicker-funktion kan du använda typen { ReactDatePickerProps } från "react-datepicker" och du kan anpassa denna propstyp efter dina behov. Här är ett CustomDatePicker-exempel för att illustrera idén.
type CustomDatePickerProps = ReactDatePickerProps & {t: Translate;};
const CustomDatePicker: React.FC<CustomDatePickerProps> = (props) => {
const { t, ...rest } = props;
return (
<ReactDatePicker
renderCustomHeader={({
date,
increaseYear,
decreaseYear,
decreaseMonth,
increaseMonth,
prevMonthButtonDisabled,
nextMonthButtonDisabled,
prevYearButtonDisabled,
nextYearButtonDisabled,
}) => (
<div className="flex justify-between items-center px-3 py-2 ">
<div className="flex">
<button
onClick={decreaseYear}
disabled={prevYearButtonDisabled}
className="text-textSecondary flex"
>
<LeftIcon className="w-4 h-4" />
<LeftIcon className="w-4 h-4 -ml-3" />
</button>
<button
onClick={decreaseMonth}
disabled={prevMonthButtonDisabled}
className="text-textSecondary ml-1"
>
<LeftIcon className="w-4 h-4" />
</button>
</div>
<div className="text-base font-bold">{`${numberToMonth(
date.getMonth(),
t
)} ${date.getFullYear()}`}</div>
<div className="flex">
<button
onClick={increaseMonth}
disabled={nextMonthButtonDisabled}
className="text-textSecondary"
>
<LeftIcon className="w-4 h-4 transform rotate-180" />
</button>
<button
onClick={increaseYear}
disabled={nextYearButtonDisabled}
className="text-textSecondary flex ml-1"
>
<LeftIcon className="w-4 h-4 transform rotate-180" />
<LeftIcon className="w-4 h-4 transform rotate-180 -ml-3" />
</button>
</div>
</div>
)}
{...rest}
/>
); };
export default CustomDatePicker;
Svar #2
ja, du behöver använda React.forwardRef för att lösa detta problem. Detta är koden jag kom på för att lösa detta problem för mig:
import React, { FunctionComponent } from 'react'
import ReactDatePicker, { ReactDatePickerProps } from 'react-datepicker'
import 'react-datepicker/dist/react-datepicker.css'
const ReactDatePickerInput = React.forwardRef<
HTMLInputElement,
React.DetailedHTMLProps<
React.InputHTMLAttributes<HTMLInputElement>,
HTMLInputElement
>
>((props, ref) => <input ref={ref} {...props} />)
ReactDatePickerInput.displayName = 'ReactDatePickerInput'
export const FormDatePicker: FunctionComponent<ReactDatePickerProps> = (props) => {
return (
<ReactDatePicker
{...props}
// @see https://github.com/Hacker0x01/react-datepicker/issues/862#issuecomment-534736357
customInput={<ReactDatePickerInput label={label || ''} name={name} />}
/>
)
}
