Добавление класса другому компоненту в React
Здравствуйте.
Подскажите, как можно по клику на кнопку добавить класс какому-то другому компоненту в проекте, вне текущего компонента? Button.js <button onClick={handleBtn}>Клик</button> Box.js <div>Сюда добавить класс</div> App.js <Box /> <Button /> |
В простом случае: просто кинуть событие клика в общий родитель, и из этого родителя простаивать класс.
В сложном случае: использовать контекст. В очень сложном энтерпрайз случае: использовать стор. |
Самый простой вариант:
import React, {useState} from 'react'; function Box(props: {className?: string}) { return <div className={props.className}>Сюда добавить класс</div>; } function Button(props: { setBoxClassName: React.Dispatch<React.SetStateAction<string | undefined>>, }) { return <button onClick={() => { props.setBoxClassName(w => w ? undefined : 'd-none'); }}>Клик</button> } function App() { const [boxClassName, setBoxClassName] = useState<string | undefined>(); return <> <Box className={boxClassName}/> <Button setBoxClassName="setBoxClassName"/> </>; } |
Цитата:
|
Raadsert, нигде не "популярно". Прямая работа с DOM, т.е. element ref(и аналоги из иных фреймворков) - это крайний случай, заразервированный в основном для сторонних блиблиотек и для тех кто знает что делает. Работая в рамках фреймворка вы работаете с данными, заботу по рисованию этих данных полностью берёт на себя фреймворк; касаться DOM вне его рамок не следует.
|
Цитата:
|
Цитата:
Странно, на любых курсах рассказывают о ref как способе взаимодействия с DOM элементом. |
Raadsert,
Цитата:
Дело не в какой-то там оптимизации, дело в нарушении логики фреймворка: фреймворк не ожидает, что DOM как либо изменится извне, он рассчитывает, что DOM будет в таком виде в каком он его оставил. Потому трогать DOM руками стоит только если иначе действительно никак, при этом очень осторожно и с оглядкой. В противном случае очень легко можно наплодить сложных багов. |
Часовой пояс GMT +3, время: 15:25. |