首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么ReactJS不像原始JS那样简单、愚蠢地证明概念?

为什么ReactJS不像原始JS那样简单、愚蠢地证明概念?
EN

Stack Overflow用户
提问于 2015-08-20 19:17:42
回答 1查看 329关注 0票数 0

几年前,我听说了一个不错的404页和实现了一个副本

在使用ReactJS时,同样的想法是打算实现的,但是它的动作缓慢而不稳定,过了一段时间,Chrome给它一个“无响应的脚本”警告,该警告指向第1226行,"var position = index % repeated_tokens.length;",在连续调用之间有几百毫秒的延迟。脚本不断地超越一个没有响应的页面,让一台计算机屈服。

显然,它们不是相同的实现,尽管ReactJS版本是从"I not not‘re“版本派生出来的。但除此之外,它为什么会陷入困境?我是不是做了一堆很深的闭包?为什么ReactJS端口裸JavaScript原版

在这两种情况下,工作都是由次要的算术驱动的,并且没有什么特别有趣的代码或它正在做的事情。

-更新--

我看到我被否决了三票.

这似乎得到了一些人的回应,他们(a)说了一些明智的话,(b)反驳了皮特·亨特( Pete )和其他人的说法。

亨特和Facebook的ReactJS视频宣称,合成DOM的速度非常快,足以在非JIT iPhone上以每秒60帧的速度运行。他们留下了一个优化钩子,可以说“在快速比较中忽略DOM的这一部分”,我在其他地方使用它来拒绝对非ReactJS小部件的管辖权。

@EdBallot的建议是,“创建和呈现一个元素,并完成一个document.getElementById,这是一项极端(且不必要的)工作。现在,我将最后一点考虑在内;DOM操作很慢。但这里的反应很难与Facebook关于表演家ReactJS的说法相一致。这里有一种”你想做的事情;我们会做出更多“的态度,(理论上)扔掉DOM,做出一个新的DOM,这是闪电--因为它是在记忆中完成的,而不需要与真正的DOM对话。

在很多情况下,我想要一些更外科的东西,并且可以尝试改变尽可能小的区域,但是我看到的ReactJS视频的文字和精神完全符合“缩窄你想要的,我们会做更多”的精神。

去试着建议编辑看看他们会做什么.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-21 01:56:50

我没有看过所有的代码,但首先,这是相当低效的。

代码语言:javascript
运行
复制
var update = function() {
  React.render(React.createElement(Pragmatometer, null),
    document.getElementById('main'));
  for(var instance in CKEDITOR.instances) {
    CKEDITOR.instances[instance].updateElement();
  }
  save('Scratchpad', document.getElementById('scratchpad').value);
};
var update_interval = setInterval(update, 100);

它是做了一个极端(和不必要的)工作量和它是做每100毫秒。除其他外,它呼吁:

  • React.createElement
  • React.render
  • document.getElementById

随着创建和释放JS对象的数量,您的update函数加上垃圾收集所花费的时间可能会超过100 is,从而有效地降低了计算机的运行速度。

至少,我建议在间隔回调之外尽可能多地缓存。也不需要多次调用React.render。将其呈现到dom中后,使用setPropsforceUpdate使其呈现更改。

下面是我的一个例子:

代码语言:javascript
运行
复制
var mainComponent = React.createElement(Pragmatometer, null);
React.render(mainComponent,
  document.getElementById('main'));

var update = function() {
  mainComponent.forceUpdate();
  for(var instance in CKEDITOR.instances) {
    CKEDITOR.instances[instance].updateElement();
  }
  save('Scratchpad', document.getElementById('scratchpad').value);
};
var update_interval = setInterval(update, 100);

除此之外,我还建议将setInterval代码移到任何React组件正在呈现的东西中( Scratchpad组件?)。

最后一条评论:使用setInterval的缺点之一是,它不会等到回调函数完成后再排队等待下一个回调。另一种方法是在回调设置下一个setTimeout时使用setTimeout,如下所示

代码语言:javascript
运行
复制
var update = function() {
  // do some stuff

  // update is done to setup the next timeout
  setTimeout(update, 100);
};
setTimeout(update, 100);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32126566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档