面试题总结(react)

201 阅读5分钟

最近几天经历了面试,当面试官闻到问题的时候,总感觉似曾相识,但是理解不会说,,每次面试都搜一些面试题,现在对所遇到的面试题做一个汇总

props与state的区别:

简单来说,props与state的区别在与一个可读,一个可读可写

  • props是一个从外部传进组件的参数,主要作为就是从父组件向子组建传递数据使用,他具有可读性和不可变性,只能通过外部组件传递新的props来改变props的参数。否则子组件的props以及展现形式是不发生变化的
  • state:从语义上来说,state表示的是一个状态,他是用来表示对组件的数据的更新,行为的控制,页面的渲染等一系列的操作,由于组件不能修改传入的props,所以需要记录自身的状态

this.setState同步和异步的特性

在了解setState的特性的使用,归纳总结是引用了[juejin.cn/post/684490… ] 在setState从总结上来说,在合成事件中是异步的,在原生事件中是同步的。由此引出一个问题。。。
何为合成事件?
合成事件指的是React为了解决跨平台,兼容性的问题,自己封装了一套自己的事件,例如jsx中的onclick onchange事件等等
何为原生事件
原生事件是指非react合成事件,原生自带的事件监听 addEventListener ,或者也可以用原生js、jq直接 document.querySelector().onclick 这种绑定事件的形式都属于原生事件。

  • setState 只在合成事件和钩子函数中是“异步”的,在原生事件和 setTimeout 中都是同步的。
  • setState的“异步”并不是说内部由异步代码实现,其实本身执行的过程和代码都是同步的,只是合成事件和钩子函数的调用顺序在更新之前,导致在合成事件和钩子函数中没法立马拿到更新后的值,形式了所谓的“异步”,当然可以通过第二个参数 setState(partialState, callback) 中的callback拿到更新后的结果。
  • setState 的批量更新优化也是建立在“异步”(合成事件、钩子函数)之上的,在原生事件和setTimeout 中不会批量更新,在“异步”中如果对同一个值进行多次 setState , setState 的批量更新策略会对其进行覆盖,取最后一次的执行,如果是同时 setState 多个不同的值,在更新时会对其进行合并批量更新。

React 如何判断什么时候该重新渲染组件

  • 当当前组件的state的值发生改变的时候并且当前组件的shouldComponentUpdate为true时才会rerender
  • 当传入组件的props发生改变的时候,即使props传入的是一个对象,对象的某个属性发生改变的时候,并且shouldComponentUpdate为true,且当前组件的所有父组件的shouldComponentUpdate都为true时,才会执行rerender
  • 当前组件的shouldcomponentupdate即使返回false,当前组件里子组件若满足第一条中的条件,这个子组件依然会重新渲染

当调用setstate的时候,发生了什么事

当调用 setState 时,React会做的第一件事情是将传递给 setState 的对象合并到组件的当前状态。这将启动一个称为和解(reconciliation)的过程。和解(reconciliation)的最终目标是以最有效的方式,根据这个新的状态来更新UI。 为此,React将构建一个新的 React 元素树(您可以将其视为 UI 的对象表示)。

一旦有了这个树,为了弄清 UI 如何响应新的状态而改变,React 会将这个新树与上一个元素树相比较( diff )。

通过这样做, React 将会知道发生的确切变化,并且通过了解发生什么变化,只需在绝对必要的情况下进行更新即可最小化 UI 的占用空间。

翻译自 tylermcginnis.com/react-inter…

介绍一下react的生命周期,并说明每一步的作用

react的生命周期共分为三个阶段:1初始化,2更新,3销毁

我们按照react生命周期的执行过程来详细说一下生命周期

一:初始化阶段

1 设置组件的默认属性

我们可以在state中设置初始值

2 设置组件的初始状态

这个就是我们平时设置的constructor

3 componentWillMount:

这个是组件即将被渲染到页面中时触发的,此时可进行定时器,像服务端请求

4 render()

组件的渲染,这个步骤执行多次,每当改变state或通过props传递的值发生改变的时候,都会执行render函数

二:更新阶段

1 componentWillReceiveProps()

组件接收到属性时触发

2 shouldComponentUpdate()

当组件接收到新属性,或者组件的状态发生改变时触发。组件首次渲染时并不会触发

此过程一般用来做性能优化

3 componentWillUpdate()

组件即将被更新的时候触发

4 componentDidpdate()

组件完成了更新渲染

三:销毁阶段

1 componentWillUnmount()

组件被销毁时触发。这里我们可以进行一些清理操作,例如清理定时器,取消Redux的订阅事件等等。

react的生命周期到这里就结束了,第一次写,哪里有不对的地方,烦请各位指出