React面试题目-(持续更新)

189 阅读3分钟
  1. Redux的实现流程

    用户页面行为触发一个Action,然后,Store 自动调用 Reducer,并且传入两个参数:当前 State 和收到的 Action。Reducer 会返回新的 State 。每当state更新之后,view会根据state触发重新渲染。

  2. react-redux的实现原理

    Redux作为一个通用模块,主要还是用来处理应用中state的变更,通过react-redux做连接,可以在React+Redux的项目中将两者结合的更好。

    react-redux是一个轻量级的封装库,它主要通过两个核心方法实现:

    • Provider:从最外部封装了整个应用,并向connect模块传递store。
    • Connect:
        1. 包装原组件,将state和action通过props的方式传入到原组件内部。
        1. 监听store tree变化,使其包装的原组件可以响应state变化

    redux中间件的理解,以及用过哪些中间件

    理解:中间件就是要对redux的store.dispatch方法做一些改造,以实现其他的功能。

    我用过redux-thunk,就拿它举例。

    背景:Redux 的基本做法,是用户发出 Action,Reducer 函数立刻算出新的 State,View 重新渲染,但这是做同步。 而如果有异步请求时,那就不能知道什么时候获取的数据有存进store里面,因此此时需要在请求成功时返回一个标识或状态,并在此时再触发action给reducer传值。

    因此,为了解决异步的问题,就引入了中间件的概念。

    作用: redux-thunk 帮助你统一了异步和同步 action 的调用方式,把异步过程放在 action 级别解决,对 component 调用没有影响。

  3. react性能优化。

    • 使用无状态组件(函数组件,无state,只有props)。

    • React.memo(), 和 PureComponent 很相似,它帮助我们控制何时重新渲染组件.

      const ToBeBetterComponent = React.memo(function MyComponent(props) {
          // only renders if props have changed
      }) 
      
    • PureComponent(纯组件)

      PureComponent原理

      当组件更新时,如果组件的 props 和 state 都没发生改变, render 方法就不会触发,省去 Virtual DOM 的生成和比对过程,达到提升性能的目的。具体就是 React 自动帮我们做了一层浅比较:
      
      if (this._compositeType === CompositeTypes.PureClass) {
        shouldUpdate = !shallowEqual(prevProps, nextProps) || !shallowEqual(inst.state, nextState);
       }
      

      而 shallowEqual 又做了什么呢?会比较 Object.keys(state | props) 的长度是否一致,每一个 key 是否两者都有,并且是否是一个引用,也就是只比较了第一层的值,确实很浅,所以深层的嵌套数据是对比不出来的。

    • Component重写shouldComponentUpdate钩子函数(return true 重新render)

    • 遍历节点的时候设置key.

  4. 虚拟dom是什么?为什么虚拟dom会提升代码性能。

    js对象,为什么现在都用虚拟dom,虚拟dom就是真实dom的一个js对象。以前需要两个页面的差异,需要去比对真实dom的比对,真实的dom节点会有事件,属性,还会有各种各样的方法。所以两个真实dom的比对会非常耗性能。于是把dom对象变成js对象,js对象就没有dom对象上乱七八糟的特性了。js对象就比较快。