首页 > 其他分享 >React常见面试题(2024最新版)

React常见面试题(2024最新版)

时间:2024-06-12 17:32:18浏览次数:17  
标签:src 面试题 函数 DOM 渲染 React 组件 最新版

创建项目

npx create-react-app my-app

启动项目

npm start

目录结构

目录/文件名 描述
README.md 项目的自述文件
node_modules/ 项目依赖包存放目录
package.json 包管理配置文件,记录项目信息和依赖
package-lock.json 锁定依赖版本,确保跨环境一致性
public/ 公共资源目录
public/index.html 主 HTML 文件,React 应用将被引入到这里
public/favicon.ico 网站图标
public/manifest.json PWA 配置文件
src/ 源代码目录
src/components 通用功能组件
src/pages 页面组件
src/router 路由文件
src/store Redux 状态管理相关的代码
src/store/modules Redux 各个子模块
src/store/index.js Redux 组装各个子模块的文件
src/App.css App组件的样式文件
src/App.js 应用的主要组件
src/App.test.js App组件的测试文件
src/index.css 入口样式文件
src/index.js 应用的入口文件
src/logo.svg 示例 logo 文件
src/reportWebVitals.js Web Vitals 性能监测报告工具
src/setupTests.js 测试环境设置文件
.gitignore Git 版本控制系统忽略文件规则
.eslintrc.json ESLint 配置文件,用于代码风格检查
.gitattributes Git 属性配置文件
yarn.lock (如果使用 Yarn)锁定依赖版本的文件

Virtual DOM 是什么?

虚拟 DOM 是以 JS 对象的形式模拟真实 DOM。虚拟 DOM 并不直接与用户交互,而是作为实际 DOM 的抽象和中间层存在。通过 Diff 算法对比新旧虚拟 DOM 树的差异,精确地找出哪些部分发生了变化,从而对真实 DOM 中变动的部分进行最小化更新,而非重新渲染整个页面。

什么是 Diff 算法?它是如何进行比较的?

一种用于确定并计算两个对象(通常是虚拟 DOM 树)差异的算法。其核心目的是为了高效地更新用户界面(UI)。React 的 Diff 算法专注于找出新旧虚拟 DOM 树之间的最小变化集,以便尽可能快速且高效地将这些变化应用到实际的 DOM 上,以此达到 UI 的快速更新,同时减少不必要的重渲染,提升性能。

  • 分层比较(Tree Diff):首先对树进行分层遍历,而不是一次性比较整个树的所有节点。这意味着 React 只会对位于同一层级的节点进行比较,而不会跨层级直接比较。这样可以显著减少比较的复杂性。
  • 同层节点遍历:在每一层,React 从左到右遍历子节点。对于每个节点,它检查新旧节点的类型是否相同。如果类型不同,React 认为这是一个重大变更,会直接替换整个子树;如果类型相同,则继续比较属性和子节点。
  • 元素类型与属性比较:当节点类型相同时,React 会检查属性是否有变化。如果有属性变更,React 会尽可能地就地更新这些属性,而不是替换整个元素。
  • 列表比较与 Key 的作用:对于子节点是列表的情况,React 依赖于列表中每个元素的唯一 key 属性来优化比较。通过 key,React 能快速确定哪些元素是新增的、删除的或是位置发生了变化,从而减少不必要的创建和销毁操作。没有 key 或错误使用 key 会导致 React 采取较为低效的比较策略。
  • Component Diff:对于组件,React 会比较组件的类型。如果类型相同,它可能会复用已存在的组件实例并仅更新 props。如果类型不同,React 将卸载旧组件并创建新组件。

React 中 keys 的作用是什么?

key 是 React 中用于追踪哪些列表中元素被修改、删除或者被添加的辅助标识。在 Diff 算法中,key 用来判断该元素节点是被移动过来的还是新创建的元素,减少不必要的元素重复渲染。

State 和 Props 的区别是什么?

相同点
Props 和 State 是普通的 JS 对象,它们都是用来保存信息的。

不同点
State(状态):是组件自己管理数据、控制自己的状态,可以修改。
Props(属性): 是外部传入的数据参数,不可修改。

注意点:
没有 State 的叫做无状态组件,有 State 的叫做有状态组件。
多用 Props,少用 State,也就是多写无状态组件。

setState 是同步的还是异步的?

setState 通常是异步的,React 会将多个 setState 函数合并成一个队列,然后批量更新组件。

如果改变状态的代码处于某个 HTML 元素的事件中,则其是异步的,都则是同步。

什么是受控组件和非受控组件?

非受控组件:表单元素的值不由 React 直接管理,而是直接从 DOM 中读取,常使用 Ref 属性来访问 DOM 元素。
受控组件:通过 setState 将表单元素的值维护到了 state 中,需要时再从 state 中取出,这里的数据就受到了 state 的控制,称为受控组件。

什么是展示组件和容器组件?

展示组件(Presentational Components):通常是无状态的,接收来自容器组件的 Props。主要负责 UI 的呈现,即组件的外观和布局。它们专注于如何将数据渲染成用户可见的界面。
容器组件(Container Components):通常是有状态(state)的。负责管理数据和业务逻辑,决定组件如何运作。它们与数据源交互,如 API 调用、Redux store 等,并将数据传递给展示组件。

什么是高阶组件?

高阶组件(Higher-Order Components 简称 HOC)是一种函数,接受一个组件作为参数并返回一个新的组件。高阶组件内部可以对传入的组件进行包装,添加额外的属性(props)、状态管理、生命周期方法或者其他逻辑。用于实现组件的复用、逻辑的抽象和代码的组合。

React Hooks 是什么?

React Hooks 是 React 16.8 版本引入的一个特性,它允许你在不编写 class 组件的情况下使用 state 和其他 React 特性。Hooks 让函数组件也能拥有状态管理和生命周期方法等功能,从而简化组件结构,提高代码的可读性和可维护性。

useRef()和 React.createRef()的区别?

useRef():在每一次组件更新,再次执行 useRef 方法的时候,不会创建新的 ref 对象,获取到的还是第一次创建的 ref 对象(函数组件推荐使用)。
createRef():在每一次组件更新的时候,会创建一个新的 ref 对象,比较浪费性能(类组件推荐使用)。

常见或常用的 Hooks 有哪些?

useState():在函数组件中使用状态,修改状态值,更新视图。
useRef():在函数组件中获取 DOM 元素。
useEffect():在函数组件中执行副作用操作,如数据获取、订阅、定时器等。简单来说就是模拟类组件的生命周期。在第一个参数(回调函数)中,再 return 一个函数,可以清除副作用(比如:清除定时器)。
useMemo():在函数组件重新渲染时缓存计算结果,避免重复计算。类似于 Vue 的 computed。
useReducer():用来操作复杂的组件状态逻辑。参数分别是 reducer 函数和初始状态,根据 action.type 执行对行类型操作。
useCallback():在函数组件中缓存函数,避免函数每次渲染都创建新的函数。简单来说当父组件重新渲染的时候因为传递了函数给子组件,子组件也会跟着渲染。当使用 useCallback 包裹函数后,可以避免每次重新渲染都创建新的函数。
useContext():用于多层组件实现数据共享,无需显式地传递 props。
有待补充

React.memo()是什么?

React.memo() 是一个高阶组件,用于优化组件的渲染。当组件的 props 没有变化时,React.memo() 会阻止组件的渲染。
注意:调用 React.memo() 会返回一个新的组件。

import {
    useState, memo } from "react";
// React默认渲染机制,只要父组件更新,子组件也会重新渲染
// 父组件点击按钮改变名字时,子组件也会跟着修改,但其实子组件并没有改变
// 这个时候子组件没必要重新渲染
const MemoSon = memo(function Son(props) {
   
  console.log("Son", props);
  return (
    <div>
      <h3>Son</h3>
    </div>
  );
});

function App() {
   
  const [count, setCount] = useState(0);
  const [name, setName] = useState("zhangsan");
  return (
    <div>
      <h1>App</h1>
      <MemoSon count={
   count} />
      <button onClick={
   () => setCount(count +

标签:src,面试题,函数,DOM,渲染,React,组件,最新版
From: https://blog.csdn.net/wanglf_clog/article/details/139632323

相关文章

  • Vue3——ref和reactive的比较
    定义数据ref用来定义基础类型数据和对象类型数据reactive只能定义对象类型数据使用方式ref定义的响应式变量必须使用.valuereactive定义的响应式变量不能使用.value,直接使用响应式对象,但是重新分配一个新对象,会失去响应式,解决方式使用Object.assign(oldObject,newObjec......
  • 组长:你熟悉过React,开发个Next项目模板吧,我:怎么扯上关系的?
    组长:你熟悉过React,开发个Next项目模板吧,我:怎么扯上关系的?最近工作安排我开发一个Next.js项目模板,心里默笑,React用得少得都快忘光了,现在得搞Next?虽然我曾是React的老用户,但转投Vue阵营已久,React的点点滴滴早已一干二净。不过,挑战归挑战,规矩还得照做。我们通常会用内部工具来搭......
  • 【接口自动化测试框架练习】springboot+react+mysql~极简版postman
    可以说是一个toyprogram,chatgpt完成了一部分工作,我也完成了一部分工作,我俩合作的,我占百分之80%,他百分之20%,哈哈没他不行,源码奉上。https://github.com/Jinwenxin/test-api-frontend1.功能简介:分成三部分,如左侧导航栏所示:测试用例管理:测试用例的增删改查以及运行测试套件管理......
  • 【react】react-redux 使用指南
    React-Redux使用指南如下:一、引言React-Redux是为React框架设计的一个状态管理库,它基于Redux,但提供了更加便捷的方式来与React组件进行交互。通过React-Redux,你可以在整个应用程序中维护一个单一的数据源(即ReduxStore),并通过action和reducer来管理这个数据源......
  • JS类型转换面试题:[] == ![] 为true?
    前言OK,又是在学习的路上遇到了难点,今天拿来分享一哈。ok,话不多说,开始分享。下面是一道面试题console.log([]==![])你觉得上面的值打印为多少?我告诉你,打印的结果是true。如果你是猜对的或者不会可以看看我对这个问题的深度解剖,如果有大哥已经了解也欢迎在评论区指教一......
  • 力扣面试题 02.07. 链表相交
    一 题目:二思路:本题介绍两种思路解题,个人推荐思路一快速好理解 思路一: 1.先把其中一个链表的值变成负数 2.遍历另一个链表第一个出现负数的值就是交点 3.还原被改的链表 思路二:1.先用第一个链表的头节点head1搜索指针q遍历第一个链表直到为空,再把q放到head2......
  • 前端面试题日常练-day63 【面试题】
    题目希望这些选择题能够帮助您进行前端面试的准备,答案在文末1.TypeScript中,以下哪个关键字用于声明一个类的构造函数?a)constructorb)initc)created)initialize2.在TypeScript中,以下哪个符号用于声明可选的函数参数?a)?b)!c)*d)~3.TypeScript中的命名......
  • java面试题: HashMap、HashSet 和 HashTable 的区别
     HashMap常用方法 HashMap是一个基于哈希表的Map接口的实现。它允许使用null值和null键。 java复制//创建一个HashMapHashMap<KeyType,ValueType>map=newHashMap<>(); //添加元素map.put(key,value); //获取元素ValueTypevalue=map.get......
  • XMind软件安装教程及最新版下载
    简介XMind是一款实用的思维导图软件,简单易用、美观、功能强大,拥有高效的可视化思维模式,具备可扩展、跨平台、稳定性和性能,真正帮助用户提高生产率,促进有效沟通及协作。中文官方网站:http://www.xmindchina.net/。全球领先的思维导图和头脑风暴软件,拥有优秀的用户体验。凭借简......
  • 整理好了!2024年最常见 20 道分布式、微服务面试题(十)
    上一篇地址:整理好了!2024年最常见20道分布式、微服务面试题(九)-CSDN博客十九、如何设计一个高可用的分布式系统?设计一个高可用的分布式系统是一个复杂的过程,需要考虑多个方面以确保系统的鲁棒性、可扩展性和容错性。以下是一些关键的设计原则和实践:1. 冗余设计:数据冗余:通......