Rupp
Rupp

Reputation: 9

OnClick event on React table row

Hello first question and beginner React user here. I followed this (React - Triggering click event on table row ) example to have an onClick event on a React table but the first issue is I receive a warning in Visual Studio Code that Uncaught ReferenceError: e is not defined. Any help would be appreciated.

Here's my code:

import React from 'react';
import './gridStyle.css';

class Grid extends React.Component {

    onClickHandler = () => {
        const song = e.target.getAttribute('data-item');
        console.log('We need to get the details for ', song);
    }

    renderResultRows(data) {
        return data.map((coord, index) =>
            // anon func maintains scope!
            // Pass in a function to our onClick, and make it anon
            // to maintain scope.  The function body can be anything
            // which will be executed on click only.  Our song value
            // is maintained via a closure so it works.
            (
                // eslint-disable-next-line react/no-array-index-key
                <tr key={index} data-item={coord} onClick={this.onClickHandler}>
                    <td data-title="cc">{coord.lat},{coord.lon}</td>
                    <td data-title="ic" />
                    <td data-title="dlat" />
                    <td data-title="dlon" />
                </tr>
            )); // no need to bind with anon function
    }

    render() {
        console.log('Coords passed in from Accuracy Calculator :', this.props.coords);
       return (
            <div className="grid">
                <table id="table0">
                    {this.renderResultRows(this.props.coords)}
                </table>
            </div>
        );
    }
}

export default Grid;

Upvotes: 0

Views: 11193

Answers (4)

ewef
ewef

Reputation: 57

You need to put e in your function

In your onClickHandler, add e in the parameter.

onClickHandler = (e) => {
   const song = e.target.getAttribute('data-item');
   console.log('We need to get the details for ', song);
    
}

I hope it fixes your issue

Upvotes: 1

Hemant Parashar
Hemant Parashar

Reputation: 3774

Since it's a click event, an event object is passed as an argument to the handler. Just define e (you can name it anything...e is just a convention) as an argument to be consumed in the function, so that you can access properties (like target) on it.

 onClickHandler = (e) => {
     const song = e.target.getAttribute('data-item');
     console.log('We need to get the details for ', song);
 }

Hope this helps !

Upvotes: 0

Tom Price
Tom Price

Reputation: 1

You'll need to change...

  onClickHandler = () => {
    const song = e.target.getAttribute('data-item');
    console.log('We need to get the details for ', song);
}

To

onClickHandler = (e) => {
    const song = e.target.getAttribute('data-item');
    console.log('We need to get the details for ', song);
}

To prevent the error which you are getting. You can read more about the event object here.

Upvotes: 0

sathish kumar
sathish kumar

Reputation: 1507

You did not pass the onClickHandler param as e, refer below code.


import React from 'react';
import './gridStyle.css';

class Grid extends React.Component {

    onClickHandler = (e) => {
        const song = e.target.getAttribute('data-item');
        console.log('We need to get the details for ', song);
    }

    renderResultRows(data) {
        return data.map((coord, index) =>
            // anon func maintains scope!
            // Pass in a function to our onClick, and make it anon
            // to maintain scope.  The function body can be anything
            // which will be executed on click only.  Our song value
            // is maintained via a closure so it works.
            (
                // eslint-disable-next-line react/no-array-index-key
                <tr key={index} data-item={coord} onClick={this.onClickHandler}>
                    <td data-title="cc">{coord.lat},{coord.lon}</td>
                    <td data-title="ic" />
                    <td data-title="dlat" />
                    <td data-title="dlon" />
                </tr>
            )); // no need to bind with anon function
    }

    render() {
        console.log('Coords passed in from Accuracy Calculator :', this.props.coords);
       return (
            <div className="grid">
                <table id="table0">
                    {this.renderResultRows(this.props.coords)}
                </table>
            </div>
        );
    }
}

export default Grid;

Upvotes: 0

Related Questions