Home > Back-end >  Problem with changing state when clicking on button
Problem with changing state when clicking on button

Time:01-08

I have a problem I can't deal with. In a project I'm working on, when I click on a colour, the colour of the t-shirt should change, but in the meantime I get an error. I really need help. Repo to project: https://github.com/ewaolczak/product-personalizer/commit/a70ad00e360bc96de28c32e27c9c8ee9b9626a6a?w=1

I have read the course material several times, searched for solutions on the Internet and still do not know where the error is.

CodePudding user response:

On line 25 of OptionColor.js, you try accessing setCurrentColor() from props, which is likely where the error is thrown. This is because on line 73 of Product.js, where the <OptionColor> component is used, you don't pass in a prop named "setCurrentColor" equal to a function.

To fix this, I think what you meant to do on line 73 of Product.js is:

<OptionColor colors={props.colors} setCurrentColor={setCurrentColor} />

CodePudding user response:

In your file OptionColor.js you are calling props.setCurrentColor(color). That function does not exist, because the parent has not got the prop defined.

In your Product.js file, add the following:

  <OptionColor
    colors={props.colors}
    setCurrentColor={setCurrentColor}
  />

CodePudding user response:

Why there is an error:

In your OptionColor component, the code describes that whenever the button is clicked, it will call props.setCurrentColor(whatever-color) like so:

<button onClick={() => props.setCurrentColor(color)}></button>

This is telling React to call the setCurrentColor argument passed into the component. The problem is, your Product component doesn't pass in a setCurrentColor function, just the colors array.

<OptionColor colors={props.colors} />

To fix:

Change the OptionColor usage in the Product component to:

<OptionColor colors={props.colors} setCurrentColor={setCurrentColor} />

To provide the OptionColor a way to change its parent's state.

CodePudding user response:

This is your OptionColor.js:

import React from 'react';
import styles from './OptionColor.module.scss';
import shortid from 'shortid';
import clsx from 'clsx';

const OptionColor = (props) => {
  const prepareColorClassName = (color) => {
    return styles[
      'color'   color[0].toUpperCase()   color.substr(1).toLowerCase()
    ];
  };

  return (
    <div className={styles.colors}>
      <h3 className={styles.optionLabel}>Colors</h3>
      <ul className={styles.choices}>
        {props.colors?.map((color) => (
          <li key={shortid()}>
            <button
              type='button'
              className={clsx(
                prepareColorClassName(color),
                props.currentColor === color ? styles.active : undefined
              )}
              onClick={() => props.setCurrentColor(color)}></button>
          </li>
        ))}
      </ul>
    </div>
  );
}

export default OptionColor;

At the bottom in your <li> is this line, which is trying to call a setCurrentColor. This function was was not passed to the component (it's undefined):

onClick={() => props.setCurrentColor(color)}></button>

Solution

In Product.js, change:

<OptionColor colors={props.colors} />

To:

<OptionColor colors={props.colors} setCurrentColor={setCurrentColor} />
  • Related