How to use onClick with divs in React.js

171,818

Solution 1

This works

var Box = React.createClass({
    getInitialState: function() {
        return {
            color: 'white'
        };
    },

    changeColor: function() {
        var newColor = this.state.color == 'white' ? 'black' : 'white';
        this.setState({ color: newColor });
    },

    render: function() {
        return (
            <div>
                <div
                    className='box'
                    style={{background:this.state.color}}
                    onClick={this.changeColor}
                >
                    In here already
                </div>
            </div>
        );
    }
});

ReactDOM.render(<Box />, document.getElementById('div1'));
ReactDOM.render(<Box />, document.getElementById('div2'));
ReactDOM.render(<Box />, document.getElementById('div3'));

and in your css, delete the styles you have and put this

.box {
  width: 200px;
  height: 200px;
  border: 1px solid black;
  float: left;
}

You have to style the actual div you are calling onClick on. Give the div a className and then style it. Also remember to remove this block where you are rendering App into the dom, App is not defined

ReactDOM.render(<App />,document.getElementById('root'));

Solution 2

For future googlers (thousands have now googled this question):

To set your mind at ease, the onClick event does work with divs in react, so double-check your code syntax.

These are right:

<div onClick={doThis}>
<div onClick={() => doThis()}>

These are wrong:

<div onClick={doThis()}>
<div onClick={() => doThis}>

(and don't forget to close your tags... Watch for this:

<div onClick={doThis}

missing closing tag on the div)

Solution 3

The Following code works now !!!

const test = () => {
const onClick = () => console.log('hi');

return (
<div onClick={onClick} aria-hidden="true">
  Content here
</div>
)};

Solution 4

Your box doesn't have a size. If you set the width and height, it works just fine:

var Box = React.createClass({
    getInitialState: function() {
        return {
            color: 'black'
        };
    },

    changeColor: function() {
        var newColor = this.state.color == 'white' ? 'black' : 'white';
        this.setState({
            color: newColor
        });
    },

    render: function() {
        return (
            <div>
                <div
                    style = {{
                        background: this.state.color,
                        width: 100,
                        height: 100
                    }}
                    onClick = {this.changeColor}
                >
                </div>
            </div>
        );
    }
});

ReactDOM.render(
  <Box />,
  document.getElementById('box')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id='box'></div>

Solution 5

Whilst this can be done with react, be aware that using onClicks with divs (instead of Buttons or Anchors, and others which already have behaviours for click events) is bad practice and should be avoided whenever it can be.

Share:
171,818
Leia_Organa
Author by

Leia_Organa

Junior Software developer at an IT company. Languages: HTML, CSS, Ruby on Rails, JavaScript, Java

Updated on July 08, 2022

Comments

  • Leia_Organa
    Leia_Organa almost 2 years

    I'm making a very simple application where you can click on square divs to change their color from white to black. However, I'm having trouble. I'd like to use the onClick function to allow a user to click on a square to change its color, but it doesn't seem to be working. I've tried using spans and empty p tags, but that doesn't work either.

    Here is the code in question:

    var Box = React.createClass({
        getInitialState: function() {
            return {
                color: 'white'
            };
        },
    
        changeColor: function() {
            var newColor = this.state.color == 'white' ? 'black' : 'white';
            this.setState({
                color: newColor
            });
        },
    
        render: function() {
            return (
                <div>
                    <div
                        style = {{background: this.state.color}}
                        onClick = {this.changeColor}
                    >
                    </div>
                </div>
            );
        }
    });
    

    Here's a link to my small project on CodePen. http://codepen.io/anfperez/pen/RorKge

  • Leia_Organa
    Leia_Organa over 7 years
    Thanks Timo, but the code doesn't seem to work when I try to use it in my CodePen snippet. Is that because I also have a width and height specified in my CSS file? I edited it with your code, but it still doesn't work.
  • TimoStaudinger
    TimoStaudinger over 7 years
    How does it not work? The snippet in my answer works just fine.
  • Leia_Organa
    Leia_Organa over 7 years
    Thank you! It was styling the box that was tripping me up a bit. That definitely works!
  • Juhil Somaiya
    Juhil Somaiya about 4 years
    How this is related to the question ?