2023年前端面试汇总-React

news2024/11/17 8:33:38

1. 组件基础

1.1. React事件机制

<div onClick={this.handleClick.bind(this)}>点我</div>

React并不是将click事件绑定到了div的真实DOM上,而是在document处监听了所有的事件,当事件发生并且冒泡到document处的时候,React将事件内容封装并交由真正的处理函数运行。这样的方式不仅仅减少了内存的消耗,还能在组件挂在销毁时统一订阅和移除事件。

除此之外,冒泡到document上的事件也不是原生的浏览器事件,而是由react自己实现的合成事件(SyntheticEvent)。因此如果不想要是事件冒泡的话应该调用event.preventDefault()方法,而不是调用event.stopProppagation()方法。

实现合成事件的目的如下:

1. 合成事件首先抹平了浏览器之间的兼容问题,另外这是一个跨浏览器原生事件包装器,赋予了跨浏览器开发的能力;

2. 对于原生浏览器事件来说,浏览器会给监听器创建一个事件对象。如果你有很多的事件监听,那么就需要分配很多的事件对象,造成高额的内存分配问题。但是对于合成事件来说,有一个事件池专门来管理它们的创建和销毁,当事件需要被使用时,就会从池子中复用对象,事件回调结束后,就会销毁事件对象上的属性,从而便于下次复用事件对象;

1.2. React的事件和普通的HTML事件有什么不同?

React的事件和普通的HTML事件区别:

1. 对于事件名称命名方式,原生事件为全小写,react 事件采用小驼峰;

2. 对于事件函数处理语法,原生事件为字符串,react 事件为函数;

3. react 事件不能采用 return false 的方式来阻止浏览器的默认行为,而必须要地明确地调用preventDefault()来阻止默认行为;

合成事件是 react 模拟原生 DOM 事件所有能力的一个事件对象,其优点如下:

1. 兼容所有浏览器,更好的跨平台;

2. 将事件统一存放在一个数组,避免频繁的新增与删除(垃圾回收);

3. 方便 react 统一管理和事务机制;

事件的执行顺序为原生事件先执行,合成事件后执行,合成事件会冒泡绑定到 document 上,所以尽量避免原生事件与合成事件混用,如果原生事件阻止冒泡,可能会导致合成事件不执行,因为需要冒泡到document 上合成事件才会执行。

1.3. React 组件中怎么做事件代理?它的原理是什么?

React基于Virtual DOM实现了一个SyntheticEvent层(合成事件层),定义的事件处理器会接收到一个合成事件对象的实例,它符合W3C标准,且与原生的浏览器事件拥有同样的接口,支持冒泡机制,所有的事件都自动绑定在最外层上。

在React底层,主要对合成事件做了两件事:

1. 事件委派: React会把所有的事件绑定到结构的最外层,使用统一的事件监听器,这个事件监听器上维持了一个映射来保存所有组件内部事件监听和处理函数;

2. 自动绑定: React组件中,每个方法的上下文都会指向该组件的实例,即自动绑定this为当前组件;

1.4. React 高阶组件、Render props、hooks 有什么区别,为什么要不断迭代?

这三者是目前react解决代码复用的主要方式:

1. 高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。具体而言,高阶组件是参数为组件,返回值为新组件的函数;

2. render props是指一种在 React 组件之间使用一个值为函数的 prop 共享代码的简单技术,更具体的说,render prop 是一个用于告知组件需要渲染什么内容的函数 prop;

3. 通常,render props 和高阶组件只渲染一个子节点。让 Hook 来服务这个使用场景更加简单。这两种模式仍有用武之地,(例如,一个虚拟滚动条组件或许会有一个 renderltem 属性,或是一个可见的容器组件或许会有它自己的 DOM 结构)。但在大部分场景下,Hook 足够了,并且能够帮助减少嵌套;

1.4.1. 高阶组件 (HOC)

官方解释∶

高阶组件(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。

简言之,HOC是一种组件的设计模式,HOC接受一个组件和额外的参数(如果需要),返回一个新的组件,HOC 是纯函数,没有副作用。

// HOC的定义
function withSubscription(WrappedComponent, selectData) {
    return class extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                data: selectData(DataSource, props)
            };
        };
        // 一些通用的逻辑处理
        render() {
            // ... 并使用新数据渲染被包装的组件!
            return <WrappedComponent data={this.state.data} {...this.props} />;
        }
    };
}

// 使用
const BlogPostWithSubscription = withSubscription(BlogPost,(DataSource, props) => DataSource.getBlogPost(props.id));

1.5. 对React-Fiber的理解,它解决了什么问题?

1.6. React.Component 和 React.PureComponent 的区别

1.7. Component, Element, Instance 之间有什么区别和联系?

1.8. React.createClass和extends Component的区别有哪些?

1.9. React 高阶组件是什么,和普通组件有什么区别,适用什么场景?

1.10. 对componentWillReceiveProps 的理解

1.11. 哪些方法会触发 React 重新渲染?重新渲染 render 会做些什么?

1.12. React如何判断什么时候重新渲染组件?

1.13. React声明组件有哪几种方法,有什么不同?

1.14. 对有状态组件和无状态组件的理解及使用场景

1.15. 对React中Fragment的理解,它的使用场景是什么?

1.16. React如何获取组件对应的DOM元素?

1.17. React中可以在render访问refs吗?为什么?

1.18. 对React的插槽(Portals)的理解,如何使用,有哪些使用场景?

1.19. 在React中如何避免不必要的render?

1.20. 对 React-Intl 的理解,它的工作原理?

1.21. 对 React context 的理解

1.22. 为什么React并不推荐优先考虑使用Context?

1.23. React中什么是受控组件和非控组件?

1.24. React中refs的作用是什么?有哪些应用场景?

1.25. React组件的构造函数有什么作用?它是必须的吗?

1.26. React.forwardRef是什么?它有什么作用?

1.27. 类组件与函数组件有什么异同?

2. 数据管理

2.1. React setState 调用的原理

2.2. React setState 调用之后发生了什么?是同步还是异步?

2.3. React中的setState批量更新的过程是什么?

2.4. React中有使用过getDefaultProps吗?它有什么作用?

2.5. React中setState的第二个参数作用是什么?

2.6. React中的setState和replaceState的区别是什么?

2.7. 在React中组件的this.state和setState有什么区别?

2.8. state 是怎么注入到组件的,从 reducer 到组件经历了什么样的过程?

2.9. React组件的state和props有什么区别?

2.10. React中的props为什么是只读的?

2.11. 在React中组件的props改变时更新组件的有哪些方法?

2.12. React中怎么检验props?验证props的目的是什么?

3. 生命周期

3.1. React的生命周期有哪些?

3.2. React 废弃了哪些生命周期?为什么?

3.3. React 16.X 中 props 改变后在哪个生命周期中处理?

3.4. React 性能优化在哪个生命周期?它优化的原理是什么?

3.5.  state 和 props 触发更新的生命周期分别有什么区别?

3.6. React中发起网络请求应该在哪个生命周期中进行?为什么?

3.7. React 16中新生命周期有哪些?

4. 组件通信

4.1. 父子组件的通信方式?

4.2. 跨级组件的通信方式?

4.3. 非嵌套关系组件的通信方式?

4.4. 如何解决 props 层级过深的问题?

4.5. 组件通信的方式有哪些?

5. 路由

5.1. React-Router的实现原理是什么?

5.2. 如何配置 React-Router 实现路由切换?

5.3. React-Router怎么设置重定向?

5.4. react-router 里的 Link 标签和 a 标签的区别

5.5. React-Router如何获取URL的参数和历史对象?

5.6. React-Router 4怎样在路由变化时重新渲染同一个组件?

5.7. React-Router的路由有几种模式?

5.8. React-Router 4的Switch有什么用?

6. Redux

6.1. 对 Redux 的理解,主要解决什么问题?

6.2. Redux 原理及工作流程

6.3. Redux 中异步的请求怎么处理?

6.4. Redux 怎么实现属性传递,介绍下原理

6.5. Redux 中间件是什么?接受几个参数?柯里化函数两端的参数具体是什么?

6.6. Redux 请求中间件如何处理并发

6.7. Redux 状态管理器和变量挂载到 window 中有什么区别?

6.8. mobox 和 redux 有什么区别?

6.9. Redux 和 Vuex 有什么区别,它们的共同思想?

6.10. Redux 中间件是怎么拿到store 和 action? 然后怎么处理?

6.11. Redux中的connect有什么作用

7. Hooks

7.1. 对 React Hook 的理解,它的实现原理是什么?

7.2. 为什么 useState 要使用数组而不是对象?

7.3. React Hooks 解决了哪些问题?

7.4. React Hook 的使用限制有哪些?

7.5. useEffect 与 useLayoutEffect 的区别?

7.6. React Hooks在平时开发中需要注意的问题和原因?

7.7. React Hooks 和生命周期的关系?

8. 虚拟DOM

8.1. 对虚拟 DOM 的理解?虚拟 DOM 主要做了什么?虚拟 DOM 本身是什么?

8.2. React diff 算法的原理是什么?

8.3. React key 是干嘛用的 为什么要加?key 主要是解决哪一类问题的?

8.4. 虚拟 DOM 的引入与直接操作原生 DOM 相比,哪一个效率更高,为什么?

8.5. React 与 Vue 的 diff 算法有何不同?

9. 其他

9.1. React组件命名推荐的方式是哪个?

9.2. React 最新版本解决了什么问题,增加了哪些东西?

9.3. React 实现一个全局的 dialog

9.4. React 数据持久化有什么实践吗?

9.5. 对 React 和 Vue 的理解,它们的异同

9.6. 可以使用TypeScript写React应用吗?怎么操作?

9.7. React 设计思路,它的理念是什么?

9.8. React中props.children和React.Children的区别

9.9. React的状态提升是什么?使用场景有哪些?

9.10. React中constructor和getInitialState的区别?

9.11. React的严格模式如何使用,有什么用处?

9.12. 在React中遍历的方法有哪些?

9.13. 在React中页面重新加载时怎样保留数据?

9.14. 同时引用这三个库react.js、react-dom.js和babel.js它们都有什么作用?

9.15. React必须使用JSX吗?

9.16. 为什么使用jsx的组件中没有看到使用react却需要引入react?

9.17. 在React中怎么使用async/await?

9.18. React.Children.map和js的map有什么区别?

9.19. 对React SSR的理解

9.20. 为什么 React 要用 JSX?

9.21. HOC相比 mixins 有什么优点?

9.22. React 中的高阶组件运用了什么设计模式?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言进阶--动态内存管理

目录 一.为什么使用动态内存分配&#xff1f; 二.动态内存函数 2.1.malloc和free malloc函数 free函数 2.2.calloc和realloc calloc函数 realloc函数 三.常见的动态内存错误 对NULL指针的解引用 对动态开辟空间的越界访问 对非动态开辟内存使用free释放 使用free释…

新型进网许可标志规格样式及申请使用流程说明

新型进网许可标志规格样式及申请使用流程说明 一、新型进网许可标志规格样式 (一)标志样式 新型进网许可标志分为彩色样式和黑白样式&#xff0c;如图1所示&#xff0c;生产企业可以自行选择使用。 (二)标志要素 新型进网许可标志由许可标识、设备型号、数字编码等要素组成…

13年测试老鸟,web性能测试-测试用例总结 (全覆盖),卷起来...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试用例主要…

弟子规 古译今 详解

博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c;还请读者海涵指正。☕&#x1f36d; 《MYSQL从入门到精通》数据库是开发者必会基础之…

docker专题系列之十五:卸载docker

一、准备工作 1.杀死docker有关的容器&#xff1a; docker kill $(docker ps -a -q)2.删除所有docker容器&#xff1a; docker rm $(docker ps -a -q)3.删除所有docker镜像&#xff1a; docker rmi $(docker images -q)4.停止 docker 服务&#xff1a; systemctl stop dock…

销售管理和客户管理为什么要用CRM管理软件?

对于公司营销管理、企业管理和客户关系管理而言&#xff0c;CRM管理软件的使用是必不可少的。 通过对企业营销过程中所遭遇的客户资源管理问题进行分析&#xff0c;我们可以发现其困扰的核心问题都围绕着信息的获取和管理。 一些常见的问题包括信息缺失、信息混乱、信息管理困…

Win10临时文件夹在哪个位置打开?Win10临时文件夹打开教程

Win10系统中的临时文件夹是一个用于存储临时数据的目录&#xff0c;现在用户需要访问或清理这个临时文件夹&#xff0c;以便管理计算机&#xff0c;但是对于一些用户来说&#xff0c;找到并打开Win10临时文件夹的实际位置可能会有些困惑。本教程中小编将向用户们介绍Win10临时文…

网络数据包封装/解封装

数据的发送和接收其实就是封装及解封装的过程。 协议栈逐层向下传递数据&#xff0c;并添加报文头部和报文尾部的过程称为封装。反过来就是解封装。 封装过程 封装过程&#xff1a;上层原始数据→数据段(segment)→数据包(packet)→数据帧(frame)→比特流(bit) 应用层&#…

可以捡漏的211,复试线即国家线,最低269分上岸!

一、学校及专业介绍 新疆大学&#xff08;Xinjiang University&#xff09;&#xff0c;简称“新大”&#xff0c;位于新疆维吾尔自治区首府乌鲁木齐市&#xff0c;国家“双一流”建设高校、国家“211工程”建设高校、国家西部大开发重点建设高校。 1.1 招生情况 一共2个专业进…

Ubuntu18.04,opencv-4.3.0和opencv_contrib-4.3.0安装(填坑)

如果觉得本篇文章对您的学习起到帮助作用&#xff0c;请 点赞 关注 评论 &#xff0c;留下您的足迹&#x1f4aa;&#x1f4aa;&#x1f4aa; 本文主要Ubuntu18.04安装opencv-4.3.0和opencv_contrib-4.3.0&#xff0c;坑巨多&#xff0c;因此记录以备日后查看&#xff0c;同时…

LLM-Client一个轻量级的LLM集成工具

大型语言模型(llm)已经彻底改变了我们与文本交互的方式&#xff0c;OpenAI、Google、AI21、HuggingfaceHub、Anthropic和众多开源模型提供了不同的功能和优势。但是每个模型都有其独特的体系结构、api和兼容性需求&#xff0c;集成这些模型是一项耗时且具有挑战性的任务。 所以…

关于Long的前后端传参,精度丢失问题

若后端接受格式为 List<Long> 则前端传参时不能为 int型 需要改为 &#xff0c;加上双引号

接口签名验证

1.appId和secretKey定义 appIdAPPID secretKey cfq4189auoo13y17ur9n2rl7v2tkz3iq 2.sign获取算法 md5&#xff08;secretKey参数json字符串timestampsecretKey&#xff09;后的大写字母。 /*** 参数按key进行排序* param obj* return*/public static String getParamStr(Objec…

数据库高级- 数据库索引概述及设计原则

数据库索引 MySQL官方对索引的定义为&#xff1a;索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构&#xff08;有序&#xff09;。在数据之外&#xff0c;数据库系统还维护者满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff0…

信号链噪声分析10

目录 概要 整体架构流程 技术名词解释 技术细节 1.移除缓冲级对信号链的影响 2.SNR 与增益的关系 小结 概要 提示&#xff1a;这里可以添加技术概要 信号链构成单元参数示例&#xff0c;以 LTC2387-18&#xff08;2 级 AFE&#xff09;为例&#xff0c;这是一款 15MSPS 精密 S…

C/C++ 线程池工作原理 代码实现

1. 线程池作用 如果多次使用线程&#xff0c;那么就需要多次的创建并撤销线程。但是创建/撤销的过程会消耗资源。线程池是一种数据结构&#xff0c;其中维护着多个线程&#xff0c;这避免了在处理短时间任务时&#xff0c;创建与销毁线程的代价。即在程序开始运行前预先创建一…

设计模式GOF

设计模式&#xff08;Design pattern&#xff09;代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。…

【C++练习】日期常见题型训练(5道编程题)

【C练习】日期题型训练 ①.日期累加②.日期差值③.打印日期④.求123...n(非正常方法)⑤.计算一年的第几天 ①.日期累加 解题思路&#xff1a; 1. 日期相加相减都要考虑2月的天数情况。 2.写一个可以获取每个月份天数的函数(要讨论闰年情况)。 3.当日期相加超过本月的最大天数时…

最新ai创作系统CHATGPT镜像系统源码+支持GPT4.0+支持ai绘画(MJ)+实时语音识别输入+免费更新版本

AI系统CHATGPT镜像程序源码支持GPT4支持ai绘画实时语音识别输入免费更新版本 一、AI创作系统二、系统介绍三、系统程序下载四、安装教程五、主要功能展示六、更新日志 一、AI创作系统 1、提问&#xff1a;程序已经支持GPT3.5、GPT4.0接口、支持新建会话&#xff0c;上下文记忆…

纷享销客获评“北京市用户满意企业”荣誉称号

近日&#xff0c;北京社会企业质量协会发布了2023年“北京市用户满意企业”名单&#xff0c;纷享销客再次成功入选并获得“北京市用户满意企业”称号。该评定活动由北京市用户满意认定办公室组织推进&#xff0c;北京质协用户评价中心认定实施&#xff0c;经过资料审核、第三方…