gpt4 book ai didi

javascript - ReactJS 中的非阻塞渲染

转载 作者:数据小太阳 更新时间:2023-10-29 05:21:51 26 4
gpt4 key购买 nike

我正在学习 ReactJS 并尝试在其上构建一些应用程序。

当我尝试修改我的状态和渲染时,我的页面卡住并且在我的组件变得巨大时渲染完成之前无法执行任何操作。

我发现我可以使用 shouldComponentUpdate 来优化我的代码,但我的问题是:我可以使这个渲染过程成为非阻塞的吗?因此我可以告诉用户该页面正在处理一些重载执行,请稍候或者显示执行进度?或者如果用户可以取消渲染,例如,对于实时编辑器,如果用户编辑编辑器的内容,“预览”部分将停止渲染旧内容并尝试渲染新内容而不阻塞编辑器 UI?

这是重载示例代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>React Tutorial</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.1/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.1/react-dom.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
</head>
<body>
<div id="content"></div>
<script type="text/babel">
var Box = React.createClass({
render: function() {
return (
<div>Box</div>
);
}
});

var CommentBox = React.createClass({
getInitialState: function() {
return {box_count: 5};
},

heavyLoadRender: function() {
this.setState({box_count: 40000});
},

render: function() {
var render_box = [];
for (var i=0; i<this.state.box_count; i++) {
render_box.push(<Box />);
}
return (
<div>
{render_box}
<button onClick={this.heavyLoadRender}>Start</button>
</div>
);
}
});

ReactDOM.render(
<CommentBox />,
document.getElementById('content')
);
</script>
</body>
</html>

当我按下 Start 时,页面将卡住并且在呈现所有 Box 之前没有响应。是否可以添加一个名为 Cancel 的按钮,用户可以取消渲染并清除所有框?

最佳答案

这是一个很好的问题,也是 setTimeout 的完美用例,它可以将更新安排到下一轮事件循环。

与其存储要渲染的组件数量,不如存储一个组件数组,然后直接渲染它们。 <强> jsfiddle

 var CommentBox = React.createClass({
getInitialState: function() {
return { boxes: [<Box key="first" />] };
},

heavyLoadRender: function() {
setTimeout(() => {
if (this.state.boxes.length < 50000) {
this.setState({
boxes: this.state.boxes.concat(<Box key={this.state.boxes.length} />)
})
this.heavyLoadRender()
}
})
},

render: function() {
return (
<div>
<button onClick={this.heavyLoadRender}>Start</button>
{this.state.boxes}
</div>
)
}
})

更新:

如果您只想在数组填满后显示状态,则在达到该大小之前不要显示任何内容:

这没有用:

{ this.state.boxes.length === 50000 && this.state.boxes }

但希望并没有消失!使用风格!

<div style={{ display: this.state.boxes.length === 50000 ? 'block' : 'none' }}>
{ this.state.boxes }
</div>

如果你想提高速度,你可以在每个setTimeout

中推送多个项目

var newBoxes = []
for (var i = 0; i < 5; i++) {
newBoxes.push(<Box />)
}
this.setState({
boxes: this.state.boxes.concat(newBoxes)
})

updated fiddle .我认为这整类问题都需要时间来解决。在 10,000 个批处理中,基本的盒子组件不会阻塞,您可以轻松地在上面放置一个加载微调器。

关于javascript - ReactJS 中的非阻塞渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36708734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com