// react会将DemoComponent组件直接挂载在真实的 dom 节点 domNode 上,生命周期还和16版本之前相同。
return ReactDOM.createPortal(
<DemoComponent />,
domNode,
);
}
复制代码
19. 在React中如何避免不须要的render?
React 基于虚拟 DOM 和高效 Diff 算法的完美配合,实现了对 DOM 最小粒度的更新。大多数情况下,React 对 DOM 的渲染效率足以业务日常。但在个别复杂业务场景下,性能题目依然会困扰我们。此时需要采取一些步伐来提升运行性能,其很重要的一个方向,就是避免不须要的渲染(Render)。这里提下优化的点:
当项目越来越大的时候,管理数据的事件或回调函数将越来越多,也将越来越不好管理。管理不断变化的 state 非常困难。如果一个 model 的变化会引起另一个 model 变化,那么当 view 变化时,就大概引起对应 model 以及另一个 model 的变化,依次地,大概会引起另一个 view 的变化。直至你搞不清楚到底发生了什么。state 在什么时候,由于什么原因,如何变化已然不受控制。 当体系变得错综复杂的时候,想重现题目或者添加新功能就会变得举步维艰。如果这还不够糟糕,考虑一些来自前端开发范畴的新需求,如更新调优、服务端渲染、路由跳转前哀求数据等。state 的管理在大项目中相称复杂。
Redux 提供了一个叫 store 的统一仓储库,组件通过 dispatch 将 state 直接传入store,不用通过其他的组件。而且组件通过 subscribe 从 store获取到 state 的改变。使用了 Redux,全部的组件都可以从 store 中获取到所需的 state,他们也能从store 获取到 state 的改变。这比组件之间相互转达数据清晰明朗的多。
随着 JavaScript 单页应用开发日趋复杂,JavaScript 需要管理比任何时候都要多的 state (状态)。 这些 state 大概包括服务器响应、缓存数据、本地生成尚未持久化到服务器的数据,也包括 UI状态,如激活的路由,被选中的标签,是否显示加载动效或者分页器等等。
管理不断变化的 state 非常困难。如果一个 model 的变化会引起另一个 model 变化,那么当 view 变化时,就大概引起对应 model 以及另一个model 的变化,依次地,大概会引起另一个 view 的变化。直至你搞不清楚到底发生了什么。state 在什么时候,由于什么原因,如何变化已然不受控制。 当体系变得错综复杂的时候,想重现题目或者添加新功能就会变得举步维艰。
虚拟DOM相对原生的DOM不一定是效率更高,如果只修改一个按钮的文案,那么虚拟 DOM 的操作无论如何都不大概比真实的 DOM 操作更快。在首次渲染大量DOM时,由于多了一层虚拟DOM的盘算,虚拟DOM也会比innerHTML插入慢。它能保证性能下限,在真实DOM操作的时候进行针对性的优化时,还是更快的。所以要根据具体的场景进行探究。
在整个 DOM 操作的演化过程中,实在主要矛盾并不在于性能,而在于开发者写得爽不爽,在于研发体验/研发效率。虚拟 DOM 不是别的,正是前端开发们为了寻求更好的研发体验和研发效率而创造出来的高阶产物。虚拟 DOM 并不一定会带来更好的性能,React 官方也从来没有把虚拟 DOM 作为性能层面的卖点对外输出过。虚拟 DOM 的优越之处在于,它可以大概在提供更爽、更高效的研发模式(也就是函数式的 UI 编程方式)的同时,仍然保持一个还不错的性能。
5. React 与 Vue 的 diff 算法有何不同?
真实页面临应一个 DOM 树。在传统页面的开发模式中,每次需要更新页面时,都要手动操作 DOM 来进行更新。 DOM 操作非常昂贵。在前端开发中,性能消耗最大的就是 DOM 操作,而且这部分代码会让整体项目标代码变得难 以维护。React 把真实 DOM 树转换成 JavaScript 对象树,也就是 Virtual DOM,每次数据更新后,重新盘算 Virtual DOM,并和上一次生成的 Virtual DOM 做对比,对发生变化的部分做批量更新。React 也提供了直观的 shouldComponentUpdate 生命周期回调,来淘汰数据变化后不须要的 Virtual DOM 对比过程,以保证性能。
history API:History API 的 pushState 函数可以给汗青记录关联一个任意的可序列化 state,所以可以在路由 push 的时候将当前页面的一些信息存到 state 中,下次返回到这个页面的时候就能从 state 内里取出离开前的数据重新渲染。react-router 直接可以支持。这个方法得当一些需要临时存储的场景。
async/await是ES7标准中的新特性。如果是使用React官方的脚手架创建的项目,就可以直接使用。如果是在自己搭建的webpack配置的项目中使用,大概会遇到 regeneratorRuntime is not defined 的非常错误。那么我们就需要引入babel,并在babel中配置使用async/await。可以利用babel的 transform-async-to-module-method 插件来转换其成为浏览器支持的语法,固然没有性能的提升,但对于代码编写体验要更好。
18. React.Children.map和js的map有什么区别?