Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
55
rated 0 times [  61] [ 6]  / answers: 1 / hits: 15959  / 8 Years ago, fri, may 20, 2016, 12:00:00

I'm really new to React, and I'm pulling my hair out trying to solve what seems to me to be a simple problem. Here's a picture of the component I've built.



Color Picking Component



What I'm trying to accomplish seems trivial, but literally every article I've read explaining what to do has told me something different, and not one of the solutions has worked. It breaks down to this: When a user clicks on a tag, it builds out a tray and loops through an array of colors to build color buttons. When a color button is clicked it needs to pass which color was clicked to its parent component and run a function to update its color. I've read about flux, event bubbling, binding this to a property, and none of those solutions has seemed to work. The React docs are basically useless for a newbie like myself. I want to avoid complicated event structures like flux at this point since I'm appending some simple components to an existing app that I didn't write in React originally.



Also, PS, This code is in JSX which makes much more sense to me than straight JS react. Thanks in advance for your help!



var colorsArray = [#ED5851, #9CCC64, #337AEC, #ff7a45, #7E58C2, #FFEB3B, #78909C, #FFFFFF, #213a4b];

var EditDrawer = React.createClass({
updateColor: function() {
console.log(New Color: + i);
},
render: function(){
var passTarget = this;
return (
<div className=container-fluid animated fadeIn extra-fast-animation tag-edit-drawer>
<div className=row>
<div className=col-xs-12>
{colorsArray.map(function(object, i){
return <ColorButton buttonColor={object} key={i} />;
})}
</div>
</div>
</div>
);
}
})

var ColorButton = React.createClass({
render: function(){
var buttonStyle = {
backgroundColor: this.props.buttonColor,
};
return (
<div className=tag-edit-color-button style={buttonStyle} >
</div>
)
}
})

More From » reactjs

 Answers
181

The callback function should work. As you've mentioned in your previous comment you can use your captured this to access the updateColor function from the child:



var passTarget = this;
...
...
return <ColorButton
buttonColor={object}
key={i}
update={passTarget.updateColor} />


Or as Bogdan mentioned you can pass it through map after your callback function:



{colorsArray.map(function(object, i){
return <ColorButton
buttonColor={object}
key={i}
update={this.updateColor} />;
}, this)}


Your <ColorButton /> component should then be able to run a simple onClick function:



onClick={this.props.update}


And then you can simply make use of normal event targets in the parent component to capture the color of the button that was clicked:



updateColor: function(e) {
console.log(e.target.style.backgroundColor);
}


Here is a full DEMO to demonstrate.


[#62084] Thursday, May 19, 2016, 8 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
travion

Total Points: 137
Total Questions: 96
Total Answers: 103

Location: India
Member since Wed, Aug 4, 2021
3 Years ago
travion questions
Mon, Dec 16, 19, 00:00, 5 Years ago
Sat, Oct 19, 19, 00:00, 5 Years ago
Fri, Sep 20, 19, 00:00, 5 Years ago
Wed, Nov 14, 18, 00:00, 6 Years ago
Sun, Oct 28, 18, 00:00, 6 Years ago
;