面试

2022-04-01  本文已影响0人  kzc爱吃梨

1.React探索-diff算法

tree diff

component diff

当 component D 改变为 component G 时,即使这两个 component 结构相似,一旦 React 判断 D 和 G 是不同类型的组件,就不会比较二者的结构,而是直接删除 component D,重新创建 component G 以及其子节点。虽然当两个 component 是不同类型但结构相似时,React diff 会影响性能,但正如 React 官方博客所言:不同类型的 component 是很少存在相似 DOM tree 的机会,因此这种极端因素很难在实现开发过程中造成重大影响的。


component diff

element diff
当节点处于同一层级时,React diff 提供了三种节点操作,分别为:INSERT_MARKUP(插入)、MOVE_EXISTING(移动)和REMOVE_NODE(删除)。

新老集合所包含的节点,如下图所示,新老集合进行 diff 差异化对比,通过 key 发现新老集合中的节点都是相同的节点,因此无需进行节点删除和创建,只需要将老集合中节点的位置进行移动,更新为新集合中节点的位置,此时 React 给出的 diff 结果为:B、D 不做任何操作,A、C 进行移动操作,即可。


element diff

2. vue和react的diff算法的区别

  1. vue比对节点,当节点元素类型相同,但是className不同,认为是不同类型元素,删除重建,而react会认为是同类型节点,只是修改节点属性
  2. vue的列表比对,采用从两端到中间的比对方式,而react则采用从左到右依次比对的方式。当一个集合,只是把最后一个节点移动到了第一个,react会把前面的节点依次移动,而vue只会把最后一个节点移动到第一个。总体上,vue的对比方式更高效。

3.如何开启bfc,

[块级格式化上下文]它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。

3.vue中如何调用原生安卓或ios的方法

 const u = navigator.userAgent; 
 const isAndroid = u.indexOf("Android") > -1 || u.indexOf("Adr") > -1; 
 //android终端 
 const isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); 
 //ios终端 
 if (isAndroid) { 
        console.log("安卓")
        window.jsBridge.finis()  //安卓
    }
  else if (isiOS) {
         console.log("苹果")
         window.webkit.messageHandlers.finish.postMessage('') // 苹果
  }
上一篇 下一篇

猜你喜欢

热点阅读