Как добавить className в оболочку пользовательского компонента

#javascript #reactjs #typescript

#javascript #reactjs #typescript

Вопрос:

У меня есть пользовательский раскрывающийся компонент, подобный этому:

 class Dropdown extends Component<DropdownProps, DropdownState> {
 ...
}
  

Однако в этом выпадающем классе DropdownProps не объявлял className в интерфейсе.

Теперь я пишу оболочку для этого выпадающего компонента

 import { Dropdown as Component } from "dropdown";
import { DropdownProps as ComponentProps } from "dropdown";
import cx from "classnames";

type DropdownProps = ComponentProps amp; {
  className: string;
};

const DropdownWrapper: React.FC<DropdownProps> = props => {
  const { className, children } = props;

  return <Component {...props} className={cx(className)} />;
};
  

Однако он по-прежнему показывает ошибку, потому что возврат Component в оболочке не принимает новые реквизиты className .

В любом случае я могу добавить className к propsList оболочке без необходимости изменять оригинал dropdown .

Спасибо

Комментарии:

1. Обойти это невозможно. Вам нужно будет добавить className в качестве необязательного реквизита в исходном раскрывающемся компоненте.

2. Передайте className в качестве реквизита и добавьте его в контейнер вложенного компонента следующим образом: <div className={props.className}>

3. @ChristopherDias вы имеете в виду добавить контейнер, обертывающий Component в return statement ?

Ответ №1:

Лучшей идеей было бы просто определить необязательный className реквизит для вашего Dropdown компонента. Но если вы не можете и нуждаетесь в этом компоненте-оболочке, вам следует создать новый интерфейс props, аналогичный интерфейсу extends исходного компонента:

 export interface DropdownWrapperProps extends DropdownProps {
  className: string
}
  

Затем, чтобы исправить ошибку TypeScript, вам нужно извлечь className из реквизита. Вы можете легко добиться этого с помощью деструктурирования объекта. И, наконец, добавьте a div , чтобы обернуть ваш компонент нужным классом:

 const DropdownWrapper: React.FC<DropdownWrapperProps> = props => {
  const { className, children, ...rest } = props; // rest is equal to props without 'className' and 'children'

  return (
    <div className={cx(className)}>
      <Component {...rest} />
    </div>
  );
};
  

Комментарии:

1. Это не работает для меня, потому Component что это исходный выпадающий список, в котором нет объявления реквизитов className в исходном компоненте. Поэтому, даже если вы объявите его в оболочке, он все равно не работает (в основном то, что вы сделали, совпадает с тем, что я сделал в своем qs, верно)

2. О, вы правы, не поняли, что Component это Dropdown . Я обновлю свой ответ 😉

3. нет проблем, пока я думаю, что единственный способ — создать другой контейнер, обертывающий компонент в операторе return, и поместить туда className.

4. @JakeLam Да, я тоже думал об этом, поэтому написал это в своем ответе. Не очень элегантно, но это единственный способ, если Dropdown реквизиты не обрабатываются className .