在反应本机中更新状态需要很长时间
Updating state in react-native taking forever
我添加了"喜欢"帖子的功能。突然间,反应原生正在以蜗牛的速度爬行。我是新手,所以不确定何时何地正确设置状态。
我应该如何在列表视图表中正确附加喜欢行的功能?
这是代码...
要点击的"喜欢"文本是这样的。
<Text onPress={this.likePost.bind(this, feeditem.post_id)}>{feeditem.likes} likes</Text>
那么"喜欢"功能就是这个...
likePost(id){
if(this.state.feedData!=null){
var d = this.state.feedData;
// Find row by post_id
var ix = d.findIndex(x => x.post_id===id);
// Only set state if user hasn't already liked
if(d[ix].you_liked==0){
// Mark as liked, and increment
d[ix].you_liked=true;
d[ix].likes = parseInt(d[ix].likes)++;
// Set the state after liking
this.setState({
feedData: d,
feedList: this.state.feedList.cloneWithRows(d)
});
}
}
}
它可以工作,并且可以正确更新数据,并且可以很好地显示在开发工具中。 但是,新状态的视觉渲染需要一分钟多的时间。
我更新的状态有误吗?设置状态的成本是多少?我认为 react 应该只是重新渲染它在虚拟 DOM 中看到的变化。 那么为什么它看起来像是重新渲染我的整个列表视图。 为什么加载时间超过 1 分钟?(某处明显的内存泄漏)??
另外,是否可以在不触发重新渲染的情况下仅增加"DOM"上的整数?
渲染你的ListView
传递dataSource
和renderRow
道具
render() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this._renderRow}/>
);
}
创建renderRow
函数,您可以在其中访问点击行的数据和索引
_renderRow = (rowData, sectionIndex, rowIndex, highlightRow) => {
return (
<TouchableOpacity onPress={() => {
//Here you shoud update state
}}/>
);
};
此外,在操作状态之前,您始终需要复制状态,因为它是不可变的对象。尝试使用状态变异库,使用 https://facebook.github.io/react/docs/update.html 或其他选项。
由于 chrome 调试器,动画可能需要很长时间。缓解此问题的一个小方法是使用InteractionManager
likePost(id){
InteractionManager.runAfterInteractions(() => {
if(this.state.feedData!=null){
var d = this.state.feedData;
// Find row by post_id
var ix = d.findIndex(x => x.post_id===id);
// Only set state if user hasn't already liked
if(d[ix].you_liked==0){
// Mark as liked, and increment
d[ix].you_liked=true;
d[ix].likes = parseInt(d[ix].likes)++;
// Set the state after liking
this.setState({
feedData: d,
feedList: this.state.feedList.cloneWithRows(d)
});
}
}
});
}
或者禁用 chrome 调试并使用 android 监视器查看调试消息。
相关文章:
- 为什么我的上下文选择器和.buttonset()在ie中花费了这么长时间
- 谷歌地图需要很长时间才能在ie11中渲染
- 有没有一种方法可以检查javascript以毫秒为单位执行一个函数需要多长时间
- 我一直收到的控制台警告是什么?推迟长时间运行的计时器任务以提高滚动的流畅性
- 为什么这个代码不起作用?我花了很长时间试图弄清楚这一点
- 如何在长时间执行JavaScript期间显示微调器
- 长时间轮询:每个浏览器中的通知
- 完整日历:如何支持一次点击和不长时间点击
- 如何使用 javascript 停止对 asp.net 进行正在进行的回发(长时间运行的执行)
- 为什么这个 AJAX 调用需要这么长时间
- 为什么这个正则表达式需要这么长时间才能执行
- 如何修复长时间运行的脚本
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- javascript秒表限制最长时间
- 长时间运行的脚本IE与Chrome/Firefox
- 有没有一种方法可以在长时间运行的JavaScript操作之前强制回流
- 我的无引用 JavaScript 对象存在在哪里以及存在多长时间
- 为什么chromecast在动画帧之间需要这么长时间
- 在反应本机中更新状态需要很长时间
- $_POST 变量保持活动状态多长时间,PHP 如何决定 post 数组中的内容