前端面试必备 | React 篇(P1-20)

alt

1. 请简述React是什么以及它的主要特点是什么?

React是由Facebook开发并维护的一个开源JavaScript库,用于构建用户界面(UI)。它主要用于构建大型、复杂的单页面应用(SPA),并且可以在各种平台上使用,包括Web、移动应用(如React Native)以及桌面应用(如React for Electron)。

React的主要特点包括:

  1. 组件化:React使用自上而下的方法将UI分解为可管理的部分,称为“组件”。这种组件化的方式使得代码更容易重用、测试和组织。
  2. 声明式渲染:React使用声明式的方式描述UI的更新,这意味着你只需要告诉React你想要的内容是什么,而不是详细说明如何得到这些内容。这使得代码更容易阅读和理解。
  3. 高效渲染:React使用虚拟DOM(Virtual DOM)进行渲染,这使得它能够以更高效的方式更新UI。虚拟DOM是一个轻量级的JavaScript对象,代表了实际渲染的UI。当渲染一个组件时,React会创建一个虚拟DOM,然后比较这个虚拟DOM和之前的版本,找出需要实际更新的部分,从而减少不必要的DOM操作。
  4. 灵活性和可移植性:React可以轻松地与各种其他技术(如Redux、GraphQL等)集成,并且可以在各种平台上使用,如Web、移动应用和桌面应用。
  5. 社区支持:React拥有庞大的社区,有大量的开发者和公司都在使用React,这意味着有大量的资源可供参考,包括教程、组件库、工具等。

alt

2. 描述一下React的生命周期方法,并说出它们的作用?

React的生命周期方法是指组件在其生命周期中的不同阶段可以调用的内置方法。这些方法包括以下几个阶段:

1. 挂载(Mounting):在这个阶段,组件被创建并插入到DOM中。

  • constructor(props): 在创建组件时被调用,用于初始化state和绑定事件等。
  • static getDerivedStateFromProps(): 在构造函数之后,render函数之前被调用,允许基于传入的props来改变state。
  • render(): 用于生成组件的输出。
  • componentDidMount(): 在第一次渲染之后被调用,允许执行必要的初始化操作,如请求数据、发起网络请求等。

2. 更新(Updating):在这个阶段,组件根据新的props或state进行重新渲染。

  • static getDerivedStateFromProps(): 在构造函数之后,render函数之前被调用,允许基于传入的props来改变state。
  • shouldComponentUpdate(): 可用于跳过渲染。
  • render(): 用于生成组件的输出。
  • getSnapshotBeforeUpdate(): 在新DOM被插入之前被调用,允许获取最新的DOM状态。
  • componentDidUpdate(): 在DOM更新之后被调用,允许执行必要的操作,如DOM操作、动画等。

3. 卸载(Unmounting):在这个阶段,组件被从DOM中移除。

  • componentWillUnmount(): 在组件即将卸载和销毁之前被调用,允许执行必要的清理操作,如取消网络请求、清除定时器等。

这些生命周期方法提供了控制和管理组件生命周期的能力,可以用于处理异步操作、执行必要的DOM操作、管理状态等。

3. 什么是React的状态(state)?如何更新状态?

在React中,状态(state)是一个特殊的属性,用于存储组件的数据。它是一个JavaScript对象,可以通过this.state来访问和更新。状态是组件内部维护的私有数据,只能在组件内部使用,不能在组件之间共享。

可以通过调用this.setState()方法来更新状态。这个方法接受一个对象作为参数,其中可以指定需要更新的状态字段和新的值。例如:

this.setState({ count: this.state.count + 1 });

此外,需要注意以下几点:

  • this.setState()方法应该是异步的,不应该在调用时立即更新状态。React推荐使用回调函数来确保异步操作完成后进行状态更新。
  • 如果需要从外部更新状态,可以将状态存储在父组件中,并通过props传递给子组件。
  • 频繁地调用this.setState()可能会影响性能,因为每次调用都会触发重新渲染。可以使用异步方法或者使用React的useState钩子来管理复杂的状态逻辑。

总之,状态是React组件内部维护的数据,通过this.setState()方法来更新状态,并且需要注意状态更新的异步性和性能问题。

4. 什么是React的属性(props)?它们可以改变吗?

在React中,属性(props)是传递给组件的不可变数据。它们是组件的输入,类似于函数的参数。属性通常从父组件传递给子组件,子组件只能读取和操作这些属性,但不能修改它们。

属性是一个JavaScript对象,可以通过this.props来访问。每个属性都有一个名称和值。例如:

function MyComponent({propName}) {
	return <div>{propName}</div>;
}

在这个例子中,propName是一个属性,它的值从父组件传递给子组件。子组件只能读取和操作这个属性,但不能修改它。

需要注意的是,React强调组件之间的通信应该是单向的,即父组件传递给子组件的属性不能被修改。如果需要修改属性,应该通过状态(state)来实现。

5. 什么是React的组件(component)?有哪些主要的组件类型?

React组件是构建用户界面的可重用代码块。 组件可以将界面分割成独立的、可复用的部分,每个部分只负责一个特定的功能。 通过组合不同的组件,可以构建出复杂的用户界面。

React组件有两种主要类型:函数组件和类组件。

  1. 函数组件(Functional Components): 函数组件是一个纯JavaScript函数,接收一个props对象作为参数,并返回用于描述UI的React 元素。函数组件是无状态的,不需要内部状态或生命周期方法。使用函数组件可以编写简洁、轻量级的组件。

  2. 类组件(Class Components): 类组件是ES6类的扩展,通过继承React.Component类创建。类组件具有内部状态和生命周期方法。通过定义render()方法,可以渲染React元素返回的结果。类组件提供了更多的功能和灵活性,可以处理内部状态、生命周期方法以及处理用户交互等。

除了这两种主要的组件类型,还有一些其他类型的组件,如:

  1. 高阶组件(Higher-Order Components): 高阶组件是一个函数或一个接收组件作为参数的组件。它可以增强或修改传入组件的功能,并返回一个新的组件。

  2. 嵌套组件(Nested Components): 嵌套组件指的是将一个组件嵌套在另一个组件的内部。通过嵌套组件,可以将UI分解为更小的、可复用的部分,并更好地组织代码。

  3. 无状态组件(Stateless Components): 无状态组件是指没有内部状态的组件,通常是函数组件的一种形式。无状态组件只通过props接收输入,并根据输入生成输出。

  4. 受控组件(Controlled Components): 受控组件是由React管理其内部状态的组件,通过props和事件处理程序进行数据交互。受控组件的状态由React控制,以确保数据的一致性和可追踪性。

这些组件类型提供了不同的功能和灵活性,可以根据项目的需求选择适合的组件类型。

6. 如何在React中创建组件?

在React中创建组件的方式有多种,以下是三种常见的方式:

  1. 使用React.createClass方法创建组件:
const MyComponent = React.createClass({
	render: function() {
		return <div>Hello World!</div>;
	}
});
  1. 使用类继承React.Component类创建组件:
class MyComponent extends React.Component {
	render() {
		return <div>Hello World!</div>;
	}
}
  1. 使用函数组件和React.forwardRef方法创建组件:
const MyComponent = React.forwardRef((props, ref) => {
	return <div>Hello World!</div>;
});

以上三种方式都可以创建React组件,根据需要选择适合的方式即可。

7. 描述一下JSX和普通的JavaScript对象之间的区别是什么?

JSX是一种将JavaScript和XML结合在一起的语法扩展。它允许我们在JavaScript代码中编写类似HTML的结构,用来描述界面的结构和内容。与传统的JavaScript对象相比,JSX具有几个显著的区别:

  1. 语法:JSX的语法类似于HTML或XML语法,更易于阅读和编写。它使用尖括号(<>)表示元素标签,并使用类似HTML的属性语法。

  2. 元素表示:JSX中的元素代表实际的React组件或HTML标签。与JavaScript对象不同,JSX元素具有特殊的表示形式,例如<div><MyComponent>

  3. 表达式嵌入:在JSX中,可以像在HTML中一样嵌入JavaScript表达式。通过将表达式用花括号({})包裹起来,可以在JSX中动态地插入值或表达式。

  4. 属性和事件处理:在JSX中,可以使用类似HTML的属性语法对元素添加属性。这些属性可以用来传递数据或事件处理程序给组件。

  5. 无需转换:当使用JSX时,不需要手动将JSX转换为JavaScript对象。React框架会在编译阶段将JSX代码转换为等效的JavaScript代码,然后再执行。这样,开发者可以更直观地编写和理解界面代码。

特征 JSX JavaScript对象
语法 类似于HTML或XML的语法 纯JavaScript语法
元素表示 使用尖括号(<>)标记元素 无特殊标记的JavaScript对象
表达式嵌入 可以在花括号({})中嵌入JavaScript表达式 无法直接嵌入JavaScript表达式
属性和事件处理 使用类似HTML的属性语法 属性和方法需要手动添加到对象中
转换 在编译阶段会被转换为等效的JavaScript代码 需要手动将JavaScript对象转换为其他形式
目的 用于描述React组件或HTML标签的结构和内容 用于存储和操作数据、实现复杂的业务逻辑

使用表格可以更清晰地对比JSX和普通的JavaScript对象之间的区别。JSX提供了一种更直观、易读易写的语法,用于描述界面的结构和内容,并且还可以方便地插入表达式、添加属性和事件处理。普通的JavaScript对象则更适用于存储和操作数据、实现复杂的业务逻辑。

总的来说,JSX提供了一种更直观、读写性更好的方式来描述界面结构和内容,并且与普通的JavaScript对象在语法和功能上有一些区别。它使得编写React组件更加方便和易于理解。

8. 在JSX中,class和className有什么区别?

在JSX中,classclassName实际上都是用于指定HTML元素的样式。然而,它们在用法和来源上有一些区别。

1. class:这是ES6引入的新特性,允许在JSX中使用静态类名。这是JavaScript语言的一个部分,可以在组件的JavaScript代码中直接使用。例如:

function MyComponent() {
	return <div class="my-class"></div>;
}

2. className:这是旧的JSX语法,用于在JSX中动态设置元素的样式。这个属性来自于DOM API,通常在JavaScript代码外部的CSS样式表中定义。例如:

function MyComponent() {
	const [isActive, setIsActive] = useState(false);
	return <div className={isActive ? "active" : ""}></div>;
}

总结:

  • class是ES6引入的新特性,可以在JSX中直接使用静态类名。
  • className是旧的JSX语法,用于在JSX中动态设置元素的样式,通常与外部CSS样式表中的类名一起使用。
特征 class className
用途 用于指定HTML元素的类名 用于指定React组件的类名
语法 使用class属性 使用className属性
冲突解决 在React中使用className避免与JavaScript的class关键字冲突 使用class关键字可能会导致语法错误
类名解析 支持多个类名,使用空格分隔 只支持设置一个类名
动态类名绑定 不支持动态类名绑定,所有类名都要在编码时写死 支持动态类名绑定,可以基于条件或变量设置类名

这个表格总结了class和className的不同之处。在HTML中,用class属性指定元素的类名,在React中为了避免与JavaScript的class关键字冲突,使用了className属性来指定组件的类名。与class不同,className属性只支持设置一个类名,而class属性支持设置多个类名,类名之间需要用空格分隔。另外,className属性还可以支持动态类名绑定,可以根据条件或变量的值来动态设置类名,而class属性不支持动态类名绑定,所有类名都需要在编码时写死。

9. 什么是React的渲染(rendering)?

在React中,渲染是指将组件转换(或“渲染”)成HTML的过程。当你在React应用程序中创建和组合组件时,最终的结果是生成一系列的HTML元素,它们组成了你的应用的用户界面。

React使用一种称为JSX的语法扩展了JavaScript,使得你可以以一种更接近于HTML的方式来编写JavaScript代码。在JSX中,你可以创建并组合组件,然后React将这些组件转换(或“渲染”)成实际的HTML。

例如,下面是一个简单的React组件,它渲染一个带有一些文本的div元素:

function MyComponent() {
	return <div>Hello, world!</div>;
}

在这个例子中,MyComponent是一个函数组件,它返回一个JSX元素(在这种情况下是一个div元素)。当这个组件被渲染时,React会将这个JSX元素转换成一个实际的HTML div元素。

值得注意的是,React的渲染过程是虚拟的,也就是说它并不会直接修改DOM。相反,React会维护一个内部的数据结构,称为“虚拟DOM”(Virtual DOM)。每次组件的状态改变时,React都会创建一个新的虚拟DOM,并将旧的虚拟DOM与新的虚拟DOM进行比较。然后,React会计算出最小的改变集,并将这些改变应用到实际的DOM中,从而实现了高效的界面更新。

10. 什么是React的上下文(context)?如何使用它?

React的上下文(context)是一种允许组件共享数据的方式,这些组件可能没有直接的父子关系。通过使用上下文,你可以避免在组件树中一层一层传递数据,从而减少代码的复杂性和可读性。

在React中,上下文通常用于以下情况:

  1. 在大型应用程序中共享数据:在大型应用程序中,你可能需要在多个层级之间共享某些数据。通过使用上下文,你可以避免在组件树中多次传递数据。
  2. 避免使用昂贵的属性:当你需要将某些数据从父组件传递给子组件时,你可能会通过属性(props)进行传递。然而,在某些情况下,这种做法可能不切实际,特别是在需要传递大量数据的情况下。通过使用上下文,你可以避免这种开销。

要使用React的上下文,你需要执行以下步骤:

  1. 创建一个上下文提供者(Context Provider):上下文提供者是一个React组件,它负责提供共享的数据或状态。你需要创建一个上下文对象,并将其传递给上下文提供者。
  2. 在你的应用程序中使用Context API:你可以通过使用Context API来获取和传递上下文中的数据。Context API包括useContext Hook,它允许你在组件中获取上下文数据。

下面是一个简单的例子,展示了如何使用React的上下文:

import React from 'react';

// 创建一个上下文对象
const MyContext = React.createContext(defaultValue);

class MyProvider ex

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

前端面试必备 文章被收录于专栏

前端面试必备知识点:HTML和CSS、JS(变量/数据类型/操作符/条件语句/循环;面向对象编程/函数/闭包/异步编程/ES6)、DOM操作、HTTP和网络请求、前端框架、前端工具和构建流程、浏览器和性能优化、跨浏览器兼容性、前端安全、数据结构和算法、移动端开发技术、响应式设计、测试和调试技巧、性能监测等。准备面试时,建议阅读相关的技术书籍、参与项目实践、刷题和练习,以深化和巩固你的知识。

全部评论
钩子(Hook)是React 16.8版本引入的一种特性,它可以让你在函数组件中使用状态和其他React特性,以替代类组件中的生命周期方法。
点赞
送花
回复 分享
发布于 2023-08-29 23:03 广东
React Router是一个用于构建单页面应用的React库,它提供了一组组件,用于管理应用程序的URL,并在页面之间进行切换。
点赞
送花
回复 分享
发布于 2023-08-29 23:41 广东
国泰君安
校招火热招聘中
官网直投
React组件是构建用户界面的可重用代码块。 组件可以将界面分割成独立的、可复用的部分,每个部分只负责一个特定的功能。 通过组合不同的组件,可以构建出复杂的用户界面。
点赞
送花
回复 分享
发布于 2023-08-31 15:20 广东

相关推荐

4 10 评论
分享
牛客网
牛客企业服务