Как я могу изменить цвет дочернего компонента при нажатии?

#javascript #reactjs

#javascript #reactjs

Вопрос:

У меня есть несколько компонентов «прямоугольника» в «Стене», которые должны менять цвет при нажатии. onClick в ‘Rectangle’ используется в другом компоненте, который сделает ‘Rectangle’ скрытым или нет. Я пытался сделать что-то подобное здесь, но я не могу изменять переменные внутри компонента «Прямоугольник».

Моя попытка

 customClickEvent={() =>{this.props.color = hidden_dictionary[count];}}
 

Wall.js

 const [count, setCount] = useState(0);
    const color_dictionary = {0: "bg-red-400", 1: "bg-blue-400", 2:"bg-green-400", 3:"bg-yellow-400"};

    return (
        <div className="grid grid-flow-col grid-rows-4 lg:py-20 gap-y-1 gap-x-1 lg:gap-y-6 lg:gap-x-6 justify-center items-center">
            <Rectangle type="wall">Fiji</Rectangle>
            <Rectangle type="wall">Hazelnut</Rectangle>
            <Rectangle type="wall">Mocha</Rectangle>
            <Rectangle type="wall">Australia</Rectangle>
            <Rectangle type="wall">Cook Islands</Rectangle>
            <Rectangle type="wall">Cube</Rectangle>
            <Rectangle type="wall">Vanilla</Rectangle>
            <Rectangle type="wall">Butter Pecan</Rectangle>
            <Rectangle type="wall">San Pellegrino</Rectangle>
            <Rectangle type="wall">Coconut</Rectangle>
            <Rectangle type="wall">Papua New Guinea</Rectangle>
            <Rectangle type="wall">Caramel</Rectangle>
            <Rectangle type="wall">Prince</Rectangle>
            <Rectangle type="wall">Guam</Rectangle>
            <Rectangle type="wall">Champagne</Rectangle>
            <Rectangle type="wall">T</Rectangle>
        </div>  
    )
 

Rectangle.js

     //ANSWER
    if(props.type === "answer") {
        width = "p-2";
        height = "h-12 lg:h-20";
        text_size = "text-2xl sm:text-4xl lg:text-5xl";
    }

    //WALL
    else if (props.type === "wall")
    {
        width = "w-20 sm:w-24 lg:w-52  cursor-pointer";
        height = "h-16 sm:h-20 lg:h-40";
        text_size = "text-1xl lg:text-4xl";
        color = props.color;
    }

    //VOWELS
    else if (props.type === "vowels")
    {
        width = "p-4";
        height = "";
        text_size = "text-3xl sm:text-4xl lg:text-5xl";
        color = "bg-blue-800 text-white";
    }

    else
    {
        width = "w-16 sm:w-36 lg:w-80";
        height = "h-12 sm:h-28 lg:h-64";
        text_size = "text-2xl sm:text-6xl lg:text-8xl";
    }

    return (
      <div onClick={props.customClickEvent} className={width   " "   height   " "   props.color   " "   " shadow-2xl rounded-md "   props.hidden}>
         <h1 className={text_size   " w-full h-full flex justify-center items-center text-center"}>{props.children}</h1>
        </div>)
 

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

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

Ответ №1:

Реквизит не предназначен для изменения. Другими словами, установка нового значения this.props.color не приведет к повторному отображению прямоугольника. Даже если бы это произошло, значение this в вашем обратном вызове будет для экземпляра Wall , потому что вы используете функцию со стрелкой, которая наследует ее this из окружающей области.

Одним из решений было бы, чтобы ваш компонент Wall сохранял цвет каждого прямоугольника в качестве состояния и передавал его через color prop. Затем ваш обработчик обратного вызова может изменить цвет. Однако, поскольку у вас их несколько Rectangles , вам потребуется какой-то способ различать между ними индекс или, возможно, идентификатор.

Если вам не важно Wall знать, был ли Rectangle нажат, тогда было бы проще определить обработчик щелчка внутри Rectangle и изменить его состояние в Rectangle , т.е.:

 const [color, setColor] = useState();

return (
<div onClick={() => setColor(‘new colour’)} className={width   " "   height   " "   color   " "   " shadow-2xl rounded-md "   props.hidden}>
         <h1 className={text_size   " w-full h-full flex justify-center items-center text-center"}>{props.children}</h1>
        </div>)
 

Ответ №2:

Вы пробовали переключать CSS-класс onClick ? Этот класс будет оформлен в соответствии с вашими потребностями. Единственное, что вам нужно сделать, это динамически добавить класс.