jYh1014 / jYh1014.github.io

1 stars 0 forks source link

react 15版本面试题 #1

Open jYh1014 opened 3 years ago

jYh1014 commented 3 years ago

react相关(15版本)

1.什么是react元素?

元素是构成react项目的最小单位,是用jsx语法来声明react元素的,与浏览器的dom元素不同,这些react元素,将来会被babel经过编译的,经过编译后(其实就是React.createElement方法的一个语法糖)返回的其实就是一个普通对象(也就是虚拟dom)

<div>reactdemo</div>

上面代码会被编译成

React.createElement("div", null, "reactdemo")

2.什么是虚拟dom?

虚拟dom本质上就是一个普通对象,是真实dom节点的抽象描述,将来会作为参数传入render方法,render方法会讲虚拟dom生成真实的dom节点插入到页面中。 虚拟dom的优点:如果没有虚拟dom的存在,我们以前都是操作真实的dom来达到视图的更新,这样对浏览器性能会造成很大影响。但是有了虚拟dom之后,我们只需要对这个对象做一些操作来达到视图更新的效果,具体的操作就是dom diff。

3.什么是合成事件?

合成事件其实就是模拟原生事件(window. addEventListener),只不过在react里,他自己实现了一套逻辑,主要是对各种浏览器的兼容性做了处理,并且,合成事件和异步操作也有关系,它维护着isBatchingUpdate这个属性值,在组件更新的时候会和这个属性值的判断有很大关系。 原理:

4.setState都发生了什么

5.函数组件

6.refs

9.render props

9.domdiff

性能优化

class PureComponent extends Component{
    shouldComponentUpdate(nextProps,nextState){
        console.log(nextProps===this.props)
        if(!shallowEqual(this.props,nextProps)){
            return true
        }
        return false
    }
}
function shallowEqual(obj1, obj2) {
    if (obj1 === obj2) {
      return true
    }
    // debugger
    let noObj1 = typeof obj1 !== 'object' || obj1 === null
    let noObj2 = typeof obj2 !== 'object' || obj2 === null
    if (noObj1 || noObj2) {
      return false
    }
    let keys1 = Object.keys(obj1)
    let keys2 = Object.keys(obj2)
    if (keys1.length !== keys2.length) {
      return false
    }
    for (const key of keys1) {
      let equalKey = obj1[key] === obj2[key]
      if (!obj2.hasOwnProperty(key) || !equalKey) {
        return false
      }
    }
    return true
  }