一看就懂ReactJS

来源:http://www.cnblogs.com/javascript-center/archive/2016/05/26/5533131.html
-Advertisement-
Play Games

現在最熱門的前端框架有AngularJS、React、Bootstrap等。自從接觸了ReactJS,ReactJs的虛擬DOM(Virtual DOM)和組件化的開發深深的吸引了我,下麵來跟我一起領略ReactJS的風采吧~~ 章有點長,耐心讀完,你會有很大收穫哦~ 一、ReactJS簡介 Rea ...


現在最熱門的前端框架有AngularJS、React、Bootstrap等。自從接觸了ReactJS,ReactJs的虛擬DOM(Virtual DOM)和組件化的開發深深的吸引了我,下麵來跟我一起領略
ReactJS的風采吧~~ 章有點長,耐心讀完,你會有很大收穫哦~

一、ReactJS簡介

React 起源於 Facebook 的內部項目,因為該公司對市場上所有 JavaScript MVC 框架,都不滿意,就決定自己寫一套,用來架設 Instagram 的網站。做出來以後,發現這套東西很好用,就在2013年5月開源了。由於 React 的設計思想極其獨特,屬於革命性創新,性能出眾,代碼邏輯卻非常簡單。所以,越來越多的人開始關註和使用,認為它可能是將來 Web 開發的主流工具。

ReactJS官網地址:http://facebook.github.io/react/

Github地址:https://github.com/facebook/react

二、對ReactJS的認識及ReactJS的優點

首先,對於React,有一些認識誤區,這裡先總結一下:

  • React不是一個完整的MVC框架,最多可以認為是MVC中的V(View),甚至React並不非常認可MVC開發模式;

  • React的伺服器端Render能力只能算是一個錦上添花的功能,並不是其核心出發點,事實上React官方站點幾乎沒有提及其在伺服器端的應用;

  • 有人拿React和Web Component相提並論,但兩者並不是完全的競爭關係,你完全可以用React去開發一個真正的Web Component;

  • React不是一個新的模板語言,JSX只是一個表象,沒有JSX的React也能工作。

1、ReactJS的背景和原理

在Web開發中,我們總需要將變化的數據實時反應到UI上,這時就需要對DOM進行操作。而複雜或頻繁的DOM操作通常是性能瓶頸產生的原因(如何進行高性能的複雜DOM操作通常是衡量一個前端開發人員技能的重要指標)。React為此引入了虛擬DOM(Virtual DOM)的機制:在瀏覽器端用Javascript實現了一套DOM API。基於React進行開發時所有的DOM構造都是通過虛擬DOM進行,每當數據變化時,React都會重新構建整個DOM樹,然後React將當前整個DOM樹和上一次的DOM樹進行對比,得到DOM結構的區別,然後僅僅將需要變化的部分進行實際的瀏覽器DOM更新。而且React能夠批處理虛擬DOM的刷新,在一個事件迴圈(Event Loop)內的兩次數據變化會被合併,例如你連續的先將節點內容從A變成B,然後又從B變成A,React會認為UI不發生任何變化,而如果通過手動控制,這種邏輯通常是極其複雜的。儘管每一次都需要構造完整的虛擬DOM樹,但是因為虛擬DOM是記憶體數據,性能是極高的,而對實際DOM進行操作的僅僅是Diff部分,因而能達到提高性能的目的。這樣,在保證性能的同時,開發者將不再需要關註某個數據的變化如何更新到一個或多個具體的DOM元素,而只需要關心在任意一個數據狀態下,整個界面是如何Render的。

如果你像在90年代那樣寫過伺服器端Render的純Web頁面那麼應該知道,伺服器端所要做的就是根據數據Render出HTML送到瀏覽器端。如果這時因為用戶的一個點擊需要改變某個狀態文字,那麼也是通過刷新整個頁面來完成的。伺服器端並不需要知道是哪一小段HTML發生了變化,而只需要根據數據刷新整個頁面。換句話說,任何UI的變化都是通過整體刷新來完成的。而React將這種開發模式以高性能的方式帶到了前端,每做一點界面的更新,你都可以認為刷新了整個頁面。至於如何進行局部更新以保證性能,則是React框架要完成的事情。

借用Facebook介紹React的視頻中聊天應用的例子,當一條新的消息過來時,傳統開發的思路如上圖,你的開發過程需要知道哪條數據過來了,如何將新的DOM結點添加到當前DOM樹上;而基於React的開發思路如下圖,你永遠只需要關心數據整體,兩次數據之間的UI如何變化,則完全交給框架去做。可以看到,使用React大大降低了邏輯複雜性,意味著開發難度降低,可能產生Bug的機會也更少。

2、組件化

虛擬DOM(virtual-dom)不僅帶來了簡單的UI開發邏輯,同時也帶來了組件化開發的思想,所謂組件,即封裝起來的具有獨立功能的UI部件。React推薦以組件的方式去重新思考UI構成,將UI上每一個功能相對獨立的模塊定義成組件,然後將小的組件通過組合或者嵌套的方式構成大的組件,最終完成整體UI的構建。例如,Facebook的instagram.com整站都採用了React來開發,整個頁面就是一個大的組件,其中包含了嵌套的大量其它組件,大家有興趣可以看下它背後的代碼。

如果說MVC的思想讓你做到視圖-數據-控制器的分離,那麼組件化的思考方式則是帶來了UI功能模塊之間的分離。我們通過一個典型的Blog評論界面來看MVC和組件化開發思路的區別。

對於MVC開發模式來說,開發者將三者定義成不同的類,實現了表現,數據,控制的分離。開發者更多的是從技術的角度來對UI進行拆分,實現松耦合。

對於React而言,則完全是一個新的思路,開發者從功能的角度出發,將UI分成不同的組件,每個組件都獨立封裝。

在React中,你按照界面模塊自然劃分的方式來組織和編寫你的代碼,對於評論界面而言,整個UI是一個通過小組件構成的大組件,每個組件只關心自己部分的邏輯,彼此獨立。

072132381261891600.jpg

React認為一個組件應該具有如下特征:

(1)可組合(Composeable):一個組件易於和其它組件一起使用,或者嵌套在另一個組件內部。如果一個組件內部創建了另一個組件,那麼說父組件擁有(own)它創建的子組件,通過這個特性,一個複雜的UI可以拆分成多個簡單的UI組件;

(2)可重用(Reusable):每個組件都是具有獨立功能的,它可以被使用在多個UI場景;

(3)可維護(Maintainable):每個小的組件僅僅包含自身的邏輯,更容易被理解和維護;

三、下載ReactJS,編寫Hello,world

ReactJs下載非常簡單,為了方便大家下載,這裡再一次給出下載地址(鏈接),下載完成後,我麽看到的是一個壓縮包。解壓後,我們新建一個html文件,引用react.js和JSXTransformer.js這兩個js文件。html模板如下(js路徑改成自己的):

QQ截圖20150721110651.png

這裡大家可能會奇怪,為什麼script的type是text/jsx,這是因為 React 獨有的 JSX 語法,跟 JavaScript 不相容凡是使用 JSX 的地方,都要加上 type="text/jsx" 。 其次,React 提供兩個庫: react.js 和 JSXTransformer.js ,它們必須首先載入。其中,JSXTransformer.js 的作用是將 JSX 語法轉為 JavaScript 語法。這一步很消耗時間,實際上線的時候,應該將它放到伺服器完成。

到這裡我們就可以開始編寫代碼了,首先我們先來認識一下ReactJs裡面的React.render方法:

React.render 是 React 的最基本方法,用於將模板轉為 HTML 語言,並插入指定的 DOM 節點。

下麵我們在script標簽裡面編寫代碼,來輸出Hello,world,代碼如下:

QQ截圖20150721111143.png

這裡需要註意的是,react並不依賴jQuery,當然我們可以使用jQuery,但是render裡面第二個參數必須使用JavaScript原生的getElementByID方法,不能使用jQuery來選取DOM節點。

然後,在瀏覽器打開這個頁面,就可以看到瀏覽器顯示一個大大的Hello,world,因為我們用了

標簽。

 

到這裡,恭喜,你已經步入了ReactJS的大門~~下麵,讓我們來進一步學習ReactJs吧~~

四、Jsx語法

HTML 語言直接寫在 JavaScript 語言之中,不加任何引號,這就是 JSX 的語法,它允許 HTML 與 JavaScript 的混寫,瞭解過AngularJs的看到下麵的代碼一定會感覺很熟悉的,我們來看代碼:

QQ截圖20150721111531.png

這裡我們聲明瞭一個names數組,然後遍歷在前面加上Hello,輸出到DOM中,輸出結果如下:

QQ截圖20150721111639.png

JSX 允許直接在模板插入 JavaScript 變數。如果這個變數是一個數組,則會展開這個數組的所有成員,代碼如下:

QQ截圖20150721111724.png

顯示結果如下:

QQ截圖20150721111738.png

這裡的星號只是做標識用的,大家不要被迷惑了~~

你看到這裡,說明你對React還是蠻感興趣的,恭喜你,堅持下來了,那麼下麵,我們開始學習React裡面的"真功夫"了~~ Are you ready?

五、ReactJS組件

1、組件屬性

前面說了,ReactJS是基於組件化的開發,下麵我們開始來學習ReactJS裡面的組件,React 允許將代碼封裝成組件(component),然後像插入普通 HTML 標簽一樣,在網頁中插入這個組件。React.createClass 方法就用於生成一個組件類。

下麵,我們來編寫第一個組件Greet,有一個name屬性,然後輸出hello + name的值,代碼如下:

QQ截圖20150721111858.png

看到這段代碼,接觸過AngularJS的朋友們是不是有一種熟悉的感覺,不過這裡有幾點需要註意:

1)獲取屬性的值用的是this.props.屬性名

2)創建的組件名稱首字母必須大寫。

3)為元素添加css的class時,要用className。

4)組件的style屬性的設置方式也值得註意,要寫成style={{width: this.state.witdh}}。

2、組件狀態

組件免不了要與用戶互動,React 的一大創新,就是將組件看成是一個狀態機,一開始有一個初始狀態,然後用戶互動,導致狀態變化,從而觸發重新渲染 UI 。下麵我們來編寫一個小例子,一個文本框和一個button,通過點擊button可以改變文本框的編輯狀態,禁止編輯和允許編輯。通過這個例子來理解ReactJS的狀態機制。先看代碼:

QQ截圖20150721112014.png

這裡,我們又使用到了一個方法getInitialState,這個函數在組件初始化的時候執行,必需返回NULL或者一個對象。這裡我們可以通過this.state.屬性名來訪問屬性值,這裡我們將enable這個值跟input的disabled綁定,當要修改這個屬性值時,要使用setState方法。我們聲明handleClick方法,來綁定到button上面,實現改變state.enable的值。效果如下:

072305421429007.gif

原理分析:

當用戶點擊組件,導致狀態變化,this.setState 方法就修改狀態值,每次修改以後,自動調用 this.render 方法,再次渲染組件。

這裡值得註意的幾點如下:

1)getInitialState函數必須有返回值,可以是NULL或者一個對象。

2)訪問state的方法是this.state.屬性名。

3)變數用{}包裹,不需要再加雙引號。

3、組件的生命周期

組件的生命周期分成三個狀態:

  • Mounting:已插入真實 DOM

  • Updating:正在被重新渲染

  • Unmounting:已移出真實 DOM

React 為每個狀態都提供了兩種處理函數,will 函數在進入狀態之前調用,did 函數在進入狀態之後調用,三種狀態共計五種處理函數。

  • componentWillMount()

  • componentDidMount()

  • componentWillUpdate(object nextProps, object nextState)

  • componentDidUpdate(object prevProps, object prevState)

  • componentWillUnmount()

此外,React 還提供兩種特殊狀態的處理函數。

  • componentWillReceiveProps(object nextProps):已載入組件收到新的參數時調用

  • shouldComponentUpdate(object nextProps, object nextState):組件判斷是否重新渲染時調用

下麵來看一個例子:

QQ截圖20150721112254.png

上面代碼在hello組件載入以後,通過 componentDidMount 方法設置一個定時器,每隔100毫秒,就重新設置組件的透明度,從而引發重新渲染。

4、組件的嵌套

React是基於組件化的開發,那麼組件化開發最大的優點是什麼?毫無疑問,當然是復用,下麵我們來看看React中到底是如何實現組件的復用的,這裡我們還寫一個例子來說吧,代碼如下:

QQ截圖20150721112325.png

這裡我們創建了一個Search組件,然後又創建了一個Page組件,然後我們在Page組件中調用Search組件,並且調用了兩次,這裡我們通過屬性searchType傳入值,最終顯示結果如圖:

六、ReactJS小結

關於ReactJS今天就先學習到這裡了,下麵來總結一下,主要有以下幾點:

1、ReactJs是基於組件化的開發,所以最終你的頁面應該是由若幹個小組件組成的大組件。

2、可以通過屬性,將值傳遞到組件內部,同理也可以通過屬性將內部的結果傳遞到父級組件(留給大家研究);要對某些值的變化做DOM操作的,要把這些值放到state中。

3、為組件添加外部css樣式時,類名應該寫成className而不是class;添加內部樣式時,應該是style={{opacity: this.state.opacity}}而不是style="opacity:{this.state.opacity};"。

4、組件名稱首字母必須大寫。

5、變數名用{}包裹,且不能加雙引號。

七、參考資料

React中文文檔 

React入門實例教程

顛覆式前端UI開發框架:React

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 獲取【下載地址】 【免費支持更新】三大資料庫 mysql oracle sqlsever 更專業、更強悍、適合不同用戶群體【新錄針對本系統的視頻教程,手把手教開發一個模塊,快速掌握本系統】 A集成代碼生成器 [正反雙向(單表、主表、明細表、樹形表,開發利器)+快速構建表單;freemaker模版技術 ...
  • 一、工廠模式 (1)簡單工廠模式: 創建一個產品介面,有一個賣產品的方法。 產品A實現產品介面,賣漢堡。 產品B實現產品介面,賣薯條。 創造者是簡單工廠模式的核心:返回值類型是IProduct介面,通過測試類傳來的形參確定返回哪個對象。 測試類:輸出薯條。 (2)方法工廠模式: (圖片來自於網路) ...
  • 在做校園網視頻網站的時候,首頁有一個導航頁面要實現滾動效果,有樣例,但代碼是在難弄懂,貌似網頁設計這塊還是只有自己的代碼自己懂,索性就仿造別人的效果自己做了一個,大體上還行,看起來還是比較流暢的,不次於原作的么。 現在先把代碼拷貝到這裡,以後再逐一簡化修改: 實現混動效果,腳本代碼如下: var a ...
  • 一:跑通ui-router. ui-router源碼在最後面 跑通後的樣子: 這個不解釋了,都是很基本的東西. 二:切換視圖: 這裡的name可以不寫,但是你得放到state的第一個參數里. 跑起來後的後果: 三:如何通過鏈接切換視圖. 1 <!DOCTYPE html> 2 <html> 3 <h ...
  • 如果你是一名前端開發工程師,一般px和em使用頻率比較高。但是今天本文的重點是介紹一些我們使用很少、甚至麽有聽說的單位。 一、重溫em 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <style type="text/css"> body {font-size: 12px; ...
  • 由於游戲類官網在頁面背景和裝飾人物的設計上追求畫麗且與游戲風格想匹配,這就給前端頁面製作人員帶來了很多的麻煩,一個頁面的製作主要時間和精力花費在相容ie6上,而ie6因為不相容png-24的圖片一直被開發人員所鄙視。 由於市場決定了頁面的存在的價值,所以ie6還是必須要相容。 下麵介紹幾種常用的解決 ...
  • 在JavaScript中,正則表達式由RegExp對象表示。RegExp對象呢,又可以通過直接量和構造函數RegExp兩種方式創建,分別如下: 其中,末尾的可選字元(g、i和m)分別表示: g: 模式執行一個全局匹配。簡而言之,就是找到所有匹配,而不是在找到第一個之後就停止。 i: 模式執行不區分大 ...
  • 恢復內容開始 接下來項目需要網頁相關知識,故在大牛的指引下前來閱讀本書。 當前水平:HTML&CSS&JS基本掌握,能在閱讀文檔以及Google查找的情況下完成前端代碼編寫,但是學習不深,HTML5&CSS3新特性、JS基礎&框架皆不熟悉 讀書目的:瞭解DOM概念並通過訓練熟悉掌握,瞭解JS特性 博 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...