#reactjs #typescript #react-select
#reactjs #typescript #реагировать-выбирать
Вопрос:
Я хотел бы знать, как красиво добавлять типы к выбору с помощью react-select.
Компонент пока выглядит так:
const Select: React.FC<Select> = (
{defaultValue, onChange, options}: Select) => (
<ReactSelect
styles={selectStyles}
…
</ReactSelect>
и определение selectStyles
:
interface HoverProps {
bowShadow: string
border: string
}
interface ControlComponentCSSProperties extends CSSProperties {
'amp;:hover': HoverProps
}
const selectStyles = {
control: (
provided: CSSProperties,
state: Props<{label: string; value: string}> | Props<Record<string, unknown>>
): ControlComponentCSSProperties => ({
...provided,
'amp;:hover': {
bowShadow: 'none',
border: 'none',
},
border: 'none',
borderRadius: input.border.radius,
borderBottomLeftRadius: state.menuIsOpen ? 0 : input.border.radius,
borderBottomRightRadius: state.menuIsOpen ? 0 : input.border.radius,
…
Это проходит, tsc
но, конечно, есть более простые способы ввести этот selectStyles
объект.
Был бы признателен за вашу помощь, указывающую мне лучшее направление. Приветствия!
Ответ №1:
Вы можете ввести весь объект стиля с помощью StyleConfig
, что устраняет необходимость вводить все параметры вручную. Но перед этим вам нужно будет установить @types/react-select
пакет.
StyleConfig
требуется передать как минимум 2 переменные общего типа в соответствии с этим объявлением здесь.
OptionType
: Тип параметраreact-select
. Согласно этому, по умолчаниюOptionType
является{ label: string; value: string }
IsMulti
: логическое значение, чтобы определить, можно ли выбрать несколько значений.
Собрав все это вместе, мы получим что-то вроде этого:
import Select, { StylesConfig } from 'react-select';
type MyOptionType = {
label: string;
value: string;
};
const options: MyOptionType[] = [
{ value: "chocolate", label: "Chocolate" },
{ value: "strawberry", label: "Strawberry" },
{ value: "vanilla", label: "Vanilla" }
];
const customControlStyles: CSSProperties = {
color: "white",
borderColor: "pink"
};
type IsMulti = false;
const selectStyle: StylesConfig<MyOptionType, IsMulti> = {
control: (provided, state) => {
// provided has CSSObject type
// state has ControlProps type
// return type is CSSObject which means this line will throw error if uncommented
// return false;
return {
...provided,
...customControlStyles
};
}
};
export function App() {
return (
<Select options={options} styles={selectStyle} />
);
}
Живая демонстрация
Комментарии:
1. Большое вам спасибо. Мне все еще приходилось использовать « state: Props<Запись<строка, неизвестно>> «, поскольку изменения в ControlProps не проходили. Но ваше предложение значительно улучшило реализацию, ценю это 👍
2. Спасибо @gusaiani за этот комментарий, мне все еще нужно использовать это тоже, потому что StylesConfig требует других 2-3 типов
3. Просто для справки: первые два обобщения StylesConfig представляют собой расширенный тип OptionTypeBase, а второй — логическое значение, ссылающееся на IsMulti.
4. @BenedekSimo обновил ответ, чтобы исправить все проблемы. Спасибо, что напомнили мне.
5. Я получаю
Type 'StylesConfig' is not generic
ошибку типа