Home > Software engineering >  What causes the failure to pass props from parent to child in this React application?
What causes the failure to pass props from parent to child in this React application?

Time:01-05

I am working on a small React app. It has a list of buttons in a Buttons.js component.

Following this guide, I am trying to pass the value of the label attribute into the single button template like this:

In Buttons.js:

import './Buttons.css';
import Button from './Button';

const Buttons = (props) => {
 return (
  <ol >
   <Button label="Clik 1" />
   <Button label="Clik 2" />
   <Button label="Clik 3" />
  </ol>
 );
};

export default Buttons;

In Button.js:

import './Button.css';

const Button = () => {
  return ( <li>{ this.props.label }</li> );
}

export default Button;

The problem

The code above shows no error in the console, but it does throw this in the browser's console:

Cannot read properties of undefined (reading 'props')

CodePudding user response:

The correct code is

import './Button.css';

const Button = (props) => {
  return ( <li>{ props.label }</li> );
}

export default Button;

You forgot to pass props and you were using this.props.label.

CodePudding user response:

You're confusing Class Components and Function Components.

In a Function Component, like the one you, have props are passed as the first argument to the function.

const Button = (props) => {
    return ( <li>{props.label}</li> );
}

And commonly destructured:

const Button = ({label}) => {
    return ( <li>{label}</li> );
}

You would access props via this if you were writing a Class Component:

class Button extends React.Component {
    render() {
        return ( <li>{this.props.label}</li> );
    }
}

CodePudding user response:

First, your Button component is a functional component, so no need for this. Second, you need to define props in your button component;

const Button = (props) => {
  return ( <li>{ props.label }</li> );
}

export default Button;

CodePudding user response:

In Button.js you forgot to pass props as parameter to the functional component

const Button = (props) => { return ( <li>{ props.label }</li> ); }

And no need to do this.props.label Replace it with props.label

  •  Tags:  
  • Related