如果你是一位有抱负的前端程序员并准备面试,那么这篇文章很适合你。本文是你学习和面试 React 所需知识的***指南。
JavaScript 工具缓慢而稳定地在市场中扎根,对 React 的需求呈指数级增长。选择合适的技术来开发应用或网站变得越来越有挑战性。其中 React 被认为是增长最快的 Javascript 框架。
截至今天,Github 上约有1,000名贡献者。 Virtual DOM 和可重用组件等独特功能吸引了前端开发人员的注意力。尽管它只是 MVC(模型 - 视图 - 控制器)中“视图”的库,但它对 Angular,Meteor,Vue 等全面的框架也构成了强力的挑战。下图为流行的 JS 框架的趋势:
JS 框架的趋势
React 面试题
以下是面试官最有可能问到的 50 个 React 面试题和答案 。为方便你学习,我对它们进行了分类:
1. 区分Real DOM和Virtual DOM
3. React有什么特点?
React的主要功能如下:
4. 列出React的一些主要优点。
React的一些主要优点是:
5. React有哪些限制?
React的限制如下:
6. 什么是JSX?
JSX 是J avaScript XML 的简写。是 React 使用的一种文件,它利用 JavaScript 的表现力和类似 HTML 的模板语法。这使得 HTML 文件非常容易理解。此文件能使应用非常可靠,并能够提高其性能。下面是JSX的一个例子:
- render(){
- return(
- <div>
- <h1> Hello World from Edureka!!</h1>
- </div>
- );
- }
7. 你了解 Virtual DOM 吗?解释一下它的工作原理。
Virtual DOM 是一个轻量级的 JavaScript 对象,它最初只是 real DOM 的副本。它是一个节点树,它将元素、它们的属性和内容作为对象及其属性。 React 的渲染函数从 React 组件中创建一个节点树。然后它响应数据模型中的变化来更新该树,该变化是由用户或系统完成的各种动作引起的。
Virtual DOM 工作过程有三个简单的步骤。
1.每当底层数据发生改变时,整个 UI 都将在 Virtual DOM 描述中重新渲染。
2.然后计算之前 DOM 表示与新表示的之间的差异。
3.完成计算后,将只用实际更改的内容更新 real DOM。
8. 为什么浏览器无法读取JSX?
浏览器只能处理 JavaScript 对象,而不能读取常规 JavaScript 对象中的 JSX。所以为了使浏览器能够读取 JSX,首先,需要用像 Babel 这样的 JSX 转换器将 JSX 文件转换为 JavaScript 对象,然后再将其传给浏览器。
9. 与 ES5 相比,React 的 ES6 语法有何不同?
以下语法是 ES5 与 ES6 中的区别:
1.require 与 import
- // ES5
- var React = require('react');
- // ES6
- import React from 'react';
2.export 与 exports
- // ES5
- module.exports = Component;
- // ES6
- export default Component;
3.component 和 function
- // ES5
- var MyComponent = React.createClass({
- render: function() {
- return
- <h3>Hello Edureka!</h3>;
- }
- });
- // ES6
- class MyComponent extends React.Component {
- render() {
- return
- <h3>Hello Edureka!</h3>;
- }
- }
4.props
- // ES5
- var App = React.createClass({
- propTypes: { name: React.PropTypes.string },
- render: function() {
- return
- <h3>Hello, {this.props.name}!</h3>;
- }
- });
- // ES6
- class App extends React.Component {
- render() {
- return
- <h3>Hello, {this.props.name}!</h3>;
- }
- }
5.state
- // ES5
- var App = React.createClass({
- getInitialState: function() {
- return { name: 'world' };
- },
- render: function() {
- return
- <h3>Hello, {this.state.name}!</h3>;
- }
- });
- // ES6
- class App extends React.Component {
- constructor() {
- super();
- this.state = { name: 'world' };
- }
- render() {
- return
- <h3>Hello, {this.state.name}!</h3>;
- }
- }
10. React与Angular有何不同?
React AngularReact 组件
11. 你怎样理解“在React中,一切都是组件”这句话。
组件是 React 应用 UI 的构建块。这些组件将整个 UI 分成小的独立并可重用的部分。每个组件彼此独立,而不会影响 UI 的其余部分。
12. 怎样解释 React 中 render() 的目的。
每个React组件强制要求必须有一个
render()
。它返回一个 React 元素,是原生 DOM 组件的表示。如果需要渲染多个 HTML 元素,则必须将它们组合在一个封闭标记内,例如
<form>
、
<group>
、
<div>
等。此函数必须保持纯净,即必须每次调用时都返回相同的结果。
13. 如何将两个或多个组件嵌入到一个组件中?
可以通过以下方式将组件嵌入到一个组件中:
- class MyComponent extends React.Component{
- render(){
- return(
- <div>
- <h1>Hello</h1>
- <Header/>
- </div>
- );
- }
- }
- class Header extends React.Component{
- render(){
- return
- <h1>Header Component</h1>
- };
- }
- ReactDOM.render(
- <MyComponent/>, document.getElementById('content')
- );
14. 什么是 Props?
Props 是 React 中属性的简写。它们是只读组件,必须保持纯,即不可变。它们总是在整个应用中从父组件传递到子组件。子组件永远不能将 prop 送回父组件。这有助于维护单向数据流,通常用于呈现动态生成的数据。
15. React中的状态是什么?它是如何使用的?
状态是 React 组件的核心,是数据的来源,必须尽可能简单。基本上状态是确定组件呈现和行为的对象。与props 不同,它们是可变的,并创建动态和交互式组件。可以通过
this.state()
访问它们。
16. 区分状态和 props
State Props17. 如何更新组件的状态?
可以用
this.setState()
更新组件的状态。
- class MyComponent extends React.Component {
- constructor() {
- super();
- this.state = {
- name: 'Maxx',
- id: '101'
- }
- }
- render()
- {
- setTimeout(()=>{this.setState({name:'Jaeha', id:'222'})},2000)
- return (
- <div>
- <h1>Hello {this.state.name}</h1>
- <h2>Your Id is {this.state.id}</h2>
- </div>
- );
- }
- }
- ReactDOM.render(
- <MyComponent/>, document.getElementById('content')
- );
18. React 中的箭头函数是什么?怎么用?
箭头函数( => )是用于编写函数表达式的简短语法。这些函数允许正确绑定组件的上下文,因为在 ES6 中默认下不能使用自动绑定。使用高阶函数时,箭头函数非常有用。
- //General way
- render() {
- return(
- <MyInput onChange = {this.handleChange.bind(this) } />
- );
- }
- //With Arrow Function
- render() {
- return(
- <MyInput onChange = { (e)=>this.handleOnChange(e) } />
- );
- }
19. 区分有状态和无状态组件。
有状态组件 无状态组件21. 详细解释 React 组件的生命周期方法。
一些最重要的生命周期方法是:
22. React中的事件是什么?
在 React 中,事件是对鼠标悬停、鼠标单击、按键等特定操作的触发反应。处理这些事件类似于处理 DOM 元素中的事件。但是有一些语法差异,如:
事件参数重包含一组特定于事件的属性。每个事件类型都包含自己的属性和行为,只能通过其事件处理程序访问。
23. 如何在React中创建一个事件?
- class Display extends React.Component({
- show(evt) {
- // code
- },
- render() {
- // Render the div with an onClick prop (value is a function)
- return (
- <div onClick={this.show}>Click Me!</div>
- );
- }
- });
24. React中的合成事件是什么?
合成事件是围绕浏览器原生事件充当跨浏览器包装器的对象。它们将不同浏览器的行为合并为一个 API。这样做是为了确保事件在不同浏览器中显示一致的属性。
25. 你对 React 的 refs 有什么了解?
Refs 是 React 中引用的简写。它是一个有助于存储对特定的 React 元素或组件的引用的属性,它将由组件渲染配置函数返回。用于对 render() 返回的特定元素或组件的引用。当需要进行 DOM 测量或向组件添加方法时,它们会派上用场。
- class ReferenceDemo extends React.Component{
- display() {
- const name = this.inputDemo.value;
- document.getElementById('disp').innerHTML = name;
- }
- render() {
- return(
- <div>
- Name: <input type="text" ref={input => this.inputDemo = input} />
- <button name="Click" onClick={this.display}>Click</button>
- <h2>Hello <span id="disp"></span> !!!</h2>
- </div>
- );
- }
- }
26. 列出一些应该使用 Refs 的情况。
以下是应该使用 refs 的情况:
27. 如何模块化 React 中的代码?
可以使用 export 和 import 属性来模块化代码。它们有助于在不同的文件中单独编写组件。
- //ChildComponent.jsx
- export default class ChildComponent extends React.Component {
- render() {
- return(
- <div>
- <h1>This is a child component</h1>
- </div>
- );
- }
- }
- //ParentComponent.jsx
- import ChildComponent from './childcomponent.js';
- class ParentComponent extends React.Component {
- render() {
- return(
- <div>
- <App />
- </div>
- );
- }
- }
28. 如何在 React 中创建表单
React 表单类似于 HTML 表单。但是在 React 中,状态包含在组件的 state 属性中,并且只能通过
setState()
更新。因此元素不能直接更新它们的状态,它们的提交是由 JavaScript 函数处理的。此函数可以完全访问用户输入到表单的数据。
- handleSubmit(event) {
- alert('A name was submitted: ' + this.state.value);
- event.preventDefault();
- }
- render() {
- return (
- <form onSubmit={this.handleSubmit}>
- <label>
- Name:
- <input type="text" value={this.state.value} onChange={this.handleSubmit} />
- </label>
- <input type="submit" value="Submit" />
- </form>
- );
- }
29. 你对受控组件和非受控组件了解多少?
非受控组件30. 什么是高阶组件(HOC)?
高阶组件是重用组件逻辑的高级方法,是一种源于 React 的组件模式。 HOC 是自定义组件,在它之内包含另一个组件。它们可以接受子组件提供的任何动态,但不会修改或复制其输入组件中的任何行为。你可以认为 HOC 是“纯(Pure)”组件。
31. 你能用HOC做什么?
HOC可用于许多任务,例如:
32. 什么是纯组件?
纯(Pure) 组件是可以编写的最简单、最快的组件。它们可以替换任何只有 render() 的组件。这些组件增强了代码的简单性和应用的性能。
33. React 中 key 的重要性是什么?
key 用于识别唯一的 Virtual DOM 元素及其驱动 UI 的相应数据。它们通过回收 DOM 中当前所有的元素来帮助 React 优化渲染。这些 key 必须是唯一的数字或字符串,React 只是重新排序元素而不是重新渲染它们。这可以提高应用程序的性能。
React Redux
34. MVC框架的主要问题是什么?
以下是MVC框架的一些主要问题:
35. 解释一下 Flux
Flux 是一种强制单向数据流的架构模式。它控制派生数据,并使用具有所有数据权限的中心 store 实现多个组件之间的通信。整个应用中的数据更新必须只能在此处进行。 Flux 为应用提供稳定性并减少运行时的错误。
36. 什么是Redux?
Redux 是当今最热门的前端开发库之一。它是 JavaScript 程序的可预测状态容器,用于整个应用的状态管理。使用 Redux 开发的应用易于测试,可以在不同环境中运行,并显示一致的行为。
37. Redux遵循的三个原则是什么?
38. 你对“单一事实来源”有什么理解?
Redux 使用 “Store” 将程序的整个状态存储在同一个地方。因此所有组件的状态都存储在 Store 中,并且它们从 Store 本身接收更新。单一状态树可以更容易地跟踪随时间的变化,并调试或检查程序。
39. 列出 Redux 的组件。
Redux 由以下组件组成:
40. 数据如何通过 Redux 流动?
41. 如何在 Redux 中定义 Action?
React 中的 Action 必须具有 type 属性,该属性指示正在执行的 ACTION 的类型。必须将它们定义为字符串常量,并且还可以向其添加更多的属性。在 Redux 中,action 被名为 Action Creators 的函数所创建。以下是 Action 和Action Creator 的示例:
- function addTodo(text) {
- return {
- type: ADD_TODO,
- text
- }
- }
42. 解释 Reducer 的作用。
Reducers 是纯函数,它规定应用程序的状态怎样因响应 ACTION 而改变。Reducers 通过接受先前的状态和 action 来工作,然后它返回一个新的状态。它根据操作的类型确定需要执行哪种更新,然后返回新的值。如果不需要完成任务,它会返回原来的状态。
43. Store 在 Redux 中的意义是什么?
Store 是一个 JavaScript 对象,它可以保存程序的状态,并提供一些方法来访问状态、调度操作和注册侦听器。应用程序的整个状态/对象树保存在单一存储中。因此,Redux 非常简单且是可预测的。我们可以将中间件传递到 store 来处理数据,并记录改变存储状态的各种操作。所有操作都通过 reducer 返回一个新状态。
44. Redux与Flux有何不同?
React 路由
46. 什么是React 路由?
React 路由是一个构建在 React 之上的强大的路由库,它有助于向应用程序添加新的屏幕和流。这使 URL 与网页上显示的数据保持同步。它负责维护标准化的结构和行为,并用于开发单页 Web 应用。 React 路由有一个简单的API。
47. 为什么React Router v4中使用 switch 关键字 ?
虽然
<div>
用于封装 Router 中的多个路由,当你想要仅显示要在多个定义的路线中呈现的单个路线时,可以使用 “switch” 关键字。使用时,
<switch>
标记会按顺序将已定义的 URL 与已定义的路由进行匹配。找到***个匹配项后,它将渲染指定的路径。从而绕过其它路线。
48. 为什么需要 React 中的路由?
Router 用于定义多个路由,当用户定义特定的 URL 时,如果此 URL 与 Router 内定义的任何 “路由” 的路径匹配,则用户将重定向到该特定路由。所以基本上我们需要在自己的应用中添加一个 Router 库,允许创建多个路由,每个路由都会向我们提供一个独特的视图
- <switch>
- <route exact path=’/’ component={Home}/>
- <route path=’/posts/:id’ component={Newpost}/>
- <route path=’/posts’ component={Post}/>
- </switch>
49. 列出 React Router 的优点。
几个优点是:
<BrowserRouter>
),其中我们将特定的子路由(
<route>
)包起来。
<BrowserRouter>
组件中。
50. React Router与常规路由有何不同?
React 路由