I have the following code. When changing the value of one element, the entire list is re-render. How can it be avoided by redrawing only one element? I use setState and class components.
import React from "react";
import "./styles.css";
class ListItem extends React.Component {
handleUpdate = () => {
this.props.onUpdate(this.props.index);
};
totalRenders = 0;
render() {
const { data: { id, value } } = this.props;
this.totalRenders += 1;
console.log("Row rendered");
return (
<div>
<strong>id: </strong>{id}:
<strong>value: </strong>{value}
<strong>renders count: </strong>{this.totalRenders}
<button className="button" onClick={this.handleUpdate}>
Change row value
</button>
</div>
);
}
}
export default class App extends React.Component {
state = { list: [{id: 'id 1', value: '11'}, {id: 'id 2', value: '22'}]};
handleUpdate = (index) => {
let newState = this.state.list.slice()
newState[index].value = Math.round(Math.random() + 10);
this.setState(() => ({
list: newState
}));
};
render() {
console.log("App rendered");
return (
<div>
{this.state.list.map((el, index) => (
<ListItem
key={el.id}
data={el}
index={index}
onUpdate={this.handleUpdate}
/>
))}
</div>
);
}
}
Sandbox: https://codesandbox.io/s/autumn-architecture-ubgh51?file=/src/App.js