这是最有可能由面试官提出的 常被问到的50个React面试问答。为了方便您访问,我对React面试问题进行了归类:
一般React – React面试问题
真实DOM | 虚拟DOM |
---|---|
1.更新缓慢。 | 1.更新速度更快。 |
2.可以直接更新HTML。 | 2.无法直接更新HTML。 |
3.如果元素更新,则创建一个新的DOM。 | 3.如果元素更新,则更新JSX。 |
4. DOM操作非常昂贵。 | 4. DOM操作非常容易。 |
5.过多的内存浪费。 | 5.没有内存浪费。 |
React的主要功能如下:
React的一些主要优点是:
下面列出了React的局限性:
JSX是JavaScript XML的简写。这是React使用的一种文件,它利用JavaScript的表现力以及类似模板语法的HTML。这使得HTML文件非常容易理解。该文件使应用程序健壮并提高其性能。以下是JSX的示例:
render(){ return( <div> <h1> Hello World from Edureka!!</h1> </div> ); }
虚拟DOM是轻量级的JavaScript对象,其最初只是真实DOM的副本。 它是一个节点树,列出了元素,它们的属性和内容作为对象及其属性。React的render函数从React组件中创建一个节点树。然后,它会响应由用户或系统执行的各种操作引起的数据模型中的突变来更新此树。该虚拟DOM只需三个简单的步骤。
浏览器只能读取JavaScript对象,而不能读取普通JavaScript对象中的JSX。因此,要使浏览器能够读取JSX,首先,我们需要使用Babel之类的JSX转换器将JSX文件转换为JavaScript对象,然后将其传递给浏览器。
语法在以下方面从ES5更改为ES6:
需要与导入
// ES5 var React = require('react'); // ES6 import React from 'react';
出口与出口
// ES5 module.exports = Component; // ES6 export default Component;
组成和功能
// ES5 var MyComponent = React.createClass({ render: function() { return <h3>欢迎关注Java架构师社区公众号!</h3>; } }); // ES6 class MyComponent extends React.Component { render() { return <h3>欢迎关注全栈程序员社区公众号!</h3>; } }
道具
// 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>; } }
州
// ES5
var App = React.createClass({
getInitialState: function() {
return { name: ‘Java架构师社区’ };
},
render: function() {
return
// ES6
class App extends React.Component {
constructor() {
super();
this.state = { name: ‘全栈程序员社区’ };
}
render() {
return
### **10. React与Angular有何不同?** | **类别** | **React** | **Angular** | | ------------ | :-----------: | :-----------: | | *1.架构* | 只有MVC的观点 | 完整的MVC | | *2.渲染* | 服务器端渲染 | 客户端渲染 | | *3. DOM* | 使用虚拟DOM | 使用真实的DOM | | *4.数据绑定* | 单向数据绑定 | 双向数据绑定 | | *5.调试* | 编译时调试 | 运行时调试 | | *6.作者* | 脸书 | 谷歌 | **React组件– React面试问题** ### **11.您从“在React中,一切都是组件”中了解到什么。** 组件是React应用程序UI的构建块。这些组件将整个UI分成独立且可重用的小块。然后,它使这些组件中的每个组件彼此独立,而不会影响UI的其余部分。 ### **12.解释React中render()的目的。** 每个React组件必须强制具有**render()**。它返回单个React元素,它是本机DOM组件的表示形式。如果需要渲染多个HTML元素,则必须将它们组合在一个封闭的标记内,例如**,,<div>**等。此函数必须保持纯净,即,它必须返回相同的结果每次被调用。 ### **13.如何将两个或多个组件嵌入到一个组件中?** 我们可以通过以下方式将组件嵌入到一个组件中: ```react class MyComponent extends React.Component{ render(){ return( <div> <h1>Hello</h1> </div> ); } } class Header extends React.Component{ render(){ return <h1>Header Component</h1> }; } ReactDOM.render( , document.getElementById('content') );
道具是React中Properties的简写。它们是只读组件,必须保持纯净即不变。在整个应用程序中,它们始终从父组件传递到子组件。子组件永远无法将道具发送回父组件。这有助于维持单向数据流,通常用于呈现动态生成的数据。
状态是React组件的核心。状态是数据的来源,必须保持尽可能简单。基本上,状态是确定组件渲染和行为的对象。与道具不同,它们是可变的,并创建动态和交互的组件。通过 this.state()访问它们。
条件 | state | Properties |
---|---|---|
1.从父组件接收初始值 | 是 | 是 |
2.父组件可以更改值 | 没有 | 是 |
3.在组件内部设置默认值 | 是 | 是 |
4.内部组件的变化 | 是 | 没有 |
5.设置子组件的初始值 | 是 | 是 |
6.子组件内部的更改 | 没有 | 是 |
可以使用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( , document.getElementById('content') );
箭头函数是用于编写函数表达式的简短语法。它们也称为*“胖箭头*”(=>)函数。这些功能允许正确绑定组件的上下文,因为默认情况下在ES6中自动绑定不可用。箭头函数在使用高阶函数时最有用。
//General way render() { return( ); } //With Arrow Function render() { return( this.handleOnChange(e) } /> ); }
有状态组件 | 无状态组件 |
---|---|
1.将有关组件状态更改的信息存储在内存中 | 1.计算组件的内部状态 |
2.有权更改状态 | 2.无权更改状态 |
3.包含状态的过去,当前和将来可能发生的变化的知识 | 3.不包含过去,当前和将来可能发生的状态变化的知识 |
4.无状态组件将状态更改的要求通知他们,然后将道具发送给他们。 | 4.他们从有状态组件接收道具,并将其视为回调函数。 |
React组件的生命周期分为三个不同阶段:
一些最重要的生命周期方法是:
在React中,事件是对特定动作(如鼠标悬停,鼠标单击,按键等)的触发反应。处理这些事件类似于处理DOM元素中的事件。但是在语法上存在一些差异,例如:
事件参数包含一组特定于事件的属性。每个事件类型都包含其自己的属性和行为,这些属性和行为只能通过其事件处理程序进行访问。
class Display extends React.Component({ show(evt) { // code }, render() { // Render the div with an onClick prop (value is a function) return ( <div>Click Me!</div> ); } });
合成事件是充当浏览器本地事件周围的跨浏览器包装的对象。它们将不同浏览器的行为组合到一个API中。这样做是为了确保事件在不同的浏览器中显示一致的属性。
Refs是React中References的简写。它是一个属性,有助于存储对特定React元素或组件的引用,该引用将由组件渲染配置函数返回。它为u sed将引用返回到()的特定元素或组分被渲染返回。当我们需要DOM测量或向组件添加方法时,它们会派上用场。
class ReferenceDemo extends React.Component{ display() { const name = this.inputDemo.value; document.getElementById('disp').innerHTML = name; } render() { return( <div> Name: this.inputDemo = input} /> Click <h2>Hello <span></span> !!!</h2> </div> ); } }
以下是应使用ref的情况:
我们可以通过使用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> </div> ); } }
React表单类似于HTML表单。但是在React中,状态包含在组件的state属性中,并且只能通过setState()进行更新。因此,元素无法直接更新其状态,并且其提交由JavaScript函数处理。此功能可以完全访问用户输入到表单中的数据。
handleSubmit(event) { alert('A name was submitted: ' + this.state.value); event.preventDefault(); } render() { return ( Name: ); }
受控组件 | 不受控制的组件 |
---|---|
1.他们不保持自己的状态 | 1.他们保持自己的状态 |
2.数据由上级组件控制 | 2.数据由DOM控制 |
3.他们通过道具获取当前值,然后通过回调通知更改 | 3.引用用于获取其当前值 |
高阶组件是重用组件逻辑的高级方法。基本上,这是从React的组成性质衍生的模式。HOC是自定义组件,在其中包裹了另一个组件。他们可以接受任何动态提供的子组件,但不会修改或复制其输入组件中的任何行为。您可以说HOC是“纯”组件。
HOC可用于许多任务,例如:
纯 组件是可以编写的最简单,最快的组件。它们可以替换仅具有render()的任何组件 **。**这些组件增强了代码的简洁性和应用程序的性能。
密钥用于标识唯一的虚拟DOM元素及其驱动UI的相应数据。它们通过回收DOM中的所有现有元素来帮助React优化渲染。这些键必须是唯一的数字或字符串,React只能使用这些数字或字符串对元素进行重新排序,而不是重新渲染它们。这导致应用程序性能的提高。
React Redux – React面试问题
以下是MVC框架的一些主要问题:
Flux是强制单向数据流的体系结构模式。它控制派生的数据,并使用具有对所有数据的权限的中央存储实现多个组件之间的通信。整个应用程序中的任何数据更新都只能在此处进行。Flux为应用程序提供稳定性并减少运行时错误。
Redux是当今市场上最热门的前端开发库之一。它是JavaScript应用程序的可预测状态容器,用于整个应用程序状态管理。用Redux开发的应用程序易于测试,并且可以在表现出一致行为的不同环境中运行。
Redux使用“存储”将应用程序的整个状态存储在一个地方。因此,所有组件的状态都存储在商店中,它们从商店本身接收更新。单一状态树使跟踪随时间变化以及调试或检查应用程序变得更加容易。
Redux由以下组件组成:
行动–这是一个描述发生了什么的对象。
减速器–一个确定状态如何变化的地方。
商店–整个应用程序的状态/对象树保存在商店中。
查看–仅显示商店提供的数据。
React中的动作必须具有type属性,该属性指示正在执行的ACTION的类型。必须将它们定义为String常量,您也可以为其添加更多属性。在Redux中,使用称为“动作创建者”的功能来创建动作。以下是动作和动作创建者的示例:
function addTodo(text) { return { type: ADD_TODO, text } }
Reducer是纯函数,用于指定应用程序的状态如何响应ACTION进行更改。减速器通过采用先前的状态和操作来工作,然后返回新的状态。它根据操作的类型确定需要执行哪种更新,然后返回新值。 如果不需要完成任何工作,它将按原样返回以前的状态。
商店是一个JavaScript对象,它可以保存应用程序的状态并提供一些帮助程序方法来访问状态,调度动作和注册侦听器。应用程序的整个状态/对象树保存在单个存储中。因此,Redux非常简单且可预测。我们可以将中间件传递给商店以处理数据处理,并保留更改商店状态的各种操作的日志。所有动作都通过减速器返回新状态。
Flux | Redux |
---|---|
1.存储包含状态和更改逻辑 | 1.存储和更改逻辑是分开的 |
2.有多家商店 | 2.只有一家商店 |
3.所有商店都断开连接并保持平坦 | 3.带有分层减速器的单店 |
4.有单身派遣员 | 4.没有调度员的概念 |
5. React组件订阅商店 | 5.容器组件利用连接 |
6.国家是易变的 | 6.国家是一成不变的 |
Redux的优点如下:
React Router – React面试问题
React Router是一个强大的路由库,建立在React的基础上,可以帮助向应用程序添加新的屏幕和流程。这样可以使URL与网页上显示的数据保持同步。它保持标准化的结构和行为,并用于开发单页Web应用程序。React Router有一个简单的API。
尽管**
路由器用于定义多个路由,并且当用户键入特定的URL时,如果此URL与路由器内部定义的任何“路由”的路径匹配,则用户将被重定向到该特定的路由。因此,基本上,我们需要在我们的应用程序中添加一个路由器库,以允许创建多个路由,每个路由都为我们带来一个独特的视图。
几个优点是:
话题 | 常规路由 | 反应路由 |
---|---|---|
涉及的页面 | 每个视图对应一个新文件 | 仅涉及单个HTML页面 |
网址变更 | HTTP请求发送到服务器,并接收相应的HTML页面 | 仅历史记录属性被更改 |
感觉 | 用户实际上为每个视图浏览不同的页面 | 用户被欺骗,以为他正在浏览不同的页面 |