Я создал этот кодовый ящик, реплицирующий мою проблему
- 1) Сначала я создал компонент
<Input>
(для стилизации и отслеживания, имеет ли вход содержимое или нет. - 2) Все работает, но, поскольку нужно добавить больше форм в проект, я подумал, черт возьми, может, я мог бы также создать ловушку useInput, чтобы просто управлять обновлением значения вместо того, чтобы добавлять
onChange: {e => {setSomething(e.target.value)}}
все time.
Итак, я создал эти useInput, но получил эти раздражающие ошибки красного линтера. Вероятно, это какая-то основная проблема типа c, но я могу понять , как избавиться от этой проблемы. без решений типа any
? Заранее спасибо
Снимок экрана с ошибкой и фрагмент кода ниже, но лучший тест в песочнице
# useInput.tsx
import { useState, ChangeEvent } from "react";
export type onChangeType = (event: ChangeEvent<HTMLInputElement>) => void;
const useInput = (initialValue = "") => {
const [value, setValue] = useState(initialValue);
const reset = () => setValue("");
const onChange: onChangeType = e => {
setValue(e.target.value);
};
return [value, onChange, reset];
};
export default useInput;
# Input.tsx
import React, { useState, ChangeEvent } from "react";
import styled, { css } from "styled-components";
import onChangeType from "./hooks/useInput";
interface iLabelProps {
hasContent: boolean;
}
const hasContentCSS = () => css`
border: 5px solid royalblue;
`;
const Label = styled.label<iLabelProps>```
interface iInput {
readonly type?: string;
readonly name: string;
readonly label: string;
value?: string | number | string[] | null;
defaultValue?: string | number | string[] | null;
readonly onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
}
export const Input = ({
name = "email",
label,
value = null,
defaultValue = null,
onChange = null
}: iInput) => {
const [hasContent, setHasContent] = useState(!!defaultValue);
const onBlur = value => {
setHasContent(value.length > 0);
};
return (
<Label hasContent={hasContent}>
<input
type="text"
name={name}
{...defaultValue && { defaultValue: defaultValue }}
{...!defaultValue && { value: value ? value : "" }}
{...onChange && { onChange: onChange }}
onBlur={e => onBlur(e.target.value)}
/>
<span>{label}</span>
</Label>
);
};