面试 React 框架八股文十问十答第四期

面试 React 框架八股文十问十答第四期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

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

React 中的重新渲染可以由以下几种情况触发:

  • 状态变化(State Changes): 当组件的状态(state)发生变化时,render 方法会被调用,导致组件重新渲染。
  • 属性变化(Props Changes): 当组件的属性(props)发生变化时,同样会触发重新渲染。
  • 强制重新渲染(Force Update): 可以使用 forceUpdate 方法来强制触发重新渲染,但一般情况下应该避免使用这个方法。

在重新渲染时,React 会执行以下步骤:

  • 调用 render 方法: React 调用组件的 render 方法生成虚拟 DOM。
  • 比较虚拟 DOM: React 使用虚拟 DOM 的比较算法确定实际 DOM 的变化。
  • 应用变化: 如果有变化,React 会更新实际 DOM 以反映变化。

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

React 使用一种称为“协调(Reconciliation)”的算法来判断何时重新渲染组件。当组件的状态或属性发生变化时,React 会触发协调过程。在协调过程中,React 会比较前后两次渲染的虚拟 DOM 树,找出变化的部分,然后更新实际的 DOM。

React 使用一些优化策略,如虚拟 DOM 的差异比较和“键”(key)的使用,以提高性能。这样,React 能够最小化实际 DOM 的更新,只更新发生变化的部分。

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

在 React 中,有两种主要声明组件的方式:

  • 类组件(Class Components): 使用 ES6 的类语法来声明组件,继承自 React.Component。类组件具有状态(state)和生命周期方法,适用于复杂的组件逻辑。

    示例:

    class MyClassComponent extends React.Component {render() {return <div>Hello, World!</div>;}
    }
    
  • 函数组件(Functional Components): 使用函数来声明组件,通常用于简单的无状态组件。函数组件在 React 16.8 版本引入了钩子(Hooks),使其具备了处理状态和生命周期的能力。

    示例:

    function MyFunctionalComponent() {return <div>Hello, World!</div>;
    }
    

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

  • 有状态组件: 有状态组件是指继承自 React.Component 的类组件,具有内部状态(state)和生命周期方法。适用于需要管理复杂状态和生命周期的组件,如处理用户输入、数据获取等。

    示例:

    class MyStatefulComponent extends React.Component {constructor(props) {super(props);this.state = { count: 0 };}render() {return <div>Count: {this.state.count}</div>;}
    }
    
  • 无状态组件: 无状态组件是指使用函数声明的组件,通常称为函数组件。它没有内部状态,仅依赖于传入的属性(props)。适用于简单的展示型组件,只关注 UI 渲染。

    示例:

    function MyFunctionalComponent(props) {return <div>{props.message}</div>;
    }
    

选择有状态组件还是无状态组件取决于组件的功能和需求。有状态组件适用于需要管理内部状态和生命周期的情况,而无状态组件则适用于只依赖于传入属性进行渲染的简单组件。

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

Fragment(React.Fragment) 是一种特殊的组件,允许在不添加额外节点的情况下组合多个子元素。它在渲染时不会在 DOM 中创建额外的父节点,只是将子元素直接渲染出来。

使用场景包括:

  • 包裹多个元素: 当需要在组件中返回多个子元素,而又不想为它们添加额外的父节点时,可以使用 Fragment。
  • 在列表中使用: 在使用 map 渲染列表时,可以使用 Fragment 包裹每个项,而不会引入额外的 DOM 节点。

示例:

function MyComponent() {return (<React.Fragment><h1>Title</h1><p>Paragraph 1</p><p>Paragraph 2</p></React.Fragment>);
}

在 React 16.2 版本之前,可以使用空的尖括号 <>...</> 语法作为 Fragment 的简写形式。Fragment 可以帮助开发者更灵活地组织组件结构,而不引入不必要的 DOM 元素。

6)React 如何获取组件对应的 DOM 元素?

在 React 中,可以使用 ref(引用)来获取组件对应的 DOM 元素。ref 是 React 提供的一种访问 DOM 节点或类组件实例的方式。在类组件中,可以通过 React.createRef() 创建一个 ref 对象,并将其赋值给组件的 ref 属性。在函数组件中,可以使用 useRef 钩子来创建 ref。

示例:

class MyComponent extends React.Component {constructor(props) {super(props);this.myRef = React.createRef();}componentDidMount() {// 访问 DOM 元素console.log(this.myRef.current);}render() {return <div ref={this.myRef}>Hello, World!</div>;}
}

在上述例子中,this.myRef 将保存对 <div> 元素的引用,可以在 componentDidMount 生命周期方法中访问它。

7)React 可以在 render 访问 refs 吗?为什么?

在 React 中,refrender 阶段是可以被访问的。当组件被渲染时,ref 属性会被传递给对应的 DOM 元素或类组件实例。但需要注意的是,访问 ref 得到的是实时的 DOM 或组件实例。

class MyComponent extends React.Component {constructor(props) {super(props);this.myRef = React.createRef();}render() {// 在 render 阶段访问 refconsole.log(this.myRef.current);return <div ref={this.myRef}>Hello, World!</div>;}
}

在上述例子中,console.log(this.myRef.current)render 方法中被调用,但此时可能返回的是 null,因为 render 阶段可能早于 DOM 的真实创建。通常,访问 ref 的最佳时机是在 componentDidMount 生命周期方法中,确保在组件已经挂载到 DOM 后再进行操作。

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

React 的插槽(Portals)是一种将子组件渲染到 DOM 结构中的不同位置的机制。使用 ReactDOM.createPortal(child, container) 方法可以创建一个 portal,将 child 渲染到 container 中。这使得子组件可以脱离父组件的 DOM 层级,而渲染到 DOM 树的其他位置。

使用场景包括:

  • 模态框(Modal): 将模态框组件渲染到 DOM 树的根节点,而不是组件的直接父元素。
  • 全局通知: 在应用中的任何位置渲染通知消息,而不受组件层级的限制。
  • 将组件插入到具有特定样式或层级的 DOM 元素中。

示例:

// PortalComponent.js
import React from 'react';
import ReactDOM from 'react-dom';const PortalComponent = () => {return ReactDOM.createPortal(<div className="portal-container">This is a portal component.</div>,document.getElementById('portal-root') // 插入到指定的 DOM 元素);
};export default PortalComponent;
// App.js
import React from 'react';
import PortalComponent from './PortalComponent';const App = () => {return (<div><h1>Main Content</h1>{/* PortalComponent 被渲染到 id 为 "portal-root" 的 DOM 元素中 */}<PortalComponent /></div>);
};export default App;

9)在React中如何避免不必要的render?

在 React 中,避免不必要的渲染对性能是至关重要的。以下是一些常见的方法:

  • 使用 PureComponent 或 React.memo: PureComponent 和 React.memo 都可以帮助组件实现浅层的 props 和 state 比较,从而避免不必要的渲染。PureComponent 对于类组件,而 React.memo 对于函数组件。

    // 使用 PureComponent
    class MyComponent extends React.PureComponent {// ...
    }// 或使用 React.memo(适用于函数组件)
    const MyFunctionalComponent = React.memo((props) => {// ...
    });
    
  • 使用 shouldComponentUpdate 钩子: 在类组件中,可以手动实现 shouldComponentUpdate 钩子,根据新旧 props 或 state 的比较结果来决定是否重新渲染。

    class MyComponent extends React.Component {shouldComponentUpdate(nextProps, nextState) {// 根据需要的比较逻辑返回 true 或 falsereturn nextProps.someValue !== this.props.someValue;}// ...
    }
    
  • 避免在 render 方法中创建新的对象: 避免在 render 方法中创建新的对象,因为每次渲染都会创建新的引用,可能触发不必要的渲染。

  • 使用 useCallback 和 useMemo: 使用 useCallback 来缓存回调函数,使用 useMemo 来缓存计算结果,以避免它们在每次渲染时都被重新创建。

10)对 React-Intl 的理解,它的工作原理?

React-Intl 是 React 应用中处理国际化(i18n)的库。它基于 Intl API 提供了对日期、时间、数字和消息格式化的支持。

工作原理:

  1. 安装和配置: 首先,需要安装 react-intl 库,并配置提供给应用的本地化数据,如日期格式、货币格式等。
  2. 使用 FormattedMessage 组件: 使用 FormattedMessage 组件来包

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

已 300 + Star!

⭐点赞⭐收藏⭐不迷路!⭐

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

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

相关文章

史上最全的Nmap应用案例集合100个命令

1.Nmap规格说明 控制参数应用举例含义描述nmap 192.168.1.1扫描 单个IPnmap 192.168.1.1 192.168.2.1扫描多个IPnmap 192.168.1.1-254扫描一个IP段nmap scanme.nmap.org扫描一个域名nmap 192.168.1.0/24使用CIDR表示法进行扫描-iLnmap -iL targets.txt从一个文件中加载目标扫描…

【uniapp】遇到的一些问题

一、小程序中textarea ios样式不生效的方法 默认有内边距&#xff0c;加个disable-default-padding"true" 二、uni-data-picker循环使用&#xff0c;一个改了全局的值 换成了uni自带的picker&#xff0c;下面括号里必须有默认值&#xff0c;为空字符串的时候&…

软件架构之事件驱动架构

一、定义 事件驱动的架构是围绕事件的发布、捕获、处理和存储&#xff08;或持久化&#xff09;而构建的集成模型。 某个应用或服务执行一项操作或经历另一个应用或服务可能想知道的更改时&#xff0c;就会发布一个事件&#xff08;也就是对该操作或更改的记录&#xff09;&am…

STM32 使用 DS18B20 温度传感器实现环境温度监测

为了实现环境温度监测系统&#xff0c;我们可以利用STM32微控制器和DS18B20数字温度传感器。在本文中&#xff0c;我们将介绍如何通过STM32微控制器读取DS18B20传感器的温度数据&#xff0c;并展示一个简单的示例代码。 1. 系统概述 环境温度监测系统旨在使用DS18B20数字温度…

代码随想录第五十二天——最长递增子序列,最长连续递增序列,最长重复子数组

leetcode 300. 最长递增子序列 题目链接&#xff1a;最长递增子序列 dp数组及下标的含义 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度递推公式 位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 1 的最大值 所以if (nums[i] > nums[j]) dp[i]…

认识Linux指令 “zip/unzip” 指令

01.zip/unzip指令 语法&#xff1a; zip 压缩文件.zip 目录或文件 功能&#xff1a; 将目录或文件压缩成zip格式 常用选项&#xff1a; -r 递归处理&#xff0c;将指定目录下的所有文件和子目录一并处理 举例 将test2目录压缩&#xff1a;zip test2.zip test2/* 解压到…

代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串

39. 组合总和 题目&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个…

什么是预训练Pre-training—— AIGC必备知识点,您get了吗?

Look&#xff01;&#x1f440;我们的大模型商业化落地产品&#x1f4d6;更多AI资讯请&#x1f449;&#x1f3fe;关注Free三天集训营助教在线为您火热答疑&#x1f469;&#x1f3fc;‍&#x1f3eb; 随着人工智能(AI)不断重塑我们的世界&#xff0c;其发展的一个关键方面已经…

springboot医院信管系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

浙大恩特客户资源管理系统 CrmBasicAction.entcrm任意文件上传

产品介绍 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源&#xff0c;提升销售和市场营销的效果。 漏洞描述 浙大恩特客户资源管理系统 fcrmbasicaction接口存在任意文件上传漏洞。攻击者可通过该漏洞在服务器…

PTA——闰年判断

输入一个年份&#xff0c;判断其是否为闰年&#xff0c;是闰年输出True&#xff0c;不是闰年输出False。 闰年的判断条件&#xff1a;年号能被4整除&#xff0c;但不能被100整除&#xff1b;或者能被400整除。 输入格式: 输入年号&#xff0c;如&#xff1a;2023。 输出格式…

机器学习笔记:时间序列异常检测

1 异常类型 1.1 异常值outlier 给定输入时间序列&#xff0c;异常值是时间戳值其中观测值与该时间序列的期望值不同。 1.2 波动点&#xff08;Change Point&#xff09; 给定输入时间序列&#xff0c;波动点是指在某个时间t&#xff0c;其状态在这个时间序列上表现出与t前后…

C语言——!(--x)和!(-x)以及while(!(--x)) 和 while(!(-x))

一、!(--x) 和 !(-x) 1. !(--x) 这个表达式表示先对变量 x 执行自减操作&#xff08;即 x 的值减去 1&#xff09;&#xff0c;然后对自减后得到的结果取逻辑非。 如果自减后的 x 等于 0&#xff0c;则逻辑非运算的结果为真&#xff08;值为 1&#xff09;&#xff1b;否则结果…

Java加密解密大全(MD5、RSA)

目录 一、MD5加密二、RSA加解密(公加私解&#xff0c;私加公解)三、RSA私钥加密四、RSA私钥加密PKCS1Padding模式 一、MD5加密 密文形式&#xff1a;5eb63bbbe01eeed093cb22bb8f5acdc3 import java.math.BigInteger; import java.security.MessageDigest; import java.security…

京东(天猫淘宝)数据分析工具-鲸参谋系统全功能解析——行业大盘、红蓝海市场、品牌分析、店铺分析、商品分析、竞品监控(区分自营和POP)

作为第三方电商数据平台&#xff0c;鲸参谋电商大数据系统能够为品牌方和商家提供包括行业趋势、热门品牌、店铺分析、单品分析在内的多个层面数据分析&#xff0c;帮助商家做出更加准确的经营决策&#xff0c;提升经营效率&#xff0c;实现精准营销。 下面&#xff0c;我们针…

linux和windows机器下创建共享文件夹

1、安装samba sudo apt-get install samba 2、创建共享文件夹 sudo mkdir /smb sudo chmod 777 /smb/ 3、备份配置 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak 4、修改配置 sudo vim /etc/samba/smb.conf 添加以下信息到文件结尾 [SMB share] #描述信息…

压测必经之路,Jmeter分布式压测教程

01、分布式压测原理 Jemter分布式压测是选择其中一台作为调度机&#xff08;master&#xff09;&#xff0c;其他机器作为执行机&#xff08;slave&#xff09;&#xff1b;当然一台机器也可以既做调度机&#xff0c;也做执行机。 调度机执行脚本的时候&#xff0c;master将会…

Springboot的配置文件详解:从入门到精通,解读配置文件的奇妙世界

目录 1、前言 2、介绍 2.1 Springboot配置文件的作用 2.2 Springboot支持的配置文件类型 2.3 Springboot配置文件的加载顺序 3、YAML配置文件 3.1 YAML基本语法介绍 3.2 YAML中的基本数据类型 3.3 YAML中的复合数据类型 3.4 YAML中的配置属性 3.5 YAML中的多环境配置…

Python虚拟环境轻松配置:Jupyter Notebook中的内核管理指南

问题 在Python开发中&#xff0c;一些人在服务器上使用Jupyter Notebook中进行开发。一般是创建虚拟环境后&#xff0c;向Jupyter notebook中添加虚拟环境中的Kernel&#xff0c;后续新建Notebook中在该Kernel中进行开发&#xff0c;这里记录一下如何创建Python虚拟环境以及添…

前端缓存的方式

Service Workers 【可以缓存资源的请求&#xff0c;参考】web Storage【LocalStorage/SessionStorage】IndexedDB【这个相当于浏览器中的数据库&#xff0c;请看官网】Cache API【这个我没用过&#xff0c;可以看官网&#xff0c;是实验性技术】Http 缓存头【通过expires 和 ca…