React作为当前最流行的前端框架之一,一直是面试中的热门考点。无论是初学者还是有一定经验的开发者,掌握React的基础知识都是必不可少的。本文为你整理了2025年React基础面试题及详细解析,帮助你快速复习和巩固知识点。
React是一个用于构建用户界面的JavaScript库,由Facebook开发并开源。它专注于构建单个组件,通过组合组件来构建复杂的用户界面。React的核心思想是声明式编程,它通过虚拟DOM(Virtual DOM)来提高性能,并且能够高效地更新和渲染组件。
声明式编程:代码更易于理解和维护。
组件化:通过组件复用和组合构建复杂界面。
单向数据流:数据从父组件流向子组件,通过props传递。
虚拟DOM:提高性能,减少真实DOM操作。
组件(Component):React的核心是组件,组件可以是类组件或函数组件。
状态(State):状态是组件内部可变的数据,通过useState
或this.state
管理。
属性(Props):属性是组件之间的数据传递方式,是只读的。
React组件可以通过两种方式创建:函数组件和类组件。
函数组件:
jsx复制
function Welcome(props) {
return Hello, {props.name}
;
}
类组件:
jsx复制
class Welcome extends React.Component {
render() {
return Hello, {this.props.name}
;
}
}
状态可以通过useState
(函数组件)或this.state
(类组件)管理。
函数组件中的状态:
jsx复制
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
You clicked {count} times
);
}
类组件中的状态:
jsx复制
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
render() {
return (
You clicked {this.state.count} times
);
}
}
数据通过props从父组件传递到子组件。
jsx复制
function ParentComponent() {
return ;
}
function ChildComponent(props) {
return {props.message};
}
事件处理函数可以通过onClick
、onChange
等事件属性绑定。
jsx复制
function Button() {
function handleClick() {
alert('Button clicked!');
}
return ;
}
React类组件的生命周期分为三个阶段:挂载阶段、更新阶段和卸载阶段。
挂载阶段:
constructor
render
componentDidMount
更新阶段:
shouldComponentUpdate
render
componentDidUpdate
卸载阶段:
componentWillUnmount
React Hooks提供了在函数组件中使用生命周期的能力,常见的Hooks包括:
useState:用于声明状态变量。
useEffect:用于执行副作用操作(类似于componentDidMount
、componentDidUpdate
和componentWillUnmount
)。
useContext:用于访问React Context。
useMemo:用于缓存计算结果。
useCallback:用于缓存回调函数。
useEffect
?useEffect
用于在组件渲染后执行副作用操作,例如数据请求、订阅或手动更改DOM。
jsx复制
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count]); // 仅在count变化时重新执行
return (
);
}
React组件的性能优化主要从减少不必要的渲染和优化渲染过程入手:
使用React.memo
:对函数组件进行浅比较,避免不必要的渲染。
jsx复制
const MyComponent = React.memo(function MyComponent(props) {
/* 只有props变化时才会重新渲染 */
});
使用useMemo
和useCallback
:缓存计算结果和回调函数,避免重复计算。
jsx复制
function ParentComponent() {
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
return ;
}
合理使用shouldComponentUpdate
:在类组件中,通过shouldComponentUpdate
控制是否需要重新渲染。
jsx复制
class MyComponent extends React.Component {
shouldComponentUpdate(nextProps, nextState) {
return nextProps.id !== this.props.id;
}
render() {
return {this.props.id};
}
}
过度渲染是React性能问题的常见原因之一,可以通过以下方式避免:
避免在渲染函数中直接调用函数:
jsx复制
// 错误:每次渲染都会创建一个新的函数
// 正确:使用绑定的函数
避免在组件中直接操作DOM:尽量使用React的状态和生命周期方法来操作DOM。
React Context提供了一种在组件树中传递数据的方式,而无需逐层传递props。它常用于全局状态管理,例如主题切换、用户登录状态等。
jsx复制
const ThemeContext = React.createContext('light');
function App() {
return (
);
}
function Toolbar() {
return (
);
}
function ThemedButton() {
const theme = useContext(ThemeContext);
return (
);
}
Redux是一个独立的状态管理库,常与React结合使用。它通过store
、actions
和reducers
来管理全局状态。
安装Redux和React-Redux:
bash复制
npm install redux react-redux
创建Redux Store:
jsx复制
import { createStore } from 'redux';
function reducer(state = { count: 0 }, action) {
switch (action.type) {
case 'INCREMENT':
return { count: state.count + 1 };
case 'DECREMENT':
return { count: state.count - 1 };
default:
return state;
}
}
const store = createStore(reducer);
在React中使用Redux:
jsx复制
import { Provider, useSelector, useDispatch } from 'react-redux';
function App() {
return (
);
}
function Counter() {
const count = useSelector(state => state.count);
const dispatch = useDispatch();
return (
{count}
);
}
在面试中,不仅要回答问题,还要展示你的思考过程和解决问题的能力。例如,当被问到“如何优化React组件性能”时,可以先分析问题的背景,然后提出具体的优化方案。
复习基础知识:确保你熟悉React的核心概念,如组件、状态、生命周期和Hooks。
练习常见面试题:通过在线平台(如LeetCode、Stack Overflow)练习React相关的面试题。
阅读开源代码:通过阅读React或React相关库的源代码,提升你的理解和实践能力。
准备项目经验:结合你参与过的项目,展示如何在实际开发中应用React。