常见的面试题总结分享

目录

1.说说你对react的理解?有哪些特性?

 2.说说对Diff算法理解

3.说说React生命周期有哪些不同的阶段?每个阶段对应的方法是? 

4.说你对react hook的理解 

5. 说说你对React中虚拟dom的理解? 

6. React组件之间如何通信 

7.说说你对受控组件和非受控组件的理解?应用场景? 

8.说说Connect组件的原理是什么? 

9.说说react 中jsx语法糖的本质? 

10.说说你对redux中间件的理解?常用的中间件有哪些?实现原理? 

 11. 什么是websocket?

 12. 什么是koa?

13. 通过原生js实现一个节流函数和防抖函数? 

14. 说说你对@reduxjs/toolkit的理解?和react-redux有什么区别? 

15. 说说AMD、CMD、commonJS模块化规范的区别? 

16. 说说React jsx转换成真实DOM的过程? 

17.package.json中版本号详解 

18. React render方法的原理,在什么时候会触发?

19.说说如何借助webpack来优化前端性能?

 20.React性能优化的手段有哪些?


1.说说你对react的理解?有哪些特性?

        

React,用于构建用户界面的 JavaScript 库,只提供了 UI 层面的解决方案

遵循组件设计模式、声明式编程范式和函数式编程概念,以使前端应用程序更高效

使用虚拟 DOM 来有效地操作 DOM,遵循从高阶组件到低阶组件的单向数据流

帮助我们将界面成了各个独立的小块,每一个块就是组件,这些组件之间可以组合、嵌套,构成整体页面

react 类组件使用一个名为 render() 的方法或者函数组件return,接收输入的数据并返回需要展示的内容

 特性:

JSX 语法

单向数据绑定

虚拟 DOM

声明式编程

Component

 2.说说对Diff算法理解

Diff算法作用:

由于渲染真实DOM的开销很大,有时候我们修改了某个数据,直接渲染到真实dom上会引起整个dom树的重绘和重排。我们希望只更新我们修改的那一小块dom,而不是整个dom,diff算法就帮我们实现了这点

 Diff算法的本质:找出两对象(虚拟dom树)之间的差异,目的是尽可能地做到节点可复用

3.说说React生命周期有哪些不同的阶段?每个阶段对应的方法是? 

一共有三个阶段,分别为

挂载阶段(Mounting)

更新阶段(Updating)

卸载阶段(Unmounting

挂载阶段:

- constructor() 在 React 组件挂载之前,会调用它的构造函数。

- componentWillMount: 在调用 render 方法之前调用,并且在初始挂载及后续更新时都会被调用。

- componentDidMount(): 在组件挂载后(插入 DOM 树中)立即调用

更新运行阶段:

* componentWillReceiveProps: 在接受父组件改变后的props需要重新渲染组件时用到的比较多,外部组件传递频繁的时候会导致效率比较低

* shouldComponentUpdate():用于控制组件重新渲染的生命周期,state发生变化,组件会进入重新渲染的流程,在这里return false可以阻止组件的更新

* render(): render() 方法是 class 组件中唯一必须实现的方法。

* *componentWillUpdate(): shouldComponentUpdate返回true以后,组件进入重新渲染完成之前进入这个函数。

* **componentDidUpdate(): 每次state改变并重新渲染页面后都会进入这个生命周期

卸载或销毁阶段

componentWillUnmount (): 在此处完成组件的卸载和数据的销毁。

4.说你对react hook的理解 

React中的Hook方法:

useState()用于为函数组件引入状态。在useState()中,数组第一项为一个变量,指向状态的当前值。类似this.state,第二项是一个函数,用来更新状态,类似setState

useEffect()接受两个参数,第一个参数是你要进行的异步操作,第二个参数是一个数组,用来给出Effect的依赖项。只要这个数组发生变化,useEffect()就会执行

useRef():

相当于class组件中的createRef的作用,ref.current获取绑定的对象

UseReducer():

接受reducer函数和状态的初始值作为参数,返回一个数组,其中第一项为当前的状态值,第二项为发送action的dispatch函数

UseMemo()和useCallback():

接收的参数都是一样,第一个参数为回调,第二个参数为要依赖的数据

共同作用:仅仅依赖数据发生变化, 才会调用,也就是起到缓存的作用。useCallback缓存函数,useMemo 缓存返回值。

5. 说说你对React中虚拟dom的理解? 

虚拟 DOM 不会进行排版与重绘操作,而真实 DOM 会频繁重排与重绘

使用虚拟 DOM 的优势如下:

如果使用手动操作真实 DOM 来完成页面,繁琐又容易出错,在大规模应用下维护起来也很困难

性能方面:使用 Virtual DOM,能够有效避免真实 DOM 数频繁更新,减少多次引起重绘与回流,提高性能

跨平台:React 借助虚拟 DOM,带来了跨平台的能力,一套代码多端运行

6. React组件之间如何通信 

父传子:在父组件的子组件标签上绑定自定义属性,挂载传递的数据,然后子组件通过props接收传递的数据

子传父:在父组件中的组件间标签上绑定一个数据,传递一个方法给子组件,子组件通过props接收这个方法,直接调用即可

非父子组件通信: redux

7.说说你对受控组件和非受控组件的理解?应用场景? 

受控组件:

由React控制输入表单的元素而改变其值的方式

例如:给表单input绑定一个onChange事件,当input状态发生变化就会触发这个事件,从而更新state的变化

非受控组件:

它的表单数据由dom本身处理,不受setState控制,和传统的html相似,输入什么就会显示最新的值在非受控组件中可以使用ref来从dom获取表单数据

8.说说Connect组件的原理是什么? 

connect有四个参数, 但是后两个参数用到的很少.

connect 的第一个参数是 mapStateToProps

这个函数允许我们将 store 中的数据作为 props 绑定到组件上,实现主要原理, 就是将需要绑定的props作为一个函数传过来, 在connect中传给mapStateToProps一个真实的store的数据

9.说说react 中jsx语法糖的本质? 

jsx本质就是下面这个函数React.createElement的语法糖,所有的jsx语法都会最终经过babel.js转化成为React.createElement这个函数的函数调用

10.说说你对redux中间件的理解?常用的中间件有哪些?实现原理? 

Redux中,中间件就是放在就是在dispatch过程,在分发action进行拦截处理

前面我们了解到了Redux整个工作流程,当action发出之后,reducer立即算出state,整个过程是一个同步的操作

那么如果需要支持异步操作,或者支持错误处理、日志监控,这个过程就可以用上中间件,其本质上一个函数,对store.dispatch方法进行了改造,在发出 Action和执行 Reducer这两步之间,添加了其他功能

常用的redux中间件,如:redux-thunk:用于异步操作、edux-logger:用于日志记录

中间件都需要通过applyMiddlewares进行注册,作用是将所有的中间件组成一个数组,依次执行然后作为第二个参数传入到createStore中

 11. 什么是websocket?

WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。它最大的特点是:服务器可以向客户端主动推动消息,客户端也可以主动向服务器推送消息。

 12. 什么是koa?

Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面:

将node原生的req和res封装成为一个context对象。

基于async/await的中间件洋葱模型机制。

13. 通过原生js实现一个节流函数和防抖函数? 

防抖函数(debounce)

功能:当事件被触发N秒之后再执行回调,如果在N秒内被触发,则重新计时。

节流函数(throttle)

功能:规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效

14. 说说你对@reduxjs/toolkit的理解?和react-redux有什么区别? 

@reduxjs/toolkit

@reduxjs/toolkit 是对 Redux 的二次封装,开箱即用可的一个高效的 Redux 开发工具集,使得创建store、更新store

15. 说说AMD、CMD、commonJS模块化规范的区别? 

CommonJS与AMD:

CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。

AMD规范则是非同步加载模块,允许指定回调函数。

CMD和AMD:

1.对于依赖的模块AMD是提前执行,CMD是延迟执行。

2.AMD推崇依赖前置(在定义模块的时候就要声明其依赖的模块),CMD推崇依赖在用到某个模块的时候再去require——按需加载)。

16. 说说React jsx转换成真实DOM的过程? 

1. JSX在被编译后,会变成一个针对 React.createElement 的调用。

         2.eateElement的大致流程为:

        1.二次处理key、ref、self、source四个属性值;

        2.遍历config,筛选可以提到props中的属性;

        3.将children中的子元素推入childArray数组;

        4.格式化defaultProps

        5.将以上数据作为入参,发起ReactElement的调用,最终由ReactElement返回虚拟Dom对象

         3. 最终将虚拟Dom传入ReactDom.render函数中,将其转变为真实Dom

17.package.json中版本号详解 

version 指定版本号

 >version 大于该版本号

>=version 大于等于该版本号

<version 小于该版本号

<=version 小于等于该版本号

~version 右侧任意

 ^version 从左向右,第一个非0号的右侧任意

x-version x位置任意

" "|| * version 表示版本任意

version1-version2 表示版本区间范围 包含首尾版本号

version1||version2||…version 表示或,或version1或version2,支持多个

18. React render方法的原理,在什么时候会触发?

原理

在类组件和函数组件中,render函数的形式是不同的。

类组件中render函数指的就是render方法;而在函数组件中,指的就是整个函数组件。

类组件调用 setState 修改状态

 函数组件通过useState hook修改状态

19.说说如何借助webpack来优化前端性能?

  • JS代码压缩

  • CSS代码压缩

  • Html文件代码压缩

  • 文件大小压缩

  • 图片压缩

  • Tree Shaking

  • 代码分离

  • 内联 chunk

 20.React性能优化的手段有哪些?

1、使用纯组件;
2、使用 React.memo 进行组件记忆(React.memo 是一个高阶组件),对 于相同的输入,不重复执行;
3、如果是类组件,使用 shouldComponentUpdate(这是在重新渲染组件之前触发的其中一个生命周期事件)生命周期事件,可以利用此事件来决定何时需要重新渲染组件;
4、路由懒加载;
5、使用 React Fragments 避免额外标记;
6、不要使用内联函数定义(如果我们使用内联函数,则每次调用“render”函数时都会创建一个新的函数实例);
7、避免在Willxxx系列的生命周期中进行异步请求,操作dom等;
8、如果是类组件,事件函数在Constructor中绑定bind改变this指向;
9、避免使用内联样式属性;
10、优化 React 中的条件渲染;
11、不要在 render 方法中导出数据;
12、列表渲染的时候加key;
13、在函数组件中使用useCallback和useMemo来进行组件优化,依赖没有变化的话,不重复执行;
14、类组件中使用immutable对象;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值