Изменить класс динамически генерируемых компонентов в REACT без ручного создания отдельного состояния для каждого?

#javascript #reactjs #react-redux

#javascript #reactjs #react-redux

Вопрос:

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

Сгенерированные компоненты :

 <Col>
  {ageCategoriesDisplay.map((category) => (
   <h3
      key={category}
      onClick={(() => categoryCheckHandler(category), ToggleClass)}
   >
   {category}
   </h3>
))}
</Col>
 

Пожалуйста, не обращайте внимания на categoryCheckHandler, это связано с чем-то другим. toggleClass на данный момент пуст.

Итак, вы видите, что я пытаюсь переключить класс выбранного компонента, но я не знаю, как захватить этот конкретный компонент и переключить его класс. Все ответы, которые я нашел, говорят мне использовать state, но я не могу вручную создать состояние для каждого из этих компонентов, поскольку их количество и имя часто меняются, и если я использую только одно состояние, очевидно, что все они переключаются при нажатии на одно.

Я нашел несколько ответов, используя «старый» способ выполнения действий в react, с конструктором и «этим», но я не знаком с этим способом выполнения действий, я работаю с крючками. Любая помощь будет высоко оценена.

Ответ №1:

Что вы можете сделать, так это создать дочерний компонент.

 ageCategoriesDisplay.map(item => (
   <ChildComponent useWhenChange={ runsomefunction } item={item}/>
)
 

Вы можете использовать этот элемент в цикле, и он автоматически создаст столько элементов, сколько есть в вашей категории.

 const ChildComponent = (props) => {

    const [ someState, setSomeState ] = useState({ fontSize: '1rem'})
    const [ addClass, setAddClass ] = useState(false);

    const onClickFunction = () => {
        setAddClass(true)
        setSomeState({ fontSize: '2rem' })
        props.useWhenChange() // <-- also can call parent function
    }
    return ( <div><h1 onClick={onClickFunction} className={ addClass ? 'somecssClass' : ''} style={someState}>Click Me To Change Size</h1>
             {/* you can also render the props e.g. name */}
             <h2>{props.item.name}</div>
             </div>
}
 

выше продемонстрирован вызов родительской функции, переключение базы классов на true / false, рендеринг элемента .map и настройка стиля.

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

1. Большое вам спасибо, я попробую это!