Задать вопрос
NEOmanceR
@NEOmanceR
Начинающий веб разработчик

Как сбросить состояние всех компонентов одной кнопкой?

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

import './App.css';
import Text from './Text/Text';
import {useState} from 'react'

function App() {

  let [status, setStatus] = useState(false)


  let list = [
    {id: 1, text: 'Text 1'},
    {id: 3, text: 'Text 2'},
    {id: 2, text: 'Text 3'},
  ]

  function resetColor(params) {
    setStatus(false)
  }

  return (
    <div className="App">
      <button
        onClick={()=>{resetColor()}}
      >reset color</button>
      {list.map(({id, text}) => {
        return (
          <Text key={id} text={text} />
        )
      })}
    </div>
  );
}

export default App;


import React from 'react';
import './text.css';
import { useState } from 'react'


const Text = ({text, status}) => {

  let [active, setActive] = useState(status);

  function changeColor() {
    console.log('work');
    setActive(active = !active)
  }

  return (
  <p
    className={active ? 'red-text' : ''}
    onClick={()=>{changeColor()}}
  >
    {text}
  </p>
  );
};

export default Text
  • Вопрос задан
  • 234 просмотра
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Merion Academy
    Frontend-разработка на React
    4 месяца
    Далее
  • ProductStar
    React: отточите навыки интерфейсной разработки
    6 недель
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега React
Храните значения, отвечающие за цвет текста, в родительском компоненте, можно вместе с остальными данными:

const [ items, setItems ] = useState([
  { id: ..., text: '...', active: false },
  { id: ..., text: '...', active: false },
  ...
]);

Тогда сброс этих значений оказывается делом тривиальным:

const reset = () => setItems(items.map(n => ({ ...n, active: false })));

<button onClick={reset}>reset</button>

Ну а переключение значений изнутри экземпляров компонента Text придётся переписать. Сделаем функцию, которая принимает id, и изменяет соответствующий элемент:

const toggle = id => setItems(items.map(n => n.id === id ? { ...n, active: !n.active } : n));

Передадим эту функцию в экземпляры компонента Text:

{items.map(n => <Text key={n.id} {...n} toggle={toggle} />)}

Назначим её в качестве обработчика клика:

const Text = ({ id, text, active, toggle }) => (
  <p
    className={active ? 'active' : ''}
    onClick={() => toggle(id)}
  >
    {text}
  </p>
);

Всё.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
kritskiy_a
@kritskiy_a
Frontend-developer
function resetColor(params) {
    setStatus(!status)
  }
Ответ написан
Комментировать
TheSnegok
@TheSnegok
У тебя нету обратной логики оно у тебя ставит только в положение false по клику и всё
в функции напиши так:
const resetColor = () => {
status ? setStatus(false) : setStatus(true);

И для change также только используй, и status тебе нужно передавать в компоненту text, и там уже ставить класс на чёрный текст если она true
Ответ написан
Комментировать
@yaroslav1996
function resetColor(params) {
    setStatus(prevStatus => !prevStatus)
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽
ITK academy Казань
от 50 000 до 90 000 ₽