前端面试题-react

news/2024/5/17 19:28:33

1 React 中 keys 的作⽤是什么?

Keys 是 React ⽤于追踪哪些列表中元素被修改、被添加或者被移除的辅助标识
  • 在开发过程中,我们需要保证某个元素的 key 在其同级元素中具有唯⼀性。在 React
    Diff 算法中 React 会借助元素的 Key 值来判断该元素是新近创建的还是被移动⽽来
    的元素,从⽽减少不必要的元素重渲染。此外,React 还需要借助 Key 值来判断元素与
    本地状态的关联关系,因此我们绝不可忽视转换函数中 Key 的重要性

2 传⼊ setState 函数的第⼆个参数的作⽤是什么?

该函数会在 setState 函数调⽤完成并且组件开始重渲染的时候被调⽤,我们可以⽤该函数来监听渲染是否完成:
this.setState(
{ username: 'tylermcginnis33' },
() => console.log('setState has finished and the component has re-rendere
)
this.setState((prevState, props) => {
return {
streak: prevState.streak + props.count
}
})

3 React 中 refs 的作⽤是什么

  • Refs 是 React 提供给我们的安全访问 DOM 元素或者某个组件实例的句柄
  • 可以为元素添加 ref 属性然后在回调函数中接受该元素在 DOM 树中的句柄,该值会作为
    回调函数的第⼀个参数返回

4 在⽣命周期中的哪⼀步你应该发起 AJAX 请求

我们应当将AJAX 请求放到 componentDidMount 函数中执⾏,主要原因有下
  • React 下⼀代调和算法 Fiber 会通过开始或停⽌渲染的⽅式优化应⽤性能,其会影响
    到 componentWillMount 的触发次数。对于 componentWillMount 这个⽣命周期函数
    的调⽤次数会变得不确定, React 可能会多次频繁调⽤ componentWillMount 。如果我
    们将 AJAX 请求放到 componentWillMount 函数中,那么显⽽易⻅其会被触发多次,⾃
    然也就不是好的选择。
  • 如果我们将 AJAX 请求放置在⽣命周期的其他函数中,我们并不能保证请求仅在组件挂载
    完毕后才会要求响应。如果我们的数据请求在组件挂载之前就完成,并且调⽤了
    setState 函数将数据添加到组件状态中,对于未挂载的组件则会报错。⽽在
    componentDidMount 函数中进⾏ AJAX 请求则能有效避免这个问题

5 shouldComponentUpdate 的作⽤

shouldComponentUpdate 允许我们⼿动地判断是否要进⾏组件更新,根据组件的应⽤场景设置函数的合理返回值能够帮我们避免
不必要的更新

6 如何告诉 React 它应该编译⽣产环境版

通常情况下我们会使⽤ Webpack 的 DefinePlugin ⽅法来将 NODE_ENV变量值设置为 production 。编译版本中 React 会忽略propType 验证以及其他的告警信息,同时还会降低代码库的⼤⼩, React 使⽤了 Uglify插件来移除⽣产环境下不必要的注释等信息

7 概述下 React 中的事件处理逻辑

为了解决跨浏览器兼容性问题, React 会将浏览器原⽣事件( BrowserNative Event )封装为合成事件( SyntheticEvent )
传⼊设置的事件处理器中。这⾥的合成事件提供了与原⽣事件相同的接⼝,不过它们屏蔽了底层浏览器的细节差异,保证了⾏为的⼀致
性。另外有意思的是, React 并没有直接将事件附着到⼦元素上,⽽是以单⼀事件监听器的⽅式将所有的事件发送到顶层进⾏
处理。这样 React 在更新 DOM 的时候就不需要考虑如何去处理附着在 DOM 上的事件监听器,最终达到优化性能的⽬的

8 createElement 与 cloneElement 的区别是什么

createElement 函数是 JSX 编译之后使⽤的创建 React Element 的函数,⽽ cloneElement 则是⽤于复制某个元素并传
⼊新的 Props

9 redux中间件

中间件提供第三⽅插件的模式,⾃定义拦截 action -> reducer 的过程。变为 action -> middlewares -> reducer 。这种机
制可以让我们改变数据流,实现如异步 action , action 过滤,⽇志输出,异常报告等功能
  • redux-logger :提供⽇志输出
  • redux-thunk :处理异步操作
  • redux-promise :处理异步操作, actionCreator 的返回值是 promise

10 redux有什么缺点

  • ⼀个组件所需要的数据,必须由⽗组件传过来,⽽不能像 flux 中直接从 store 取。
  • 当⼀个组件相关数据更新时,即使⽗组件不需要⽤到这个组件,⽗组件还是会重新
    render ,可能会有效率影响,或者需要写复杂的 shouldComponentUpdate 进⾏判断。

11 react组件的划分业务组件技术组件?

  • 根据组件的职责通常把组件分为UI组件和容器组件。
  • UI 组件负责 UI 的呈现,容器组件负责管理数据和逻辑。
  • 两者通过 React-Redux 提供 connect ⽅法联系起来

12 react⽣命周期函数

初始化阶段

  • getDefaultProps :获取实例的默认属性
  • getInitialState :获取每个实例的初始化状态
  • componentWillMount :组件即将被装载、渲染到⻚⾯上
  • render :组件在这⾥⽣成虚拟的 DOM 节点
  • omponentDidMount :组件真正在被装载之后

运⾏中状态

  • componentWillReceiveProps :组件将要接收到属性的时候调⽤
  • shouldComponentUpdate :组件接受到新属性或者新状态的时候(可以返回false,接收数据后不更新,阻⽌ render 调⽤,后⾯的函数不会被继续执⾏了)
  • componentWillUpdate :组件即将更新不能修改属性和状态
    render :组件重新描绘
  • componentDidUpdate :组件已经更新

销毁阶段

  • componentWillUnmount :组件即将销毁

13 react性能优化是哪个周期函数

shouldComponentUpdate 这个⽅法⽤来判断是否需要调⽤render⽅法重新描
绘dom。因为dom的描绘⾮常消耗性能,如果我们能在
shouldComponentUpdate⽅ 法中能够写出更优化的 dom diff 算法,可以极
⼤的提⾼性能

14 为什么虚拟dom会提⾼性能

虚拟 dom 相当于在 js 和真实 dom 中间加了⼀个缓存,利⽤ dom diff 算法避免了没有必要的 dom 操作,从⽽提⾼性能

具体实现步骤如下

  • ⽤ JavaScript 对象结构表示 DOM 树的结构;然后⽤这个树构建⼀个真正的 DOM 树,
    插到⽂档当中
  • 当状态变更的时候,重新构造⼀棵新的对象树。然后⽤新的树和旧的树进⾏⽐较,记录两
    棵树差异
  • 把2所记录的差异应⽤到步骤1所构建的真正的 DOM 树上,视图就更新

15 diff算法?

  • 把树形结构按照层级分解,只⽐较同级元素。
  • 给列表结构的每个单元添加唯⼀的 key 属性,⽅便⽐较。
  • React 只会匹配相同 class 的 component (这⾥⾯的 class 指的是组件的名字)
  • 合并操作,调⽤ component 的 setState ⽅法的时候, React 将其标记为 - dirty .
    到每⼀个事件循环结束, React 检查所有标记 dirty 的 component 重新绘制.
  • 选择性⼦树渲染。开发⼈员可以重写 shouldComponentUpdate 提⾼ diff 的性能

16 react性能优化⽅案

  • 重写 shouldComponentUpdate 来避免不必要的dom操作
  • 使⽤ production 版本的 react.js
  • 使⽤ key 来帮助 React 识别列表中所有⼦组件的最⼩变化

17 简述flux 思想

 Flux 的最⼤特点,就是数据的"单向流动"。
  • ⽤户访问 View
  • View 发出⽤户的 Action
  • Dispatcher 收到 Action ,要求 Store 进⾏相应的更新
  • Store 更新后,发出⼀个 “change” 事件
  • View 收到 “change” 事件后,更新⻚⾯

18 说说你⽤react有什么坑点?

  1. JSX做表达式判断时候,需要强转为boolean类型

    如果不使⽤ !!b 进⾏强转数据类型,会在⻚⾯⾥⾯输出 0 。
    
render() {
const b = 0;
return <div>
{
!!b && <div>这是⼀段⽂本</div>
}
</div>
}
  1. 尽量不要在 componentWillReviceProps ⾥使⽤ setState,如果⼀定要使⽤,那么需要判
    断结束条件,不然会出现⽆限重渲染,导致⻚⾯崩溃
  2. 给组件添加ref时候,尽量不要使⽤匿名函数,因为当组件更新的时候,匿名函数会被当做
    新的prop处理,让ref属性接受到新函数的时候,react内部会先清空ref,也就是会以null为回
    调参数先执⾏⼀次ref这个props,然后在以该组件的实例执⾏⼀次ref,所以⽤匿名函数做ref
    的时候,有的时候去ref赋值后的属性会取到null
  3. 遍历⼦节点的时候,不要⽤ index 作为组件的 key 进⾏传⼊

19 我现在有⼀个button,要⽤react在上⾯绑定点击事件,要怎么做?


class Demo {
render() {
return <button onClick={(e) => {
alert('我点击了按钮')
}}>
按钮
</button>
}
}

你觉得你这样设置点击事件会有什么问题吗?

由于 onClick 使⽤的是匿名函数,所有每次重渲染的时候,会把该onClick 当做⼀个新的 prop 来处理,会将内部缓存的 
onClick 事件进⾏重新赋值,所以相对直接使⽤函数来说,可能有⼀点的性能下降

修改


class Demo {
onClick = (e) => {
alert('我点击了按钮')
}
render() {
return <button onClick={this.onClick}>
按钮
</button>
}

20 react 的虚拟dom是怎么实现的

⾸先说说为什么要使⽤ Virturl DOM ,因为操作真实 DOM 的耗费的性能代价太⾼,所以 react 内部使⽤ js 实现了⼀套dom结构,
在每次操作在和真实dom之前,使⽤实现好的diff算法,对虚拟dom进⾏⽐较,递归找出有变化的dom节点,然后对其进⾏更新操作。
为了实现虚拟 DOM ,我们需要把每⼀种节点类型抽象成对象,每⼀种节点类型有⾃⼰的属性,也就是prop,每次进⾏ diff 的时候, react 会先⽐较该节点类型,假如节点类型不⼀样,那么react 会直接删除该节点,然后直接创建新的节点插⼊到其中,假如节点类型
⼀样,那么会⽐较 prop 是否有更新,假如有 prop 不⼀样,那么 react会判定该节点有更新,那么重渲染该节点,然后在对其⼦
节点进⾏⽐较,⼀层⼀层往下,直到没有⼦节点

21 react 的渲染过程中,兄弟节点之间是怎么处理的?也就是key值不⼀样的时候

通常我们输出节点的时候都是map⼀个数组然后返回⼀个 ReactNode ,为了⽅便 react 内部进⾏优化,我们必须给每⼀个 
reactNode 添加 key ,这个 key prop 在设计值处不是给开发者⽤的,⽽是给react⽤的,⼤概的作⽤就是给每⼀个 reactNode添加⼀个身份标识,⽅便react进⾏识别,在重渲染过程中,如果key⼀样,若组件属性有所变化,则 react 只更新组件对应的属性;没有变化则不更新,如果key不⼀样,则react先销毁该组件,然后重新创建该组件

22 那给我介绍⼀下react

  1. 以前我们没有jquery的时候,我们⼤概的流程是从后端通过ajax获取到数据然后使⽤jquery
    ⽣成dom结果然后更新到⻚⾯当中,但是随着业务发展,我们的项⽬可能会越来越复杂,
    我们每次请求到数据,或则数据有更改的时候,我们⼜需要重新组装⼀次dom结构,然后
    更新⻚⾯,这样我们⼿动同步dom和数据的成本就越来越⾼,⽽且频繁的操作dom,也使
    我我们⻚⾯的性能慢慢的降低。
  2. 这个时候mvvm出现了,mvvm的双向数据绑定可以让我们在数据修改的同时同步dom的更
    新,dom的更新也可以直接同步我们数据的更改,这个特定可以⼤⼤降低我们⼿动去维护
    dom更新的成本,mvvm为react的特性之⼀,虽然react属于单项数据流,需要我们⼿动实
    现双向数据绑定。
  3. 有了mvvm还不够,因为如果每次有数据做了更改,然后我们都全量更新dom结构的话,也
    没办法解决我们频繁操作dom结构(降低了⻚⾯性能)的问题,为了解决这个问题,react内
    部实现了⼀套虚拟dom结构,也就是⽤js实现的⼀套dom结构,他的作⽤是讲真实dom在js
    中做⼀套缓存,每次有数据更改的时候,react内部先使⽤算法,也就是鼎鼎有名的diff算
    法对dom结构进⾏对⽐,找到那些我们需要新增、更新、删除的dom节点,然后⼀次性对
    真实DOM进⾏更新,这样就⼤⼤降低了操作dom的次数。 那么diff算法是怎么运作的呢,
    ⾸先,diff针对类型不同的节点,会直接判定原来节点需要卸载并且⽤新的节点来装载卸载
    的节点的位置;针对于节点类型相同的节点,会对⽐这个节点的所有属性,如果节点的所
    有属性相同,那么判定这个节点不需要更新,如果节点属性不相同,那么会判定这个节点
    需要更新,react会更新并重渲染这个节点。
  4. react设计之初是主要负责UI层的渲染,虽然每个组件有⾃⼰的state,state表示组件的状
    态,当状态需要变化的时候,需要使⽤setState更新我们的组件,但是,我们想通过⼀个组
    件重渲染它的兄弟组件,我们就需要将组件的状态提升到⽗组件当中,让⽗组件的状态来
    控制这两个组件的重渲染,当我们组件的层次越来越深的时候,状态需要⼀直往下传,⽆
    疑加⼤了我们代码的复杂度,我们需要⼀个状态管理中⼼,来帮我们管理我们状态state。
  5. 这个时候,redux出现了,我们可以将所有的state交给redux去管理,当我们的某⼀个state
    有变化的时候,依赖到这个state的组件就会进⾏⼀次重渲染,这样就解决了我们的我们需
    要⼀直把state往下传的问题。redux有action、reducer的概念,action为唯⼀修改state的
    来源,reducer为唯⼀确定state如何变化的⼊⼝,这使得redux的数据流⾮常规范,同时也
    暴露出了redux代码的复杂,本来那么简单的功能,却需要完成那么多的代码。
  6. 后来,社区就出现了另外⼀套解决⽅案,也就是mobx,它推崇代码简约易懂,只需要定义
    ⼀个可观测的对象,然后哪个组价使⽤到这个可观测的对象,并且这个对象的数据有更
    改,那么这个组件就会重渲染,⽽且mobx内部也做好了是否重渲染组件的⽣命周期
    shouldUpdateComponent,不建议开发者进⾏更改,这使得我们使⽤mobx开发项⽬的时
    候可以简单快速的完成很多功能,连redux的作者也推荐使⽤mobx进⾏项⽬开发。但是,
    随着项⽬的不断变⼤,mobx也不断暴露出了它的缺点,就是数据流太随意,出了bug之后
    不好追溯数据的流向,这个缺点正好体现出了redux的优点所在,所以针对于⼩项⽬来说,
    社区推荐使⽤mobx,对⼤项⽬推荐使⽤redux

http://www.mrgr.cn/p/56287776

相关文章

Spring Security 构建基于 JWT 的登录认证

一言以蔽之&#xff0c;JWT 可以携带非敏感信息&#xff0c;并具有不可篡改性。可以通过验证是否被篡改&#xff0c;以及读取信息内容&#xff0c;完成网络认证的三个问题&#xff1a;“你是谁”、“你有哪些权限”、“是不是冒充的”。 为了安全&#xff0c;使用它需要采用 …

HTTP、HTTPS协议详解

文章目录 HTTP是什么报文结构请求头部响应头部 工作原理用户点击一个URL链接后&#xff0c;浏览器和web服务器会执行什么http的版本持久连接和非持久连接无状态与有状态Cookie和Sessionhttp方法&#xff1a;get和post的区别 状态码 HTTPS是什么ssl如何搞到证书nginx中的部署 加…

2023 蓝桥杯真题B组 C/C++

https://www.dotcpp.com/oj/train/1089/ 题目 3150: 蓝桥杯2023年第十四届省赛真题-冶炼金属 题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V&#xff0c;V 是一个正整数&#xff0c;这意味着消耗 V 个普通金 属 O…

react-native 输入框 被软键盘遮挡 (KeyboardAvoidingView)

本组件用于解决一个常见的尴尬问题&#xff1a;手机上弹出的键盘常常会挡住当前的视图。本组件可以自动根据键盘的高度&#xff0c;调整自身的 height 或底部的 padding&#xff0c;以避免被遮挡。 <KeyboardAvoidingViewbehavior{Platform.OS ios ? padding : height}key…

【点云处理教程】02从 Python 中的深度图像估计点云

一、说明 这是“点云处理”教程的第二篇文章。“点云处理”教程对初学者友好&#xff0c;我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。在本教程中&#xff0c;我们将学习如何在不使用 Open3D 库的情况下从深度图像计算点云。我们还将展示如何优化代码以获…

【VUE】解决图片视频加载缓慢/首屏加载白屏的问题

1 问题描述 在 Vue3 项目中&#xff0c;有时候会出现图片视频加载缓慢、首屏加载白屏的问题 2 原因分析 通常是由以下原因导致的&#xff1a; 图片或视频格式不当&#xff1a;如果图片或视频格式选择不当&#xff0c;比如选择了无损压缩格式&#xff0c;可能会导致文件大小过大…

微信小程序交易体验分常见问题指引

小程序交易体验分是为保障小程序用户的交易体验&#xff0c;促进开发者向用户提供更好的服务&#xff0c;帮助开发者更好的评估自身服务水平的机制。平台将对开发者在其小程序的违规行为进行判定&#xff0c;根据违规行为的严重程度对该小程序扣减不同分值的交易体验分&#xf…

风靡朋友圈的妙鸭相机,到底用了哪些底层技术?

不知道大家近期的朋友圈有没有被和海马体、天真蓝如出一辙的AI写真刷屏&#xff01; 这些面若桃花、精致到头发丝、光影充满氛围感的写真都是一款叫“妙鸭相机”的小程序生成的&#xff01;只要9.9&#xff0c;就能体验999写真&#xff01; 虽然只要9.9&#xff0c;但生成的照片…

opencv-24 图像几何变换03-仿射-cv2.warpAffine()

什么是仿射&#xff1f; 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够 保持图像的平直性和平行性。平直性是指图像经过仿射变换后&#xff0c;直线仍然是直线&#xff1b;平行性是指 图像在完成仿射变换后&#xff0c;平行线仍然是平行线。…

海康摄像头开发笔记(一):连接防爆摄像头、配置摄像头网段、设置rtsp码流、播放rtsp流、获取rtsp流、调优rtsp流播放延迟以及录像存储

文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131679108 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

服务器 Docker Alist挂载到本地磁盘(Mac版)夸克网盘

1.服务器下载alist 默认有docker环境 docker pull xhofe/alist2.生成容器 -v /home/alist:/opt/alist/data 这段意思是alist中的数据映射到docker 主机的文件夹&#xff0c;/home/alist就是我主机的文件夹&#xff0c;这个文件夹必须先创建 docker run -d --restartalways…

【Python】数据分析+数据挖掘——探索Pandas中的数据筛选

1. 前言 当涉及数据处理和分析时&#xff0c;Pandas是Python编程语言中最强大、灵活且广泛使用的工具之一。Pandas提供了丰富的功能和方法&#xff0c;使得数据的选择、筛选和处理变得简单而高效。在本博客中&#xff0c;我们将重点介绍Pandas中数据筛选的关键知识点&#xff…

ChatGPT结合知识图谱构建医疗问答应用 (一) - 构建知识图谱

一、ChatGPT结合知识图谱 在本专栏的前面文章中构建 ChatGPT 本地知识库问答应用&#xff0c;都是基于词向量检索 Embedding 嵌入的方式实现的&#xff0c;在传统的问答领域中&#xff0c;一般知识源采用知识图谱来进行构建&#xff0c;但基于知识图谱的问答对于自然语言的处理…

Nginx配置WebSocket反向代理

1、WebSocket协议 ​ WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯&#xff0c;直到连接被关闭。但是WebSocket中的握手和HTTP中的握手兼容&#xff0c;它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的…

深度学习——LSTM解决分类问题

RNN基本介绍 概述 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种深度学习模型&#xff0c;主要用于处理序列数据&#xff0c;如文本、语音、时间序列等具有时序关系的数据。 核心思想 RNN的关键思想是引入了循环结构&#xff0c;允许…

记一次安装nvm切换node.js版本实例详解

最后效果如下&#xff1a; 背景&#xff1a;由于我以前安装过node.js&#xff0c;后续想安装nvm将node.js管理起来。 问题&#xff1a;nvm-use命令行运行成功&#xff0c;但是nvm-list显示并没有成功。 原因&#xff1a;因为安装过node.js&#xff0c;所以原先的node.js不收n…

CloudStudio搭建Next框架博客_抛开电脑性能在云端编程(沉浸式体验)

文章目录 ⭐前言⭐进入cloud studio工作区指引&#x1f496; 注册coding账号&#x1f496; 选择cloud studio&#x1f496; cloud studio选择next.js&#x1f496; 安装react的ui框架&#xff08;tDesign&#xff09;&#x1f496; 安装axios&#x1f496; 代理请求跨域&#x…

2.获取DOM元素

获取DOM元素就是利用JS选择页面中的标签元素 2.1 根据CSS选择器来获取DOM元素(重点) 2.1.1选择匹配的第一个元素 语法: document.querySelector( css选择器 )参数: 包含一个或多个有效的CSS选择器 字符串 返回值: CSS选择器匹配的第一个元素&#xff0c;一个HTMLElement对象…

Data Structure, Algorithm,and Applications in C++

在学习这本书进阶内容之前&#xff0c;我们可以跟着它的第一章部分再巩固和复习。本书由Sartaj Sahni撰写&#xff0c;由王立柱和刘志红翻译。全书通俗易懂&#xff0c;内容丰富&#xff0c;是巩固C内容的不二选择。希望本文对各位有所帮助。 目录 1.函数与参数 1.1.传值参数…

【Linux】用户相关内容

如果命令ll 出现以上信息&#xff0c;UID为具体的数字&#xff0c;代表之前UID为502的用户被删除了。 更改目录或文件所属用户和所属组 在Linux中&#xff0c;创建一个文件时&#xff0c;该文件的拥有者都是创建该文件的用户。 更改所属用户 chown 用户名 文件名/目录名 更…