Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.07.2024, 20:34
Аспирант
Отправить личное сообщение для Raadsert Посмотреть профиль Найти все сообщения от Raadsert
 
Регистрация: 09.12.2021
Сообщений: 98

Добавление класса другому компоненту в React
Здравствуйте.

Подскажите, как можно по клику на кнопку добавить класс какому-то другому компоненту в проекте, вне текущего компонента?

Button.js
<button onClick={handleBtn}>Клик</button>

Box.js
<div>Сюда добавить класс</div>

App.js
<Box />
<Button />
Ответить с цитированием
  #2 (permalink)  
Старый 26.07.2024, 20:42
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,577

В простом случае: просто кинуть событие клика в общий родитель, и из этого родителя простаивать класс.
В сложном случае: использовать контекст.
В очень сложном энтерпрайз случае: использовать стор.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 26.07.2024, 20:45
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Самый простой вариант:
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"/>
    </>;
}
Ответить с цитированием
  #4 (permalink)  
Старый 31.07.2024, 12:01
Аспирант
Отправить личное сообщение для Raadsert Посмотреть профиль Найти все сообщения от Raadsert
 
Регистрация: 09.12.2021
Сообщений: 98

Сообщение от Nexus Посмотреть сообщение
Самый простой вариант:
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"/>
    </>;
}
А в реакте не популярно присваивать классы через ref?
Ответить с цитированием
  #5 (permalink)  
Старый 31.07.2024, 12:10
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,577

Raadsert, нигде не "популярно". Прямая работа с DOM, т.е. element ref(и аналоги из иных фреймворков) - это крайний случай, заразервированный в основном для сторонних блиблиотек и для тех кто знает что делает. Работая в рамках фреймворка вы работаете с данными, заботу по рисованию этих данных полностью берёт на себя фреймворк; касаться DOM вне его рамок не следует.
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 31.07.2024, 12:23
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от Raadsert
А в реакте не популярно присваивать классы через ref?
Реакт это про стейт и пропсы...
Ответить с цитированием
  #7 (permalink)  
Старый 31.07.2024, 18:28
Аспирант
Отправить личное сообщение для Raadsert Посмотреть профиль Найти все сообщения от Raadsert
 
Регистрация: 09.12.2021
Сообщений: 98

Сообщение от Aetae Посмотреть сообщение
Raadsert, нигде не "популярно". Прямая работа с DOM, т.е. element ref(и аналоги из иных фреймворков) - это крайний случай, заразервированный в основном для сторонних блиблиотек и для тех кто знает что делает. Работая в рамках фреймворка вы работаете с данными, заботу по рисованию этих данных полностью берёт на себя фреймворк; касаться DOM вне его рамок не следует.
Тогда ref остаётся только для чтения информации из него? Ему хоть и можно присваивать какие-то значения, но лучше этого не делать? Сильно влияет на оптимизацию?

Странно, на любых курсах рассказывают о ref как способе взаимодействия с DOM элементом.
Ответить с цитированием
  #8 (permalink)  
Старый 31.07.2024, 19:22
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,577

Raadsert,
Цитата:
Странно, на любых курсах рассказывают о ref как способе взаимодействия с DOM элементом.
Так это и есть способ взаимодействия с DOM элементом. Просто тебе не надо с ним взаимодействовать в 99.9% случаев. Если что-то можно сделать через фреймворк - это нужно сделать через фреймворк, оно там не просто так.
Дело не в какой-то там оптимизации, дело в нарушении логики фреймворка: фреймворк не ожидает, что DOM как либо изменится извне, он рассчитывает, что DOM будет в таком виде в каком он его оставил. Потому трогать DOM руками стоит только если иначе действительно никак, при этом очень осторожно и с оглядкой. В противном случае очень легко можно наплодить сложных багов.
__________________
29375, 35

Последний раз редактировалось Aetae, 31.07.2024 в 19:26.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление класса, если присутвует другой класс spaiker2009 Events/DOM/Window 2 23.08.2019 13:56
Добавление custom класса как item класса tab. Unrecognized alias: widget. Postgeograph ExtJS 6 13.12.2018 11:56
Добавление класса с анимацией. xTODx Элементы интерфейса 2 11.05.2015 10:24
Добавление класса всем родительским элементам списка Torawhite Элементы интерфейса 0 01.05.2015 22:06
Использование классов в JavaScript devote Ваши сайты и скрипты 70 01.02.2013 17:17