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

news2024/11/23 8:59:53

目录

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

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

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

相关文章

【SpringBoot】 整合RabbitMQ 保证消息可靠性传递

生产者端 目录结构 导入依赖 修改yml 业务逻辑 测试结果 生产者端 目录结构 导入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>&…

无人机集群路径规划:淘金优化算法(Gold rush optimizer,GRO)提供MATLAB代码

一、淘金优化算法GRO 淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;由Kamran Zolf于2023年提出&#xff0c;其灵感来自淘金热&#xff0c;模拟淘金者进行黄金勘探行为。 参考文献&#xff1a; K. Zolfi. Gold rush optimizer: A new population-ba…

Python小姿势 - #### Python技术博客:Python多线程编程

Python技术博客&#xff1a;Python多线程编程 你好&#xff0c;这里是自媒体技术博主Aurora&#xff0c;今天我想分享一下Python多线程编程。 首先&#xff0c;什么是多线程编程&#xff1f;多线程编程是一种让多个线程同时执行的编程方式&#xff0c;它可以让程序的执行更加高…

2023年华中杯C题计算结果

经过一晚上代码的编写&#xff0c;论文的写作&#xff0c;C题完整版论文已经发布&#xff0c; 注&#xff1a;蓝色字体为说明备注解释字体&#xff0c;不能出现在大家的论文里。黑色字体为论文部分&#xff0c;大家可以根据红色字体的注记进行摘抄。对应的详细的写作视频教程&…

推荐一款网站内链爬取python脚本

目标 使用 web-tools 提供的webSpider来爬取网站内链&#xff0c;并且将其导出。 webSpider介绍&#xff1a; 官网链接&#xff1a;https://web-tools.cn/web-spider 仓库地址&#xff1a;https://github.com/duerhong/web-spider Web Spider 专门用于爬取网站内链&#xf…

C++ srand()和rand()用法

参考C rand 与 srand 的用法 计算机的随机数都是由伪随机数&#xff0c;即是由小M多项式序列生成的&#xff0c;其中产生每个小序列都有一个初始值&#xff0c;即随机种子。&#xff08;注意&#xff1a; 小M多项式序列的周期是65535&#xff0c;即每次利用一个随机种子生成的随…

论文学习笔记:Transformer Attention Is All You Need

Transformer: Attention Is All You Need 2022 年年底&#xff0c;一个大语言模型 ChatGPT 横空出世&#xff0c;并且迅速点燃了普罗大众对 AI 的热情&#xff0c;短短两个月&#xff0c; ChatGPT 就成为了史上最快成为上亿月活的应用&#xff0c;并且持续受到关注&#xff0c…

【Vue2.0源码学习】变化侦测篇-Object的变化侦测

文章目录 1. 前言2. 使Object数据变得“可观测”3. 依赖收集3.1 什么是依赖收集3.2 何时收集依赖&#xff1f;何时通知依赖更新&#xff1f;3.3 把依赖收集到哪里 4. 依赖到底是谁5. 不足之处6. 总结 1. 前言 我们知道&#xff1a;数据驱动视图的关键点则在于我们如何知道数据发…

记录docker swarm的使用

在前面的几篇文章中我们依次学习了dockerfile、docker-compose的使用&#xff0c;接下来是docker有一个比较 重要的使用&#xff0c;docker swarm的使用&#xff0c;与dockerfile和docker-compose相比较而言&#xff0c;docker swarm是在 多个服务器或主机上创建容器集群服务准…

Leetcode——66. 加一

&#x1f4af;&#x1f4af;欢迎来到的热爱编程的小K的Leetcode的刷题专栏 文章目录 1、题目2、暴力模拟(自己的第一想法)3、官方题解 1、题目 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。最高位数字存放在数组的首位&#xff0c; 数组…

CTF-PHP反序列化漏洞2-典型题目

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…

【纯属娱乐】随机森林预测双色球

目录 一、数据标准化二、预测代码三、后续 一、数据标准化 首先&#xff0c;我们需要对原始数据进行处理&#xff0c;将其转换为可用于机器学习的格式。我们可以将开奖号码中的红球和蓝球分开&#xff0c;将其转换为独热编码&#xff0c;然后将其与期数一起作为特征输入到机器…

ETL工具 - Kettle 查询、连接、统计、脚本算子介绍

一、 Kettle 上篇文章对 Kettle 流程、应用算子进行了介绍&#xff0c;本篇对查询、连接、统计、脚本算子进行讲解&#xff0c;下面是上篇文章的地址&#xff1a; ETL工具 - Kettle 流程、应用算子介绍 二、查询算子 数据输入使用 MySQL 表输入&#xff0c;表结构如下&#x…

给httprunnermanager接口自动化测试平台换点颜色瞧瞧

文章目录 一、背景1.1、修改注册表单的提示颜色1.2、修改后台代码&#xff1a;注册错误提示&#xff0c;最后提交注册&#xff0c;密码校验&#xff1b;1.3、修改了注册&#xff0c;那登录呢&#xff0c;也不能放过二、总结 一、背景 虽然咱给HttpRunnerManger引入进来&#xf…

【云台】开源版本SimpleBGC的电机驱动与控制方式

前言 最近想学习一下云台&#xff0c;发现资料确实还不太好找&#xff0c;比较有参考价值的是俄版的开源版本的云台代码&#xff0c;后面就不开源了&#xff0c;开源版本的是比较原始的算法&#xff0c;差不多是玩具级别的&#xff0c;不过还是决定学习一下&#xff0c;了解一…

PyCaret:低代码自动化的机器学习工具

PyCaret简介 随着ChatGPT和AI画图的大火&#xff0c;机器学习作为实现人工智能的底层技术被大众越来越多的认知&#xff0c;基于机器学习的产品也越来越多。传统的机器学习实现方法需要较强的编程能力和数据科学基础&#xff0c;这使得想零基础尝试机器学习变得非常困难。 机器…

Ucore lab5

实验目的 了解第一个用户进程创建过程了解系统调用框架的实现机制了解ucore如何实现系统调用sys_fork/sys_exec/sys_exit/sys_wait来进行进程管理 实验内容 练习0:已有实验代码改进 ​本实验中完成了用户进程的创建&#xff0c;能够对用户进程进行基本管理&#xff0c;并为…

C语言入门篇——自定义数据篇

目录 1、结构体 1.2、匿名结构体 1.3、结构体的自引用 1.4、结构体的声明和初始化 1.5、结构体的内存对齐 1.6、修改默认对齐数 1.7、结构体传参 2、枚举 3、共用体&#xff08;联合体&#xff09; 1、结构体 设计程序时&#xff0c;最重要的步骤之一是选择表示数据的…

【微机原理】8088/8086微处理器

目录 一、8088/8086的功能结构 1.总线接口部件&#xff08;BIU&#xff09; 2.执行部件&#xff08;EU&#xff09; 二、8088/8086的寄存器结构&#xff08;14个&#xff09; 溢出标志的概念 溢出和进位的区别 8086CPU是Intel系列的16位微处理器&#xff0c;他有16根数据…

框架学习之KOCA框架简介

KOCA框架简介 什么是KOCA术语定义发展历史 KOCA的总体架构产品优势开放性敏捷性&#xff08;一体化解决方案&#xff09;融合性安全性接入网关- KOCA Gateway KOCA DevOps流水线 KOCA技术栈 金证开发者社区&#xff1a;http://koca.szkingdom.com/ 什么是KOCA KOCA是金证基于…