Реагировать с помощью JSS - как добавить класс в дочерний компонент?

У меня есть компонент-оболочка, который обрабатывает анимацию монтирования и размонтирования моих компонентов, а также передает любые другие реквизиты от родителя. Оболочка добавляет реквизиты class и toggleVisibility к дочернему элементу, чтобы я мог добавить анимацию css к содержащим элементам и изменить видимость внутри дочернего элемента, однако я хотел бы, чтобы css применялся к корневому элементу дочернего элемента без необходимости изменить код ребенка, чтобы приспособиться. Это мой код:

<Animated visibility = "initialOn" direction = "down" >
  <Welcome testProp = "Coool!" />
</Animated>

export const Animated = ({
  children,
  visible,
  direction = "up",
}: Props): JSX.Element => {
  const theme: any = useTheme();
  const [show, setShow] = useState(visible === "initialOn" || visible === true);
  if (visible !== "initialOn" && visible !== "initialOff") {
    if (show !== visible) {
      setShow(visible);
    }
  }
  const transitioned = useMountTransition(show, theme.defaultTransitionSpeed);
  const toggleVisibility = () => setShow(!show);
  const animatedClass = // this contains the JSS class I want to apply to the child's root element
    transitioned && show
      ? theme.animVisible[direction]
      : theme.animInVisible[direction];

  const childrenWithProps = React.Children.map(children, (child) => {
    if (React.isValidElement(child)) {
      return React.cloneElement(child, {
        toggleVisibility,
        animatedClass,
      });
    }
    return child;
  });

  return <>{(transitioned || show) && childrenWithProps}</>;
};

Это дочерний компонент, вы можете видеть, где я добавляю дополнительный стиль в JSS.

export const useStyles = createUseStyles<any, any>((theme: any) => {
  const { modalOuter, animatedClass } = theme;
  return {
    splashOuter: { //container div
      ...modalOuter,
      marginLeft: "auto",
      marginRight: "auto",
      ...animatedClass, // apply animation styles
    },
  };
});

const Welcome = ({ toggleVisibility, animatedClass }: Props): JSX.Element => {
  const theme = { ...useTheme(), animatedClass }; // additional styles applied within here
  const styles = useStyles({ theme });
  return (
    <div className = {styles.splashOuter}>
      <div className = {styles.splashInner}>
        <button className = {styles.button} onClick = {toggleVisibility}>
          PROCEED
        </button>
      </div>
    </div>
  );
};

export default Welcome;

Спасибо

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

Mujeeb Qureshi 20.03.2022 02:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение оказалось намного проще, чем я ожидал. Обертывание дочернего компонента в div с примененными стилями работало отлично. Спасибо

const childrenWithProps = React.Children.map(children, (child) => {
    if (React.isValidElement(child)) {
      return (
        <div className = {styles.wrapper}>
          {React.cloneElement(child, {
            toggleVisibility,
          })}
        </div>
      );
    }
    return child;
  });

Другие вопросы по теме

Похожие вопросы