【问题标题】:react.js - Render on requestAnimationFramereact.js - 在 requestAnimationFrame 上渲染
【发布时间】:2015-03-08 18:28:26
【问题描述】:

我想在我的应用中试验一些 React 组件的性能。我知道 ClojureScript 的 Om 框架 (https://github.com/swannodette/om) 使用了一些优化技术,例如使用不可变对象实现 shouldComponentUpdate() 并在 requestAnimationFrame 更改时呈现。

是否有可以引入基于requestAnimationFrame 的渲染的纯JavaScript mixin?

【问题讨论】:

    标签: javascript render reactjs requestanimationframe react-jsx


    【解决方案1】:

    如果您使用 Browserifywebpack 之类的东西从 CommonJS 环境构建 React,或者以其他方式生成 React 的自定义构建,这是可能的。也就是说,如果你只使用可下载的、预构建的 React,你不能做到这一点。

    查看 Pete Hunt 的 react-raf-batching project 以获得更全面的解决方案(包括 rAF polyfills),但这里有一个最小的示例来实现此功能:

    var ReactUpdates = require("react/lib/ReactUpdates");
    
    var rafBatchingStrategy = {
      isBatchingUpdates: true,
      batchedUpdates: function(callback, param) {
        callback(param);
      }
    };
    
    var tick = function() {
      ReactUpdates.flushBatchedUpdates();
      requestAnimationFrame(tick);
    };
    
    requestAnimationFrame(tick);
    
    ReactUpdates.injection.injectBatchingStrategy(rafBatchingStrategy);
    

    【讨论】:

    • 请注意,您可能需要处理一些(可解决的)极端情况:github.com/petehunt/react-raf-batching/issues/8
    • 在撰写此评论时,npm install react-raf-batching 需要 react 0.9 的对等,当前版本为 0.14.5,因此不再是快速安装。我还没有尝试过是否只需要微调或更多相关内容。