React超级简单易懂全面的有关问题回答(面试)

目录

React事件机制:

2、React的事件和普通的HTML有什么不同:

- 事件命名的规则不同,原生事件采用全小写,react事件采用小驼峰

3、React组件中怎么做事件代理?他的原理是什么?

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

✨HOC(高阶组件):

✨Render props:

✨Hook:

5、React.Component和React.PureComponent的区别

6、关于this指向:


React事件机制:

js的原生事件的绑定有三种:

- HTML标签引入方式

- DOM0级绑定方式(只支持事件冒泡)document.qeuerySelector(“#parent).οnclick=function()

- DOM2级绑定方式(既支持冒泡,有支持捕获)document.querySelector("#parent").addeEventListener('click',function(e){},true)

React事件处理机制:

1️⃣:react对原始事件(冒泡和捕获)进行封装,封装后的事件叫做合成事件。

<button onClick{function(){合成事件1}}></button>
<button onClick{()=>{合成事件1}}></button>
clickBind1(){
    log(合成事件2)
}
<button onClick{()=>{clickbind1}}></button>

onClick={this.类中的普通方法}存在this指向问题,需要通过bind改变this指向

合成事件实现原理:

react并不是将是将事件绑定到元素的真实DOM上

- 在react17中,是在根容器(#root)处监听了所有事件,当事件发生并且冒泡到根容器处的时候,React将事件内容封装并且交给真正的处理函数。

- 在react16中,是在document处监听了所有事件,当事件冒泡到document处的收,React将事件内容封装并交由真正的处理函数。

合成事件的目的:

⏩首先抹平了浏览器之间的兼容问题,另外这是一个跨浏览器原生事件包装器

⏩对于原生浏览器事件来说,浏览器会给监听器创建一个事件对象,(1)如果有很多的事件监听,那么就需要分配很多事件对象,造成高额的内存分问题,(2)但是对于合成事件来说,有一个事件池专门来管理他们的创建和销毁,(3)当事件需要被使用时,就会从池子中复用对象,事件用完了,就会销毁事件对象上的属性。
 

---------------------------------------------------------------------------------------------------------------------------------

2、React的事件和普通的HTML有什么不同:


- 事件命名的规则不同,原生事件采用全小写,react事件采用小驼峰

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

- react不能采用return false来组织默认行为,必须使用e.preventDefault()组织默认行为

---------------------------------------------------------------------------------------------------------------------------------

3、React组件中怎么做事件代理?他的原理是什么?

React基于虚拟Dom实现了一个SyntheicEvent层(合成事件层),定义的事件处理器会接收到一个合成事件的实例对象,该对象符合W3c标准,且与原生浏览器拥有同样的事件接口,支持冒泡机制,所有的事件都自动绑定在最外层(16是绑定在document上,17以后是绑定在根容器root上)

2️⃣:原理:

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

✨ 事件委派:事件委派的机制是将事件处理程序注册到一个父元素上,而不是直接注册到每个子元素上,当子元素触发事件时,事件会向上传播到父元素,父元素在根据事件的类型和目标元素来决定如何处理事件。

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

---------------------------------------------------------------------------------------------------------------------------------

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

HOC(高阶组件):

HOC是React中用于复用组件逻辑的一种高级技巧,具体就是高阶组件是参数为组件,返回值为新组件的函数

语法:

import loadable from 'react-loadable'
function withLoadable(wrapComponent){
    return Loadable({
        loader:WrapComponent,
        loading:()=> </div>,
        dely:1000
  })
}
export default withLoadable

❗❗❗:HOC缺点:

- HOC传递给被包裹组件的props容易和被包裹后的组件重名,进而被覆盖。

Render props:

父组件App.JSX
function App(){
    <Son render={data=><p>{data.name}今年{data.age}岁</p>}></Son>
}
子组件 Son.jsx
function Son(){
  const data = {name:'CMY',age:18}
    return(
    <div>
        props.render(data)
    </div>
 )
}

render props指将一个函数组为组件的props传入到子组件中,该函数会在父组件中被调用,并返回一些需要被渲染的内容,子组件在渲染时可以使用该函数返回的内容来动态渲染自己的UI。

❗❗❗: renderprops缺点:

- 会形成嵌套地狱

- 无法在 return 语句外访问数据

Hook:

Hook是React16.8的新增特性,它可以让函数组件使用类组件中的state和生命周期函数。通过自定义hook,可以复用代码逻辑。

❗❗❗:缺点

- hook只能在组件顶层使用,不可以再在分支语句中使用

优点:

解决render props的嵌套地狱问题,解决HOC的prop重命名问题。

5、React.Component和React.PureComponent的区别

    React.Component组件的特点是,

        - 只要调用setState(),即使state数据没有发生变化,组件依然重新渲染-------->效率低

        -只有当前组件重新渲染,子组件跟着一起渲染,纵使子组件没有使用父组件的任何数据------>效率低

         原因:因为React.Component中的shouldComponentUpadte()总是返回true,如果我们把组件中的shouldComponentUpdate添加判断条件就可以优化Rreact.component的性能低的问题,

shouldComponentUpdtae(nextProps,nextState){
        if(nextProps===this.props) return false
        else return true
}

  ✨PureComponent:

pureComponent重写了shouldComponentUpdate方法进行比较,但是pureComponent是浅比较,也就是说如果props或者state是引用类型的数据,只会比较是不是同一个地址,而不会比较这个地址里面的数据是否一致。例如:

如果state状态中是数组,使用的是pureComponent,需要更改数组中的内容,最好这样子更改,

setState(['添加的新值',...数组])

---------------------------------------------------------------------------------------------------------------------------------

6、关于this指向:

1️⃣:如果定义的是类中的成员方法,this执行改变在两个地方去写:
- 可以在构造函数中写:this.成员方法 = this.成员方法.bind(this)

- 可以在render函数调用的jsx中使用:onClick={this.成员方法.bind(this)}

2️⃣:如果定义在render的函数,函数包括如下

- 定义的是声明式函数只能在调用处使用onClick={声明式函数.bind(this)}

- 定义的是函数表达式,也只能在调用处使用onClick={声明式函数.bind(this)}

3️⃣:改变this指向有三种方式,apply,bind,call

- apply接收三个参数(被劫持的this,[数组])

-  call接收三个参数(被劫持的this,值1,值2)

- apply和call是在改变this指向的同时也顺便调用改方法。

- bind(this)只改变this指向,不调用该方法。

✨总结:所以react中不适合apply和call,只适合bind

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql 如何避免索引失效

案例演示 建表及初始化数据 CREATE TABLE staffs (id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(24) NOT NULL DEFAULT ,age INT NOT NULL DEFAULT 0,pos VARCHAR(20) NOT NULL DEFAULT ,#职位add_time TIMESTAMP NOT NULL DEFAULT CURREN…

【源码解析】SpringBoot日志系统源码分析

LoggingApplicationListener 日志组件的处理是LoggingApplicationListener实现的。LoggingApplicationListener#onApplicationEvent&#xff0c;监听事件。如果实现接口GenericApplicationListener&#xff0c;可以允许适配事件类型。 private static final Class<?>[]…

链接sqlite

一.sqlite库函数 1.sqlite3_open()函数 语法&#xff1a;*sqlite3_open(const char *filename, sqlite3 *ppDb) 作用&#xff1a;该例程打开一个指向 SQLite 数据库文件的连接&#xff0c;返回一个用于其他 SQLite 程序的数据库连接对象。 参数1&#xff1a;如果 filename …

8个免费的PNG素材网站推荐

很多设计小白都不知道什么是PNG。事实上&#xff0c;PNG是一种支持透明度的图像格式。当你想在设计中将图像与背景或文本混合时&#xff0c;它就会派上用场。 如果你没有时间为你正在处理的设计创建透明的PNG图像&#xff0c;你也可以使用我收集的PNG素材网站&#xff0c;以便…

Mysql-SQL优化

SQL优化 插入数据优化1&#xff09;批量插入数据2&#xff09;手动控制事务3&#xff09;主键顺序插入大批量插入数据 主键优化order by优化group by优化limit优化count优化update优化小结 插入数据优化 插入数据优化主要是对于insert进行批量插入时优化&#xff0c;下面我们就…

d3.js学习笔记②搭建服务器(含报错解决)

强烈建议自己搭建一个服务器&#xff0c;否则在后续往js里导入本地数据&#xff08;比如csv、json文件等&#xff09;的时候会报错。我用的是Apache服务器&#xff0c;下载、安装过程参考这篇文章&#xff1a;Apache安装配置 在浏览器输入http://localhost/或者http://127.0.0…

excel实战小测第四

【项目背景】 本项目为某招聘网站部分招聘信息&#xff0c;要求对“数据分析师”岗位进行招聘需求分析&#xff0c;通过对城市、行业、学历要求、薪资待遇等不同方向进行相关性分析&#xff0c;加深对数据分析行业的了解。 结合企业真实招聘信息&#xff0c;可以帮助有意转向数…

一文看懂数据分析必备计算功能—内存计算

各位数据的朋友&#xff0c;大家好&#xff0c;我是老周道数据&#xff0c;和你一起&#xff0c;用常人思维数据分析&#xff0c;通过数据讲故事。 接下来&#xff0c;我们准备讲一系列的奥威BI软件的内存计算在各种分析场景中的应用。在正式开讲之前&#xff0c;我先简单说一下…

嵌入式设备显示屏相关概念汇总

嵌入式设备常用的显示屏接口 LCD 接口&#xff1a;是一种常见的数字电路接口&#xff0c;支持多种显示器件&#xff0c;如字符型液晶显示器和点阵型液晶显示器等。 VGA 接口&#xff1a;是一种视频接口标准&#xff0c;用于连接显示器和计算机。该接口提供模拟 RGB 信号&#…

快速多关键字统计

实例需求&#xff1a;在每个章节中统计关键字&#xff08;“√”, “”, “〇”, “空缺”&#xff09;的个数&#xff0c;B列中的章节编号作为章节划分的标识&#xff0c;例如1.1.1 ~ 1.1.5为第1.1章节&#xff0c;对应工作表的12 ~ 16行&#xff0c;其中黄色列为需要统计的数…

IDEA中使用Git提交代码提示:您即将把CRLF行分隔符提交到Gt仓库。 建议将core.autocrlf Git特性设置为trUe,以免发生行分隔符问题。

IDEA中使用Git提交代码提示&#xff1a;您即将把CRLF行分隔符提交到Gt仓库。 建议将core.autocrlf Git特性设置为trUe,以免发生行分隔符问题。 问题背景&#xff1a; 在IDEA中&#xff0c;使用Git提交代码到远程仓库时&#xff0c;结果弹出一个警告窗口 问题原因&#xff1a; …

【测试开发】突破瓶颈必学技能——什么是k8s的核心概念?

目录 Docker 和K8s k8s中的重要概念 Master 节点 Node 节点 集群&#xff08;Cluster&#xff09; 标签&#xff08;Label&#xff09; 命名空间&#xff08;Namespace&#xff09; 容器组&#xff08;Pod&#xff09; 无状态部署&#xff08;Deployment&#xff09;…

【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码

【2023五一杯数学建模】 B题 快递需求分析问题 1 题目 请依据以下提供的附件数据和背景内容&#xff0c;建立数学模型&#xff0c;完成接下来的问题&#xff1a;问题背景是&#xff0c;网络购物作为一种重要的消费方式&#xff0c;带动着快递服务需求飞速增长&#xff0c;为我…

AVL 树(自平衡二叉搜索树) 介绍

AVL 树&#xff08;自平衡二叉搜索树) 介绍 前言 在介绍二叉搜索树的章节中提到&#xff0c;二叉搜索树可能退化为线性链表&#xff0c;失去作为二叉树的各种优势。那么过程中需要维持二叉树的形式&#xff0c;同时左右子树的深度差异可控&#xff0c;如果能实现这两个条件&a…

音视频 FFmpeg

文章目录 前言视频编解码硬件解码(高级)软解码(低级)软、硬解码对比视频解码有四个步骤Android 系统中编解码器的命名方式查看当前设备支持的硬解码 基础知识RGB色彩空间常见的格式对比YUV索引格式分离RGB24像素数据中的R、G、B分量 BMP 文件格式格式组成像素排列顺序RGB24格式…

autosar软件分层架构组成--汽车电子

介绍 autosar是汽车软件协会制定的一套软件标准 本文章所有图片来源于网络 一、分层架构 分层&#xff1a;3层 1.上层应用层&#xff08;Application Layer&#xff09; 2.中间件RTE(Runtime Environment) 3.下层的基础软件&#xff08;Basic Software&#xff09; 中间件R…

倾斜摄影超大场景的三维模型轻量化纹理压缩的关键技术

倾斜摄影超大场景的三维模型轻量化纹理压缩的关键技术 倾斜摄影超大场景的三维模型轻量化处理中纹理压缩是轻量化处理的重要手段之一&#xff0c;可以在保证模型真实感的前提下&#xff0c;减小数据体积、降低传输带宽和提高渲染性能。以下是几个关键的纹理压缩技术&#xff1a…

沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置

目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置 CH32V208 CH32V208系列是沁恒32位RISC-V中比较新的一个系列, 基于青稞RISC-V4C内核, 最高144MHz主频, 64KB SRAM&#xff0c;128KB Flash, 供电电压2.5/3.3V. 这个型号的特点: 除了特有的硬件堆栈区、…

深度学习第J8周:Inception v1算法实战与解析

目录 一、Inception v1 1.简介 2. 算法结构 二、pytorch代码复现1.前期准备 2.代码复现 3.训练运行 3.2指定图片进行预测 三、总结 &#x1f368; 本文为[&#x1f517;365天深度学习训练营]内部限免文章&#xff08;版权归 *K同学啊* 所有&#xff09; &#x1f356; 作…

Linux:网络基础1

网络协议分层 所有网络问题&#xff0c;本质都是通信距离变长了&#xff0c;为了尽可能减少通信成本&#xff0c;定制了协议。 协议分层的优势&#xff1a; 软件设计方面的优势 - 低耦合 一般我们的分层依据: 功能比较集中&#xff0c;耦合度比较高的模块-- 一层 &#xff0c…