<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
作者:Stéphane Bégaudeau
翻譯原文 https://www.sbegaudeau.com/2018/10/01/from-vanilla-javascript-to-react.html
React 是一個用於構建使用者介面的 JavaScript 框架。它可用於通過動態操作頁面內容來建立 JavaScript 應用程式。瀏覽器已經提供了在頁面中建立元素的 API,即 DOM,所以新手可能想知道 React 帶來了什麼以及它與 DOM 的關係。
在 JavaScript 中,就像在大多數程式語言中一樣,您將可以存取具有各種物件和函數的全域性範圍,您可以操縱這些物件和函數來構建您的應用程式。在 Web 環境中執行的 JavaScript 應用程式中,您將有權存取檔案物件模型 (DOM) API。如果您在基於節點的應用程式中使用 JavaScript,您將無法存取 DOM,但您可以匯入替代實現,例如JSDOM。
DOM 是一個簡單的 API,可讓您以幾乎任何您想要的方式操作頁面的 HTML 檔案。由於全域性document
物件,您可以開始使用它。
從 document
這裡開始,您可以輕鬆地建立新元素、修改它們的屬性,甚至將它們新增為其他元素的子元素。多虧了 DOM,您可以通過程式設計方式建立任何 HTML 檔案,即使這樣做會非常冗長。
在下面的範例中,我們將以程式設計方式在 HTML 檔案中建立一個簡單的標題。
<!DOCTYPE html> <html> <head> <script src="app.js"></script> </head> <body> <div id="app" /> </body> </html>
為此,我們將建立一個h1元素,該元素將插入到 HTML 頁面的正文中。
// The document object is accessible since it is in the global scope const h1Element = document.createElement('h1'); h1Element.setAttribute('class', 'title'); const textElement = document.createTextNode('I am Groot'); h1Element.appendChild(textElement); // document.getElementById('app') will retrieve the div with the identifier app document.getElementById('app').appendChild(element);
上面的程式碼首先建立一個新屬性,然後向該元素h1新增一個class帶有值為title
的新屬性。 它還建立一個簡單的文位元組點並將文字 'I am Groot' 新增為元素h1的子元素。最後,它使用 HTML 檔案將 h1 的標籤新增到 div 中。app 執行此程式碼後,生成的 HTML 檔案將如下所示:
<!DOCTYPE html> <html> <head> <script src="app.js"></script> </head> <body> <div id="app"> <h1 class="title">I am Groot</h1> </div> </body> </html>
藉助 DOM,我們還可以通過 className 屬性直接操作元素的類屬性(因為名稱 class 是 JavaScript 中的保留關鍵字)。因此,以下程式碼將產生完全相同的結果。
const h1Element = document.createElement('h1'); // h1Element.setAttribute('class', 'title'); h1Element.className = 'title'; const textElement = document.createTextNode('I am Groot'); h1Element.appendChild(textElement); document.getElementById('app').appendChild(element);
大多數 React 教學會讓你從直接使用 React 的所有奇蹟開始。我們將採用另一種方法,因為我們將從編寫一些你可能永遠不會再編寫的 React 程式碼開始,以便更好地理解 React 的工作方式。
React 的建立考慮了 Web 應用場景,因此,在其核心,它的一些 API 感覺就像 DOM。為了說明這一點,我們將看一下最重要的 React API 之一,React.createElement.
要使用 React 操作 DOM,您將需要兩個依賴項 React 和 ReactDOM. React.createElement將讓您建立一個廉價且快速的資料結構,稱為虛擬 DOM,代表您的使用者介面的結構。ReactDOM將在您的 Web 應用程式的真實 DOM 中呈現這個虛擬 DOM。
React.createElement將需要三個引數來建立虛擬 DOM 的元素:
import React from 'react'; const name = 'h1'; const props = { className: 'title' }; const children = 'I am Groot'; const element = React.createElement(name, props, children);
React.createElement 也可以接受包含要建立的元素的所有子元素的陣列。
import React from 'react'; const name = 'h1'; const props = { className: 'title' }; const children = ['I am Groot']; const element = React.createElement(name, props, children);
引數 children 也是元素的常規屬性,因此它可以是 props 物件的一部分。
import React from 'react'; const props = { className: 'title', children: ['I am Groot'] }; const element = React.createElement('h1', props);
為了在 DOM 中渲染這個元素,我們需要選擇它在 DOM 中的渲染位置,在我們的例子中是div帶有識別符號app並告訴 ReactDOM 渲染它。
import React from 'react'; import ReactDOM from 'react-dom'; const props = { className: 'title', children: ['I am Groot'] }; const element = React.createElement('h1', ...props); ReactDOM.render(element, document.getElementById('app'));
此處顯示的所有程式碼範例都可以通過將它們與未打包版本的 React 和 Babel 一起使用來進行測試。這樣的設定應該只用於簡單的測試,因為它們沒有像生產構建那樣優化。在這種特定情況下,應刪除 和 的匯入(此處均作為全域性變數公開react)。react-dom
<!DOCTYPE html> <html> <head> <title>React</title> <script src="https://unpkg.com/react@16/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <script type="text/babel"> const props = { className: 'title', children: ['I am Groot'] }; const element = React.createElement('h1', props); ReactDOM.render(element, document.getElementById('app')); </script> </head> <body> <div id="app" /> </body> </html>
雖然我們可以使用這種方法建立 Web 應用程式的所有頁面,但它仍然非常冗長。為了使操作 DOM 變得容易,React 提供了一種名為JSX的簡單而強大的語言。
前處理器使用 JSX 在構建期間將其轉換為常規 JavaScript。一個常規的 React 專案使用前處理器來將 JSX 程式碼轉換為對 React.createElement. 因此,JSX 永遠不會被 React 直接解釋,你可以在沒有一行 JSX 的情況下使用 React。因此,下面的兩段程式碼完全相同。首先,以程式設計方式使用 React:
import React from 'react'; const props = { className: 'title' }; const children = ['I am Groot']; const element = React.createElement('h1', props, children);
或使用 JSX 宣告:
import React from 'react'; const element = <h1 className="title">I am Groot</h1>;
由於 JSX 程式碼將使用 轉換為呼叫 React.createElement,因此您需要匯入 React,即使它似乎沒有被使用。
使用 JSX,您可以非常快速地以宣告方式建立大部分 DOM,而 React 只會看到對React.createElement. 由於 JSX 元素只是對 的呼叫 React.createElement,因此 children 仍然是常規屬性。因此,您也可以像這樣編寫前面的範例:
import React from 'react'; const element = <h1 className="title" children="I am Groot"/>;
藉助 JSX,您可以通過花括號存取變數:
import React from 'react'; const title = 'title'; const text = 'I am Groot'; const element = <h1 className={title} children={text}/>;
當然,我們也可以將變數命名為我們想要操作的屬性
import React from 'react'; const className = 'title'; const children = 'I am Groot'; const element = <h1 className={className} children={children}/>;
這將允許我們使用擴充套件語法來獲得更簡潔的程式碼
import React from 'react'; const props = { className: 'title', children: ['I am Groot'] }; const element = <h1 {...props}/>;
最後,我們可以像以前一樣在 DOM 中渲染這個元素 React.createElement。
import React from 'react'; import ReactDOM from 'react-dom'; const props = { className: 'title', children: ['I am Groot'] }; ReactDOM.render(<h1 {...props}/>, document.getElementById('app'));
現在我們已經使用 JSX 通過 React 渲染了我們的第一塊虛擬 DOM,我們準備好看看如何使用 React 構建一個基本的應用程式。
奔跑吧,去用 React 元件開發更多動態程式碼。
以上就是從原生JavaScript到React深入理解的詳細內容,更多關於原生JavaScript到React的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45