1. 區分Real DOM和Virtual DOM
Real DOM | Virtual DOM |
---|---|
1. 更新緩慢。 | 1. 更新更快。 |
2. 可以直接更新 HTML。 | 2. 無法直接更新 HTML。 |
3. 如果元素更新,則創建新DOM。 | 3. 如果元素更新,則更新 JSX 。 |
4. DOM操作代價很高。 | 4. DOM 操作非常簡單。 |
5. 消耗的內存較多。 | 5. 很少的內存消耗。 |
2. 什么是React?
- React 是 Facebook 在 2011 年開發的前端 JavaScript 庫。
- 它遵循基於組件的方法,有助於構建可重用的UI組件。
- 它用於開發復雜和交互式的 Web 和移動 UI。
- 盡管它僅在 2015 年開源,但有一個很大的支持社區。
3. React有什么特點?
React的主要功能如下:
- 它使用**虛擬DOM **而不是真正的DOM。
- 它可以用服務器端渲染。
- 它遵循單向數據流或數據綁定。
4. 列出React的一些主要優點。
React的一些主要優點是:
- 它提高了應用的性能
- 可以方便地在客戶端和服務器端使用
- 由於 JSX,代碼的可讀性很好
- React 很容易與 Meteor,Angular 等其他框架集成
- 使用React,編寫UI測試用例變得非常容易
5. React有哪些限制?
React的限制如下:
- React 只是一個庫,而不是一個完整的框架
- 它的庫非常龐大,需要時間來理解
- 新手程序員可能很難理解
- 編碼變得復雜,因為它使用內聯模板和 JSX
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 工作過程有三個簡單的步驟。
-
每當底層數據發生改變時,整個 UI 都將在 Virtual DOM 描述中重新渲染。
-
然后計算之前 DOM 表示與新表示的之間的差異。
-
完成計算后,將只用實際更改的內容更新 real DOM。
8. 為什么瀏覽器無法讀取JSX?
瀏覽器只能處理 JavaScript 對象,而不能讀取常規 JavaScript 對象中的 JSX。所以為了使瀏覽器能夠讀取 JSX,首先,需要用像 Babel 這樣的 JSX 轉換器將 JSX 文件轉換為 JavaScript 對象,然后再將其傳給瀏覽器。
9. 與 ES5 相比,React 的 ES6 語法有何不同?
以下語法是 ES5 與 ES6 中的區別:
- require 與 import
// ES5
var React = require('react');
// ES6
import React from 'react';
- export 與 exports
// ES5
module.exports = Component;
// ES6
export default Component;
- 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>;
}
}
- 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>;
}
}
- 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 | Angular |
---|---|---|
1. 體系結構 | 只有 MVC 中的 View | 完整的 MVC |
2. 渲染 | 可以在服務器端渲染 | 客戶端渲染 |
3. DOM | 使用 virtual DOM | 使用 real DOM |
4. 數據綁定 | 單向數據綁定 | 雙向數據綁定 |
5. 調試 | 編譯時調試 | 運行時調試 |
6. 作者 |
React 組件
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 | Props |
---|---|---|
1. 從父組件中接收初始值 | Yes | Yes |
2. 父組件可以改變值 | No | Yes |
3. 在組件中設置默認值 | Yes | Yes |
4. 在組件的內部變化 | Yes | No |
5. 設置子組件的初始值 | Yes | Yes |
6. 在子組件的內部更改 | No | Yes |
17. 如何更新組件的狀態?
可以用 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. 區分有狀態和無狀態組件。
有狀態組件 | 無狀態組件 |
---|---|
1. 在內存中存儲有關組件狀態變化的信息 | 1. 計算組件的內部的狀態 |
2. 有權改變狀態 | 2. 無權改變狀態 |
3. 包含過去、現在和未來可能的狀態變化情況 | 3. 不包含過去,現在和未來可能發生的狀態變化情況 |
4. 接受無狀態組件狀態變化要求的通知,然后將 props 發送給他們。 | 4.從有狀態組件接收 props 並將其視為回調函數。 |
20. React組件生命周期的階段是什么?
React 組件的生命周期有三個不同的階段:
- *初始渲染階段:*這是組件即將開始其生命之旅並進入 DOM 的階段。
- *更新階段:*一旦組件被添加到 DOM,它只有在 prop 或狀態發生變化時才可能更新和重新渲染。這些只發生在這個階段。
- *卸載階段:*這是組件生命周期的最后階段,組件被銷毀並從 DOM 中刪除。
21. 詳細解釋 React 組件的生命周期方法。
一些最重要的生命周期方法是:
- componentWillMount**()** – 在渲染之前執行,在客戶端和服務器端都會執行。
- componentDidMount**()** – 僅在第一次渲染后在客戶端執行。
- componentWillReceiveProps**()** – 當從父類接收到 props 並且在調用另一個渲染器之前調用。
- shouldComponentUpdate**()** – 根據特定條件返回 true 或 false。如果你希望更新組件,請返回true 否則返回 false。默認情況下,它返回 false。
- componentWillUpdate**()** – 在 DOM 中進行渲染之前調用。
- componentDidUpdate**()** – 在渲染發生后立即調用。
- componentWillUnmount**()** – 從 DOM 卸載組件后調用。用於清理內存空間。
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 的情況:
- 需要管理焦點、選擇文本或媒體播放時
- 觸發式動畫
- 與第三方 DOM 庫集成
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. 你對受控組件和非受控組件了解多少?
受控組件 | 非受控組件 |
---|---|
1. 沒有維持自己的狀態 | 1. 保持着自己的狀態 |
2.數據由父組件控制 | 2.數據由 DOM 控制 |
3. 通過 props 獲取當前值,然后通過回調通知更改 | 3. Refs 用於獲取其當前值 |
30. 什么是高階組件(HOC)?
高階組件是重用組件邏輯的高級方法,是一種源於 React 的組件模式。 HOC 是自定義組件,在它之內包含另一個組件。它們可以接受子組件提供的任何動態,但不會修改或復制其輸入組件中的任何行為。你可以認為 HOC 是“純(Pure)”組件。
31. 你能用HOC做什么?
HOC可用於許多任務,例如:
- 代碼重用,邏輯和引導抽象
- 渲染劫持
- 狀態抽象和控制
- Props 控制
32. 什么是純組件?
純(Pure) 組件是可以編寫的最簡單、最快的組件。它們可以替換任何只有 render() 的組件。這些組件增強了代碼的簡單性和應用的性能。
33. React 中 key 的重要性是什么?
key 用於識別唯一的 Virtual DOM 元素及其驅動 UI 的相應數據。它們通過回收 DOM 中當前所有的元素來幫助 React 優化渲染。這些 key 必須是唯一的數字或字符串,React 只是重新排序元素而不是重新渲染它們。這可以提高應用程序的性能。
React Redux
34. MVC框架的主要問題是什么?
以下是MVC框架的一些主要問題:
- 對 DOM 操作的代價非常高
- 程序運行緩慢且效率低下
- 內存浪費嚴重
- 由於循環依賴性,組件模型需要圍繞 models 和 views 進行創建
35. 解釋一下 Flux
Flux 是一種強制單向數據流的架構模式。它控制派生數據,並使用具有所有數據權限的中心 store 實現多個組件之間的通信。整個應用中的數據更新必須只能在此處進行。 Flux 為應用提供穩定性並減少運行時的錯誤。
36. 什么是Redux?
Redux 是當今最熱門的前端開發庫之一。它是 JavaScript 程序的可預測狀態容器,用於整個應用的狀態管理。使用 Redux 開發的應用易於測試,可以在不同環境中運行,並顯示一致的行為。
37. Redux遵循的三個原則是什么?
- ***單一事實來源:***整個應用的狀態存儲在單個 store 中的對象/狀態樹里。單一狀態樹可以更容易地跟蹤隨時間的變化,並調試或檢查應用程序。
- ***狀態是只讀的:***改變狀態的唯一方法是去觸發一個動作。動作是描述變化的普通 JS 對象。就像 state 是數據的最小表示一樣,該操作是對數據更改的最小表示。
- ***使用純函數進行更改:***為了指定狀態樹如何通過操作進行轉換,你需要純函數。純函數是那些返回值僅取決於其參數值的函數。
38. 你對“單一事實來源”有什么理解?
Redux 使用 “Store” 將程序的整個狀態存儲在同一個地方。因此所有組件的狀態都存儲在 Store 中,並且它們從 Store 本身接收更新。單一狀態樹可以更容易地跟蹤隨時間的變化,並調試或檢查程序。
39. 列出 Redux 的組件。
Redux 由以下組件組成:
- Action – 這是一個用來描述發生了什么事情的對象。
- Reducer – 這是一個確定狀態將如何變化的地方。
- Store – 整個程序的狀態/對象樹保存在Store中。
- View – 只顯示 Store 提供的數據。
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有何不同?
Flux | Redux |
---|---|
1. Store 包含狀態和更改邏輯 | 1. Store 和更改邏輯是分開的 |
2. 有多個 Store | 2. 只有一個 Store |
3. 所有 Store 都互不影響且是平級的 | 3. 帶有分層 reducer 的單一 Store |
4. 有單一調度器 | 4. 沒有調度器的概念 |
5. React 組件訂閱 store | 5. 容器組件是有聯系的 |
6. 狀態是可變的 | 6. 狀態是不可改變的 |
45. Redux 有哪些優點?
Redux 的優點如下:
- 結果的可預測性 - 由於總是存在一個真實來源,即 store ,因此不存在如何將當前狀態與動作和應用的其他部分同步的問題。
- 可維護性 - 代碼變得更容易維護,具有可預測的結果和嚴格的結構。
- 服務器端渲染 - 你只需將服務器上創建的 store 傳到客戶端即可。這對初始渲染非常有用,並且可以優化應用性能,從而提供更好的用戶體驗。
- 開發人員工具 - 從操作到狀態更改,開發人員可以實時跟蹤應用中發生的所有事情。
- 社區和生態系統 - Redux 背后有一個巨大的社區,這使得它更加迷人。一個由才華橫溢的人組成的大型社區為庫的改進做出了貢獻,並開發了各種應用。
- 易於測試 - Redux 的代碼主要是小巧、純粹和獨立的功能。這使代碼可測試且獨立。
- 組織 - Redux 准確地說明了代碼的組織方式,這使得代碼在團隊使用時更加一致和簡單。
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 的優點。
幾個優點是:
- 就像 React 基於組件一樣,在 React Router v4 中,API 是 ‘All About Components’。可以將 Router 可視化為單個根組件(
<BrowserRouter>
),其中我們將特定的子路由(<route>
)包起來。 - 無需手動設置歷史值:在 React Router v4 中,我們要做的就是將路由包裝在
<BrowserRouter>
組件中。 - 包是分開的:共有三個包,分別用於 Web、Native 和 Core。這使我們應用更加緊湊。基於類似的編碼風格很容易進行切換。
50. React Router與常規路由有何不同?
主題 | 常規路由 | React 路由 |
---|---|---|
參與的頁面 | 每個視圖對應一個新文件 | 只涉及單個HTML頁面 |
URL 更改 | HTTP 請求被發送到服務器並且接收相應的 HTML 頁面 | 僅更改歷史記錄屬性 |
體驗 | 用戶實際在每個視圖的不同頁面切換 | 用戶認為自己正在不同的頁面間切換 |