React 16 已经发布了,其中一个很有趣的是添加了 “Portals”。
Portals 可以让你在父组件外渲染 react 受控 DOM 节点。react doc 也使用了一个模态框的例子很好地解释了它。用也做 tooltips 也很合适(这是我早前做的一个例子)。
但这些都并不是很有趣,让我们做一些更不可思议的事情…
许多网站和应用程序都有很多脚本来执行。您的 JavaScript 通常需要尽快运行,但同时您不希望它阻碍用户那条路。如果您在用户滚动页面时发送分析数据,或者在轻触按钮时将元素附加到 DOM,则您的 Web 应用程序将无法响应,从而导致用户体验不佳。
好消息是,现在有一个 API 可以帮助:requestIdleCallback
。以同样的方式,requestAnimationFrame
我们可以正确地安排动画,并最大限度地提高 60fps 的机会,requestIdleCallback
当一个框架结束时,或当用户处于非活动状态时,可以安排工作。这意味着有机会在用户不使用的情况下进行工作。它可用于 Chrome 47!这是一个实验性的功能,规格还在不断变化,所以将来会发生变化。
假设你想追踪 DOM 里的一个元素是否进入 viewport 的可视区。你做这件事可能是因为你想在这个时机 lazyload 图片或者你需要知道用户是否真的在看一个某个广告横幅。你可以通过添加 scroll
事件钩子或使用定时器去调用元素的 getBoundingClientRect()
方法。然而,这种方法真的很慢,因为每次调用 getBoundingClientRect()
会造成浏览器 re-layout 当前页面 并会在你的页面造成很大的卡顿和闪烁。 iframe
里的元素是否可见这样的事情几乎很难做到。 基于单一源模型,浏览器不会让你访问包含 iframe
的页面的任何数据。这是频繁使用 iframe
加载广告的常见问题。
为了让可见度测试更有效率, IntersectionObserver 被设计出来了。IntersectionObserver
让你知道观察的元素何时进入或退出浏览器 viewport
。