Button ponent which renders a button based on prop dataSrc send by parent App.
export default class Button extends React.Component {
constructor(props) {
super(props);
}
render(){
return(
<div>
{this.props.dataSrc.map((element, index) => {
return <button
key={index}
className={`btn btn-default ${element.class} ${element.secondary ? "btn-secondary" : ""}`}
type="button"
disabled={element.disabled}>
{element.label}
</button>
})}
</div>
);
}
}
Parent ponent App sends dataSrc to Button.
class App extends React.Component {
constructor(props) {
super(props);
}
render(){
const btnSrc = [
{
"label":"Save",
"class":"user_information_save",
"disabled":false
},
{
"label":"Cancel",
"class":"userCancel",
"disabled":false
}
]
return <Button dataSrc={btnSrc} />
}
}
Now everything is fine. Here es the scenario, the btnSrc in App(parent) ponent will be look alike:
const btnSrc = [
{
"label":"Save",
"class":"user_information_save",
"disabled":false
},
{
"label":"Cancel",
"class":"userCancel",
"disabled":false,
"data-id": "someID", // this will be dynamic
"name": "someName" // this will be dynamic
"onClick": this.someFunctionaName // this will be dynamic
}
]
Now the src is changed, but little confused in Button ponent to render those dynamic data added recently.
export default class Button extends React.Component {
constructor(props) {
super(props);
}
render(){
return(
<div>
{this.props.dataSrc.map((element, index) => {
return <button
key={index}
className={`btn btn-default ${element.class} ${element.secondary ? "btn-secondary" : ""}`}
type="button"
disabled={element.disabled}
//here i want to have those dynamic data "data-id": "someID", "name": "someName" here
// and i want to add onClick also here which will be loaded from btnSrc
>
{element.label}
</button>
})}
</div>
);
}
}
How can i add those dynamic custom object values to existing Button ponent and I do not know how to bind events to in .map too. Code Demo
Any help would be helpful.
Button ponent which renders a button based on prop dataSrc send by parent App.
export default class Button extends React.Component {
constructor(props) {
super(props);
}
render(){
return(
<div>
{this.props.dataSrc.map((element, index) => {
return <button
key={index}
className={`btn btn-default ${element.class} ${element.secondary ? "btn-secondary" : ""}`}
type="button"
disabled={element.disabled}>
{element.label}
</button>
})}
</div>
);
}
}
Parent ponent App sends dataSrc to Button.
class App extends React.Component {
constructor(props) {
super(props);
}
render(){
const btnSrc = [
{
"label":"Save",
"class":"user_information_save",
"disabled":false
},
{
"label":"Cancel",
"class":"userCancel",
"disabled":false
}
]
return <Button dataSrc={btnSrc} />
}
}
Now everything is fine. Here es the scenario, the btnSrc in App(parent) ponent will be look alike:
const btnSrc = [
{
"label":"Save",
"class":"user_information_save",
"disabled":false
},
{
"label":"Cancel",
"class":"userCancel",
"disabled":false,
"data-id": "someID", // this will be dynamic
"name": "someName" // this will be dynamic
"onClick": this.someFunctionaName // this will be dynamic
}
]
Now the src is changed, but little confused in Button ponent to render those dynamic data added recently.
export default class Button extends React.Component {
constructor(props) {
super(props);
}
render(){
return(
<div>
{this.props.dataSrc.map((element, index) => {
return <button
key={index}
className={`btn btn-default ${element.class} ${element.secondary ? "btn-secondary" : ""}`}
type="button"
disabled={element.disabled}
//here i want to have those dynamic data "data-id": "someID", "name": "someName" here
// and i want to add onClick also here which will be loaded from btnSrc
>
{element.label}
</button>
})}
</div>
);
}
}
How can i add those dynamic custom object values to existing Button ponent and I do not know how to bind events to in .map too. Code Demo
Any help would be helpful.
Share Improve this question edited Mar 15, 2018 at 9:31 Mayank Shukla 105k19 gold badges162 silver badges145 bronze badges asked Mar 15, 2018 at 7:25 JayavelJayavel 3,4072 gold badges25 silver badges37 bronze badges 1- This is just a guess, but maybe your key property is not good here as it will have the same value when data changed. It just represents the position inside of the map but does not relate to the entry. Also, i am not sure but maybe you need change ponent state to trigger rerendering. – Andre Albert Commented Mar 15, 2018 at 7:39
1 Answer
Reset to default 5I think, there are two solutions possible:
1- Use Spread syntax ...
, and pass put all the passed values on button, by this was you don't need define each property separately. Like this:
return <button
key={index}
className={`btn btn-default ${element.class} ${element.secondary ? "btn-secondary" : ""}`}
type="button"
{...element}
>
{element.label}
</button>
Now if you pass onClick then only it will be assigned otherwise not.
2- Use destructuring and assign the default value if not passed from the parent.
Like this:
{this.props.dataSrc.map((element, index) => {
const {onClick=null, dataGrid=''} = element;
return <button
key={index}
className={`btn btn-default ${element.class} ${element.secondary ? "btn-secondary" : ""}`}
type="button"
disabled={element.disabled}
onClick={onClick}
data-grid={dataGrid}
>
{element.label}
</button>
})}
Working Example.