Reactjs 踏坑指南1: 一些概念

Reactjs 踏坑指南1: 知識點

  • 什么是React
  • 虛擬DOM
  • JSX
  • 組件
  • 生命周期和狀態
  • 事件
  • 單項數據流
  • Reactjs和Angularjs的對比

React簡介

React是一個Facebook開發的UI庫。使用這個庫可以很方便的開發交互式的、具有表達力的和可重用的UI組件。本身并不是一個框架,可視為是視圖層,并且是一個以組件為基礎的高效視圖。對于React應用而言,你需要分割你的頁面,使其成為一個個的組件。也就是說你的應用是由一個個組件構成的。這種分割、復用組件的方式開發頁面,我們稱之為組件驅動開發

這個庫還使用了一種叫做虛擬DOM(Virtual DOM)的概念,這些DOM可以根據狀態有選擇的渲染。這樣,頁面就會盡量的減少DOM操作而達到保持頁面狀態的效果。

  • React JSFiddle 在線編輯工具
  • React 入門示例

虛擬DOM

用于優化視圖的渲染和刷新。以前我們更新視圖時,需要先清空DOM容器中的內容,然后將最新的DOM和數據追加到容器中,現在React將這一操作放到了內存中。

詳細說明一下:

虛擬 DOM 是在 DOM 的基礎上建立了一個抽象層,我們對數據和狀態所做的任何改動,都會被自動且高效的同步到虛擬 DOM,最后再批量同步到 DOM 中。

React 會在內存中維護一個虛擬 DOM 樹,當我們對這個樹進行讀或寫的時候,實際上是對虛擬 DOM 進行的。當數據變化時,然后 React 會自動更新虛擬 DOM,然后拿新的虛擬 DOM 和舊的虛擬 DOM 進行對比,找到有變更的部分,得出一個Patch,然后將這個 Patch 放到一個隊列里,最終批量更新這些 Patch 到 DOM 中。

這樣的機制可以保證即便是根節點數據的變化,最終表現在 DOM 上的修改也只是受這個數據影響的部分,可以保證非常高效的渲染。

  • 關于虛擬DOM diff算法的詳細分析

因為React使用了虛擬DOM,因此借助這種方式使得在服務端渲染輸出HTML成為可能。

JSX

JSX在ECMAScript的基礎上提供了類似于XML的擴展。

  • JSX in depth

組件

使用ReactDOM的render方法的時候,第一個參數是需要渲染的我們創建的組件,第二個是HTML的DOM節點,組件渲染之后在這里添加。我們可以使用createClass方法創建組件。

var MyComponent = React.createClass({render: function(){return (<h1>Hello, world!</h1>);}
});
復制代碼

注意:

  • 類名一定要首字母大寫
  • 添加組件屬性時,如果要使用class屬性和for屬性,屬性名不能直接用class和for,因為他們兩個是javascript的關鍵字,用className和htmlFor代替

組件創建好之后就可以在文檔里渲染出來了:

ReactDOM.render(<MyComponent />,document.getElementById('mount-point')
);
復制代碼

創建組件的時候,可以給組件添加一些屬性,這些屬性都存在于props中。這些屬性可以通過this.props在組件內訪問,也可以在render方法渲染時使用。

var MyComponent = React.createClass({render: function(){return (<h1>Hello, {this.props.name}!</h1>);}
});ReactDOM.render(<MyComponent name="handsome" />,document.getElementById('mount-point')
);
復制代碼

生命周期和狀態

生命周期

  • componentWillMount 在渲染之前調用一次。
  • componentDidMount 在渲染之后調用一次。
  • shouldComponentUpdate 返回值決定組件是否需要update。
  • componentWillUnmount 在卸載組件之前調用。

狀態

  • getInitialState 返回State的初始值。
  • getDefaultProps 獲取props的初始值。
  • mixins 一組對象,主要用來擴展當前組件的功能。

每一個組件都包含一個state對象和一個props對象。State(狀態)用setState方法設置。調用setState方法會觸發UI的更新,也是實現交互式開發的必要基礎。如果我們要在一開始設定初始狀態(initial state),可以調用getInitialState方法。

state用來在創建組件的時候設置屬性,props用于渲染的時候生成想組件綁定屬性?

var MyComponent = React.createClass({getInitialState:function(){return {count: 5};},render: function(){return (<h1>Hello, {this.state.count}!</h1>);}
});
復制代碼

事件

作為屬性包含在組件中

var Counter = React.createClass({incrementCount: function(){this.setState({count: this.state.count + 1});},getInitialState: function(){return {count: 0}},render: function(){return (<div class="my-component"><h1>Count: {this.state.count}</h1><button type="button" onClick={this.incrementCount}>Increment</button></div>);}
});ReactDOM.render(<Counter />,document.getElementById('mount-point')
);
復制代碼

單向數據流

在jquery時代,我們都是基于事件驅動,對于簡單的交互需求而言,這確實足夠了,而且開發起來非常迅速。但業務一旦復雜,這種基于事件驅動的東西就會變得很亂,頁面需要更新的DOM很多,就容易出錯。

單向數據流的概念就出現了。更新 DOM 的數據總是從頂層流下來,用戶事件不直接操作 DOM,而是操作頂層數據。這些數據從頂層流下來同時更新了DOM。你的代碼就很少會直接處理DOM,而是只處理數據的變更。這樣會很大程度上簡化代碼和邏輯。

舉個例子:我點擊一個button,然后頁面上一個span里數字+1,原有的思考邏輯是“點擊發生,然后數據變化,然后UI跟著變化+1”。而現在的思考邏輯是我的數據變化了,那么我的UI會自動更新,那么我只用考慮“點擊發生,數據變化”。甚至可以把UI和數據變化分層然后處理。

具體地說:

在一個多組件結構里,一個父組件需要負責管理狀態,并把數據通過props向下發放。

組件的狀態通過setState方法更新。數據通過設置子組件的屬性來傳遞給子組件,子組件通過this.props來獲取這些數據

例子1: 實現一個動態查找框

var FilteredList = React.createClass({filterList: function(event){var updatedList = this.state.initialItems;updatedList = updatedList.filter(function(item){return item.toLowerCase().search(event.target.value.toLowerCase()) !== -1;});this.setState({items: updatedList});},getInitialState: function(){return {initialItems: ["Apples","Broccoli","Chicken","Duck","Eggs","Fish","Granola","Hash Browns"],items: []}},componentWillMount: function(){this.setState({items: this.state.initialItems})},render: function(){return (<div className="filter-list"><input type="text" placeholder="Search" onChange={this.filterList}/><List items={this.state.items}/></div>);}
});var List = React.createClass({render: function(){return (<ul>{this.props.items.map(function(item) {return <li key={item}>{item}</li>})}</ul>)  }
});ReactDOM.render(<FilteredList/>, document.getElementById('mount-point'));
復制代碼

React和Angular的對比

Angular是框架,React是類庫。ng是一個完整的框架,提供了比 React 多得多的建議和功能,你只需要直接使用就可以了。而要用React,開發者通常還需要借助別的類庫來打造一個真正的應用。比如你可能需要react-router庫來處理路由、redux或flux管理state、額外的庫做測試以及管理依賴等等。 "如果僅從框架這一點來看,選擇Angular還是React就像選擇直接購買成品電腦還是買零件自己組裝一樣。"

在大小方面,由于ng是一個大而全的框架,自帶了更多的功能。而React只加載你需要的部件,react要比ng小得多。很多應用其實用不到這種大型框架提供的所有功能。在這個越來越擁抱微服務、微應用、單一職責模塊(single-responsibility packages)的時代,React 通過讓你自己挑選必要模塊,讓你的應用大小真正做到量身定做。

React以JavaScript為中心,把"HTML"放到JS里,JavaScript遠比HTML要強大。因此,增強JavaScript讓其支持標簽要比增強HTML讓其支持邏輯要合理得多。無論如何,HTML與JavaScript 都需要某種方式以粘合在一起。 Angular是以HTML而非JavaScrip為中心的,把“JS”放到HTML里。你必須學習學一大堆Angular特有的語法(標簽),即ng框架特有的HTML補丁(shim),比如為HTML加入了循環語義的HTML特性。而React只需要你懂JS。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539843.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539843.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539843.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux為什么受歡迎?

1、Linux以高效和靈活著稱&#xff0c;實現了幾乎全部的Unix特性&#xff0c;同時具備多任務&#xff0c;多用戶的能力&#xff0c;支持多線程&#xff0c;多CPU架構。 2、Linux操作系統軟件包&#xff1a;包含了文本編輯器&#xff0c;高級語言編譯器&#xff0c;以及X-Windo…

直播的學習與使用-----采集

// 捕獲音視頻 - (void)setupCaputureVideo { // 1.創建捕獲會話,必須要強引用&#xff0c;否則會被釋放 AVCaptureSession *captureSession [[AVCaptureSession alloc] init]; _captureSession captureSession; // 2.獲取攝像頭設備&#xff0c;默認是后置攝像頭 AVCaptureD…

html css js編程順序,html css js先學哪個呢?

前端開發三劍客為 HTML、CSS、JavaScript。這三門語言的掌握對前端開發程序員來說是必須的&#xff0c;但有不少同學不懂得先學習哪一門語言。那么這篇文章 w3cschool 小編就來為你解答一下 HTML、CSS、JavaScript 先學哪個的問題。首先需要學習的是 HTML&#xff0c;HTML 是開…

蘋果手機收不到推送信息_iPhone手機收不到正式版系統更新推送怎么辦?(附解決方法)...

有不少熱衷于升級系統的小伙伴&#xff0c;希望在第一時間升級到最新版 iOS 系統進行體驗&#xff0c;但難免也會遇到無法收到更新推送的問題。主要有以下原因。iPhone手機收不到正式版系統更新推送怎么辦?網絡狀況不佳如果當前網絡狀況不好&#xff0c;可能無法收到來自蘋果官…

Linux系統特點介紹集合

1、開源代碼程序&#xff0c;可自由修改。 2、Unix系統兼容&#xff0c;具備Unix幾乎所有優秀特性&#xff0c;同Unix指令集。 3、可自由傳播&#xff0c;無任何商業版權制約。 4、適合Intel等x86 CPU系列架構的計算機。 5、一個完善的多用戶&#xff0c;多任務&#xff0c…

火狐 移動 html 元素,python中的Firefox+Selenium:如何交互式地獲取元素html?

Im使用PythonSeleniumSplinterFirefox創建一個交互式web爬蟲。在python腳本提供了選項&#xff0c;然后Selenium打開Firefox并發送一些命令。在現在&#xff0c;我需要讓python腳本知道用戶想要與之交互的web元素。在我目前使用的方法是&#xff1a;Right-click the item in th…

瘦子的腸道菌群和胖子的區別_瘦子和病態肥胖患者腸道菌群組成和潛在功能的顯著差異...

10.1111/joim.1313707-07, ArticleAbstract & Authors:展開Abstract:收起Introduction:The gut microbiome may contribute to the development of obesity. So far, the extent of microbiome variation in people with obesity has not been determined in large cohorts…

Centos下載地址

下載地址&#xff1a; 從阿里鏡像網站上下載 http://mirrors.aliyun.com/centos/ 建議選用Centos 6.x windows電腦配置&#xff1a;至少4G內存&#xff0c;i5處理器或以上。 Linux虛擬機分配&#xff1a;內存128M~1024M&#xff0c;cpu 1核心&#xff0c;硬盤8g即可。

html分塊時邊距的設置,html – 文本節點后第一個塊的邊距(垂直空間)?

我不確定你是否會認為這是對你的問題的完整答案,因為我知道你正在使用< td>在您的示例中,< td>之間存在一個差異.和< dd>或者< li>元素是< td>的事實.在不破壞< table>的情況下,元素不能與其周圍元素相抵消具體行為.但至少我可以回答你的第…

實現連麥_微信重磅更新,視頻號直播連麥打賞美顏上線,新增巨大流量入口

12月23日晚&#xff0c;微信迎來重大改版&#xff01;在最新7.0.20版本的微信中&#xff0c;視頻號大招不斷&#xff0c;不僅上線了連麥功能&#xff0c;支持美顏瘦臉、打賞等功能。此外&#xff0c;微信還給視頻號開放了兩個重大入口&#xff0c;包括微信個人名片和“發現”ta…

VMware Workstation 網絡設置解釋三種

一、NAT Network Address Translation&#xff0c;網絡地址轉換&#xff0c;NAT模式是比較簡單的實現虛擬機上網的方式&#xff0c;NAT模式的虛擬機時通過物理電腦上網和交換數據的。 在NAT模式下&#xff0c;虛擬機的網卡連接到物理機的VMware上&#xff0c;此時VMware軟件的…

cuda 核函數 for循環_【CUDA 基礎】4.4 核函數可達到的帶寬

Abstract: 本文通過矩陣轉置這一個例子&#xff0c;調整&#xff0c;優化核函數&#xff0c;使其達到最優的內存帶寬Keywords: 帶寬&#xff0c;吞吐量&#xff0c;矩陣轉置開篇廢話下面是廢話&#xff0c;與本文知識無關&#xff0c;可以直接跳到下面紅字處開始本文知識的學習…

小程序 - swiper除了左右切換還有上下滾動超出屏幕的內容

本來呢&#xff0c;我是有專門整理小程序惡心bug的文章的&#xff0c;每次只要添加匯總就好&#xff0c; 但是呢&#xff0c;鑒于這個問題的惡心程度&#xff0c;所以我把他單獨拿出來說了。 ——————————————--------------------------------------------------產…

學徒學計算機,那個有能力的高人愿意收我做學徒啊,我是學計算機的

類似問題答案我學的是計算機專業&#xff0c;南京有那些學校招這個專業啊&#xff1f;跟隨 已跟隨 取消 確定 你是說去學習還是去工作&#xff1f; 如果工作&#xff0c;現在很多對學位有一定要求&#xff0c;一般都要本科以上&#xff1b; 如果是學習&#xff0c;那也得看你自…

Linux磁盤分區及要求

一、分區 1、磁盤分區有主分區&#xff0c;擴展分區和邏輯分區之分。一塊磁盤最多有4個主分區&#xff0c;其中一個主分區的位置可以用一個擴展分區替換&#xff0c;在這個擴展分區內可以劃分多個邏輯分區。 2、一塊磁盤最多只能有一個擴展分區&#xff0c;擴展分區不能直接使…

二分查找和二叉查找樹

2019獨角獸企業重金招聘Python工程師標準>>> 1 二分查找 算法思想&#xff1a; 二分查找要求元素排列有序。首先&#xff0c;假設表中元素是按升序排列&#xff0c;將數組中間位置的元素與查找關鍵字比較&#xff0c;如果兩者相等&#xff0c;則查找成功&#xff1…

springboot判斷有沒有庫_Springboot 使用JPA @Query 注解 查詢語句條件 有可能為空,Oracle數據庫...

網上查了很多資料都是下面的方法,但是不適用于OracleQuery(value "select * from xxx where if(?1 !,x1?1,11) and if(?2 !,x2?2,11)" "and if(?3 !,x3?3,11) ",nativeQuery true)List find(String X1,String X2,String X3);——————————…

臺式計算機技術方案,2017年4月自考02316計算機應用技術真題及答案

本文提供的是2017年4月自考02316計算機應用技術真題及答案&#xff0c;真題不僅能幫助考生復習鞏固學到的知識&#xff0c;還能讓考生了解以往考試難易程度&#xff0c;真正掌握一套真題那么考試也不用擔心了。要考試的你一定要多多練習啊。2017 年 4 月高等教育自學考試全國統…

Linux磁盤編號

一、IDE接口磁盤 Linux的編碼規則是 /dev/hd* -------------------------------hda 第一塊盤 -------------------------------------------hda1 第一分區&#xff0c;hda2 第二分區&#xff0c;hda3 第三分區..... -------------------------------hdb 第二塊盤 …

Linux掛載點和文件系統類型介紹

一、掛載點 Mount Point 這是Linux下訪問磁盤分區的入口&#xff0c;即如果要往分區里寫入數據&#xff0c;就必須通過/boot入口來寫入&#xff0c;這一點和windows是不同的&#xff0c;因為在安裝Linux時&#xff0c;Mount Point項填寫 /boot二、文件系統類型 1、ext2/3/4&…