说说你在使用React 过程中遇到的常见问题?如何解决?

一、前言

在使用react开发项目过程中,每个人或多或少都会遇到一些"奇怪"的问题,本质上都是我们对其理解的不够透彻

react 系列,33个工作日,33次凌晨还在亮起的台灯,到今天就圆满画上句号了,比心

在系列中我们列出了很多比较经典的考题,工作中遇到的问题也往往就藏中其中,只是以不同的表现形式存在罢了

今天的题解不算题解,准确来说是对整个系列的一次贯穿,总结

目录:

  • react 有什么特性
  • 生命周期有哪些不同阶段?每个阶段对应的方法是?
  • state 和 props有什么区别?
  • super()和super(props)有什么区别?
  • setState执行机制?
  • React的事件机制?
  • 事件绑定的方式有哪些?
  • 构建组件的方式有哪些?区别?
  • 组件之间如何通信?
  • key有什么作用?
  • refs 的理解?应用场景?
  • Hooks的理解?解决了什么问题?
  • 如何引入css?
  • redux工作原理?
  • redux中间件有哪些?
  • react-router组件有哪些?
  • render触发时机?
  • 如何减少render?
  • JSX转化DOM过程?
  • 性能优化手段有哪些
  • 如何做服务端渲染?

react 有什么特性

主要的特性分为:

  • JSX语法
  • 单向数据绑定
  • 虚拟DOM
  • 声明式编程
  • Component

借助这些特性,react整体使用起来更加简单高效,组件式开发提高了代码的复用率

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

主要分成了新的生命周期和旧的生命周期:

  • 新版生命周期整体流程如下图所示:

旧的生命周期流程图如下:

state 和 props有什么区别?

两者相同点:

  • 两者都是 JavaScript 对象
  • 两者都是用于保存信息
  • props 和 state 都能触发渲染更新

区别:

  • props 是外部传递给组件的,而 state 是在组件内被组件自己管理的,一般在 constructor 中初始化
  • props 在组件内部是不可修改的,但 state 在组件内部可以进行修改
  • state 是多变的、可以修改

super()和super(props)有什么区别?

在React中,类组件基于ES6,所以在constructor中必须使用super

在调用super过程,无论是否传入props,React内部都会将porps赋值给组件实例porps属性中

如果只调用了super(),那么this.props在super()和构造函数结束之间仍是undefined

setState执行机制?

在react类组件的状态需要通过setState进行更改,在不同场景下对应不同的执行顺序:

  • 在组件生命周期或React合成事件中,setState是异步
  • 在setTimeout或者原生dom事件中,setState是同步

当我们批量更改state的值的时候,react内部会将其进行覆盖,只取最后一次的执行结果

当需要下一个state依赖当前state的时候,则可以在setState中传递一个回调函数进行下次更新

React的事件机制?

React基于浏览器的事件机制自身实现了一套事件机制,包括事件注册、事件的合成、事件冒泡、事件派发等

组件注册的事件最终会绑定在document这个 DOM上,而不是 React组件对应的 DOM,从而节省内存开销

自身实现了一套事件冒泡机制,阻止不同时间段的冒泡行为,需要对应使用不同的方法

事件绑定的方式有哪些?

react常见的绑定方式有如下:

  • render方法中使用bind
  • render方法中使用箭头函数
  • constructor中bind
  • 定义阶段使用箭头函数绑定

前两种方式在每次组件render的时候都会生成新的方法实例,性能问题欠缺

构建组件的方式有哪些?区别?

组件的创建主要分成了三种方式:

  • 函数式创建
  • 继承 React.Component 创建
  • 通过 React.createClass 方法创建

如今一般都是前两种方式,对于一些无状态的组件创建,建议使用函数式创建的方式,再比如hooks的机制下,函数式组件能做类组件对应的事情,所以建议都使用函数式的方式来创建组件

组件之间如何通信?

组件间通信可以通过props、传递回调函数、context、redux等形式进行组件之间通讯

key有什么作用?

使用key是react性能优化的手段,在一系列数据最前面插入元素,如果没有key的值,则所有的元素都需要进行更换,而有key的情况只需要将最新元素插入到前面,不涉及删除操作

在使用key的时候应保证:

  • key 应该是唯一的
  • key不要使用随机值(随机数在下一次 render 时,会重新生成一个数字)
  • 避免使用 index 作为 key

refs 的理解?应用场景?

Refs允许我们访问 DOM节点或在 render方法中创建的 React元素

下面的场景使用refs非常有用:

  • 对Dom元素的焦点控制、内容选择、控制
  • 对Dom元素的内容设置及媒体播放
  • 对Dom元素的操作和对组件实例的操作
  • 集成第三方 DOM 库

Hooks的理解?解决了什么问题?

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性

解决问题如下:

  • 难以重用和共享组件中的与状态相关的逻辑
  • 逻辑复杂的组件难以开发与维护,当我们的组件需要处理多个互不相关的 local state 时,每个生命周期函数中可能会包含着各种互不相关的逻辑在里面
  • 类组件中的this增加学习成本,类组件在基于现有工具的优化上存在些许问题
  • 由于业务变动,函数组件不得不改为类组件等等

如何引入css?

常见的CSS引入方式有以下:

  • 在组件内直接使用
  • 组件中引入 .css 文件
  • 组件中引入 .module.css 文件
  • CSS in JS

组件内直接使用css会导致大量的代码,而文件中直接引入css文件是全局作用域,发生层叠

引入.module.css文件能够解决局部作用域问题,但是不方便动态修改样式,需要使用内联的方式进行样式的编写

css in js这种方法,可以满足大部分场景的应用,可以类似于预处理器一样样式嵌套、定义、修改状态等

redux工作原理?

redux要求我们把数据都放在 store公共存储空间

一个组件改变了 store 里的数据内容,其他组件就能感知到 store的变化,再来取数据,从而间接的实现了这些数据传递的功能

工作流程图如下所示:

redux中间件有哪些?

市面上有很多优秀的redux中间件,如:

  • redux-thunk:用于异步操作
  • redux-logger:用于日志记录

react-router组件有哪些?

常见的组件有:

  • BrowserRouter、HashRouter
  • Route
  • Link、NavLink
  • switch
  • redirect

render触发时机?

在React 中,类组件只要执行了 setState 方法,就一定会触发 render 函数执行

函数组件useState 会判断当前值有无发生改变确定是否执行render方法,一旦父组件发生渲染,子组件也会渲染

如何减少render?

父组件渲染导致子组件渲染,子组件并没有发生任何改变,这时候就可以从避免无谓的渲染,具体实现的方式有如下:

  • shouldComponentUpdate
  • PureComponent
  • React.memo

JSX转化DOM过程?

jsx首先会转化成React.createElement这种形式,React.createElement作用是生成一个虚拟Dom对象,然后会通过ReactDOM.render进行渲染成真实DOM

性能优化手段有哪些

除了减少render的渲染之外,还可以通过以下手段进行优化:

除此之外, 常见性能优化常见的手段有如下:

  • 避免使用内联函数
  • 使用 React Fragments 避免额外标记
  • 使用 Immutable
  • 懒加载组件
  • 事件绑定方式
  • 服务端渲染

如何做服务端渲染?

node server 接收客户端请求,得到当前的请求url 路径,然后在已有的路由表内查找到对应的组件,拿到需要请求的数据,将数据作为 props、context或者store 形式传入组件

然后基于 react 内置的服务端渲染方法 renderToString()把组件渲染为 html字符串在把最终的 html进行输出前需要将数据注入到浏览器端

浏览器开始进行渲染和节点对比,然后执行完成组件内事件绑定和一些交互,浏览器重用了服务端输出的 html 节点,整个流程结束

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

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

相关文章

OpenAI开发者大会大模型圈开卷AI Agent? 实在智能布局前瞻已下“先手棋”

“平地起惊雷,至今有余音。” 去年的11月,OpenAI发布ChatGPT给科技圈劈下了一道惊雷,引爆了全世界的AI大模型热潮,全球科技巨头公司争先恐后地推出通用大模型,探索产业应用的可能。 短短一年后,北京时间1…

docker可视化

什么是portainer? portainer就是docker图形化界面的管理工具,提供一个后台面板供我们操作 目前先用portainer(先用这个),以后还会用到Rancher(CI/CD在用) 1.下载portainer 9000是内网端口,8088是外网访问端口 docker run…

C#时间类的使用方法

在C#编程中,日期和时间的处理是常见的任务之一。C#提供了多个类来处理日期、时间和时区的操作,包括DateTime、TimeSpan和DateTimeOffset。 目录 1. DateTime类1.1 创建DateTime对象1.2 获取日期和时间信息1.3 格式化日期和时间1.4 比较日期和时间 2. Tim…

中国集成电路设计业2023年会演讲预告 | 龙智Perforce专家解析半导体设计中的数字资产管理

2023年11月10-11日(周五-周六),龙智即将亮相于广州举行的中国集成电路设计业2023年会(ICCAD 2023),呈现集成了Perforce与Atlassian产品的芯片开发解决方案,帮助企业实现数智化转型,革…

Vue3 + Naive-ui Data Table 分页页码显示不全

当使用naive-ui 表格并且使用分页组件的时候 需要增加 remote

包教包会:Mysql主从复制搭建

笑小枫的专属目录 一、无聊的理论知识1. 主从复制原理2. 主从复制的工作过程3. MySQL四种同步方式 二、docker下安装、启动mysql1. 安装主库2. 安装从库 三、配置Master(主)四、配置Slave(从)五、链接Master(主)和Slave(从)六、主从复制排错1. 错误:error connectin…

软文推广优化技巧:如何写出有创意的文案

今天媒介盒子要给大家分享的干货内容就是:如何写出有创意的文案。 时代背景会改变,大众的趣味焦点也会转移,同样再好的文案也会失效,但文案背后的触发机制不会变。下面是能够使广告文案起作用的关键因素: 一、 研究产…

【Android】TabLayout设置使用自定义的样式的图片显示问题

序言 TabLayout我们经常使用,用来和ViewPager2进行组合使用,做多Fragment切换页面效果。 TabLayout我们经常看到的的显示效果是上面文字,下面一个线段,在各大浏览器/新闻类APP可以看到,这个效果也是对TabLayout配置参…

C# .NET Core API 注入Swagger

C# .NET Core API 注入Swagger 环境 Windows 10Visual Studio 2019(2017就有可以集中发布到publish目录的功能了吧)C#.NET Core 可跨平台发布代码,超级奈斯NuGet 套件管理dll将方法封装(据说可以提高效率,就像是我们用的dll那种感觉)Swagger 让接口可视化编写时间2020-12-09 …

灵活运用Vue指令:探究v-if和v-for的使用技巧和注意事项

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、作…

【虹科干货】Lambda数据架构和Kappa数据架构——构建现代数据架构

如何更好地构建我们的数据处理架构,如何对IT系统中的遗留问题进行现代化改造并将其转变为现代数据架构?该怎么为你的需求匹配最适合的架构设计呢,本文将分析两种最流行的基于速度的数据架构,为你提供一些思路。 文章速览&#xf…

电商大促演变:拼多多百亿补贴的消费升级体验

出品| 大力财经 文 | 魏力 拼多多已经够便宜了,双十一还能怎么玩?作为一个曾经被认为是深耕五环外消费者的电商平台,这几年拼多多从五环外杀到市中心,现在的国人,不管是中产,还是职场小白,人人…

四川思维跳动商务信息咨询有限公司是真的吗?

随着数字时代的到来,短视频平台抖音已经成为亿万用户每日必刷的社交媒体。不少有远见的公司也意识到了这个平台的巨大潜力,纷纷投身其中,寻求新的商业机会。四川思维跳动商务信息咨询有限公司就是这样一家企业,他们提供的抖音电商…

C++结构体定义 创建 赋值 结构体数组

结构体是什么&#xff1f; struct是自定义数据类型&#xff0c;是一些类型集合组成的一个类型。结构体的定义方式 #include<iostream> using namespace std;struct Student {string name;int age;int score; };创建结构体变量并赋值 方式一&#xff0c;先创建结构体变…

完整版付费进群带定位源码

看到别人发那些不是挂羊头卖狗肉&#xff0c;要么就是发的缺少文件引流的。恶心的一P 这源码是我付费花钱买的分享给大家&#xff0c;功能完整。 搭建教程 nginx1.2 php5.6--7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库&#xff08;shujuk…

偶数科技亮相2023中国程序员节——数据库技术高峰论坛

2023年10月24日&#xff0c;由中国软件行业协会主办的“中国程序员节”在北京、深圳、宁波多地同时召开&#xff0c;其中数据库技术高峰论坛在北京举办&#xff0c;偶数科技亮相本次论坛并分享了题为《大模型、实时需求推动湖仓平台走向开放》的主题演讲。 国际局势复杂、科技竞…

C语言中指针的用法以及相应的作用

目录 什么是指针&#xff1f; 指针的基本操作 &#xff08;1&#xff09;变量地址引用&#xff1a; &#xff08;2&#xff09;动态内存分配&#xff1a; &#xff08;3&#xff09;数组和字符串操作&#xff1a; &#xff08;4&#xff09;函数参数传递&#xff1a; &a…

Android Mvp案例解析

目录 后端数据接口数据格式 App客户端布局逻辑主界面布局 M&#xff08;Model&#xff09;V&#xff08;View&#xff09;P&#xff08;Presenter&#xff09;OkhttpRetrofitRxJava网络http请求 Mvp架构-初学者MVP架构的契约者 后端数据接口 接口地址&#xff1a;https://apis.…

STM32——NVIC中断优先级管理分析

文章目录 前言一、中断如何响应&#xff1f;NVIC如何分配优先级&#xff1f;二、NVIC中断优先级管理详解三、问题汇总 前言 个人认为本篇文章是我作总结的最好的一篇&#xff0c;用自己的话总结出来清晰易懂&#xff0c;给小白看也能一眼明了&#xff0c;这就是写博客的意义吧…

平安人寿基于 Apache Doris 统一 OLAP 技术栈实践

导读&#xff1a;平安人寿作为保险行业领军企业&#xff0c;坚持技术创新&#xff0c;以数据业务双轮驱动的理念和更加开放的思路来应对不断增长的数据分析和应用需求&#xff1b;以深挖数据价值、保障业务用数效率为目标持续升级大数据产品体系。自 2022 年起平安人寿开始引入…