Добавление класса другому компоненту в 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, время: 09:42. |