Dfr*_*Dfr 5 javascript reactjs
我需要绘制一个大表,不是很大,大约400x400个单元格.但React渲染速度太慢,并且每次单击该单元格时,都应更新单元格,此更新需要相同的时间.有什么建议如何加快它?或者React不适合这样的任务?
这是一个示例(表的大小略有缩小):https: //jsfiddle.net/69z2wepo/15731/
var ROWSC = 400;
var COLSC = 100;
var Hello = React.createClass({
getInitialState: function () {
return {
t: { "1-1": 'c' }
};
},
clicked: function (k) {
var t = this.state.t;
t[k] = t[k] ? 0 : 'c';
this.setState({ t: t });
},
render: function() {
var items = [];
for (var r = 0; r < ROWSC; r++) {
var cols = [];
for (var c = 0; c < COLSC; c++) {
var k = ''+r+'-'+c;
cols.push(<td key={c} onClick={this.clicked.bind(this,k)} className={this.state.t[k]}> </td>);
}
items.push(<tr key={r}>{cols}</tr>);
}
return <table>
{items}
</table>
</div>;
}
});
React.render(<Hello name="World" />, document.getElementById('container'));
Run Code Online (Sandbox Code Playgroud)
默认情况下,React 会重新渲染所有内容,但在存在性能问题的情况下,可以使用该shouldComponentUpdate函数来确定更新时要排除组件树的哪些部分。
在您的示例中,一次只能更新一行,因此如果我们开始跟踪更新发生在哪一行,我们可以确保只更新这一行。首先,我们必须引入一个新组件来包装表格行,我们可以在其中放置钩子。
var Row = React.createClass({
shouldComponentUpdate: function(nextProps) {
return nextProps.mustUpdate;
},
render: function() {
return <tr>{this.props.children}</tr>;
}
});
Run Code Online (Sandbox Code Playgroud)
然后我们可以像这样使用它
items.push(
<Row key={r}
mustUpdate={this.state.lastUpdatedRow === r}>
{cols}
</Row>);
Run Code Online (Sandbox Code Playgroud)
此外,重新渲染所有这些单元格似乎也是一种浪费,因此我们可以引入另一个包装表格单元格的组件。
var Cell = React.createClass({
shouldComponentUpdate: function(nextProps) {
return this.props.selected !== nextProps.selected;
},
render: function() {
var props = this.props;
return (
<td onClick={props.onClick.bind(null, props.col, props.row)}
className={props.selected ? 'c' : ''}>
</td>
);
}
});
Run Code Online (Sandbox Code Playgroud)
这应该会给您带来更新性能的显着提高。如果它仍然不足以解决您的特定问题,则 React 可能不适合您的用例。无论如何,这就是优化 React 程序的本质,你将组件拆分成更小的组件,并确保只更新实际更改的部分。
| 归档时间: |
|
| 查看次数: |
2929 次 |
| 最近记录: |