摘要:中的事件不存在以上問題掛載的每個函數都可以控制在組件中,不會污染全局空間中沒有產生直接使用的,而是使用了事件委托方式處理,無論有多少個出現,其實最后都只在樹上添加了一個事件處理函數,掛在最頂層的節點上。
深入淺出React(一) 1、create-react-app工具使用
安裝create-react-app
npm install create-react-app -g
創建項目
creact-react-app demos cd demos npm start
分解應用
package.json
"scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject" }
npm start啟動開發環境,npm run build創建生產環境優化代碼,npm test用于測試單元,npm run eject把潛藏在react-scripts中的一序列技術?!皬椛洹钡?br>應用的頂端,此命令不可逆且會改變和增加一些文件。
2、react新的前端思維模式數據驅動渲染
開發者不需要像jQuery一樣詳細的操作DOM著重于‘如何去做’,只需要著重于“我要顯示什么”,而不用操心“怎樣去做”;
react理念UI = reader(data)
用戶看到的界面(UI),是一個 純函數(render) 的執行結果,只接受數據(data)作為參數;
純函數:沒有任何副作用,輸出完全依賴于輸入的函數;
對于react開發者,重要的是區分哪些屬于data,哪些屬于render,要更新界面,要做的就是更新data;
react實踐的也是"響應式編程"的思想。
3、Virtual DOM
每次render函數被調用,都要把整個組件重新渲染一遍會浪費,而react對此利用Virtual DOM,讓每次渲染都只從新渲染最少的DOM;
DOM樹:HTML是結構化文本,而DOM是結構化文本的抽象表達形式,瀏覽器在渲染HTML格式網頁時,會先將HTML文本解析以構建DOM樹,然后根據DOM樹渲渲染出用戶看到界面,當改變內容時,就去改變DOM樹上的節點;
雖然DOM樹只是一些簡單的JavaScript語句,但DOM操作會引起瀏覽器對網頁的從新布局和繪制,所以Web前端開發優化原則之一: 盡量較少DOM操作 ;
react開發會中jsx語句,將被Babel解析為創建React組件或HTML元素的語句,但React并不會通過其直接構建或操作DOM樹,而是先構建Virtual DOM;
DOM樹是對HTML的抽象,而Virtual DOM是對DOM樹的抽象;
Vritual DOM不觸及瀏覽器,只存在于JavaScript空間的樹形結構,每次自上而下的渲染React組件時,都會對比此次產生的Vritual DOM和上一次產生的,然后真正的DOM樹只需要操作有差別的部分。
4、JSX
JSX: 是JavaScript的語法擴展,允許我們在JavaScript中編寫HTML一樣的代碼,最終會編譯成普通的JavaScript語句;
屬性使用
自定義屬性data-*;
class和for為JavaScript保留關鍵字,所以class和for屬性使用className和htmlFor;
JavaScript表達式使用
JSX允許在閉合標簽中使用JavaScript表達式,但必須用{}包裹;
JavaScript表達式要求必須有 返回值 ,所以不能直接使用 if else 語句,但可以使用三元操作表達式和&&,||這樣的比較運算符來書寫;
如果確實需要使用 if else語句,可以寫在函數中,然后在{}中調用。
樣式
通過style屬性定義,單屬性值不能是字符串只能是對象,且屬性名需要使用駝峰命名法(font-size變為fontSize)。
注釋
標簽內注意需要寫在{}中。
數組
JSX中的數組會自動展開;
注意如果數組或迭代器中的每一項都是HTML標簽或組件,那么它們必須要擁有唯一的key屬性,這樣有助于React的DIFF算法,實現最高效的DOM更新。
事件掛載
JSX中可以通過onClick(HTML原生為onclick)
HTML直接使用onclick缺點:
onclick添加的事件處理函數是在全局環境下執行,污染全局環境,容易產生意想不到的后果;
給很多DOM元素添加onclick事件,可能會影響網頁的性能;
對于使用onclick的DOM元素,如果要動態的從DOM樹種刪除,需要把對應的事件處理器注銷,否則可能造成內存泄漏。
JSX中的onClick事件(不存在以上問題)
onClick掛載的每個函數都可以控制在組件中,不會污染全局空間;
JSX中onClick沒有產生直接使用onclick的HTML,而是使用了 事件委托 方式處理,無論有多少個onClick出現,其實最后都只在DOM樹上添加了一個事件處理函數,掛在最頂層的DOM節點上。
所有的點擊事件都被這個事件處理函數捕獲,然后根據具體組件分配給特定函數,所以性能較高;
因為React控制了組件的生命周期,在unmount的時候能夠清除相關的所有事件處理函數,內存泄漏問題解決。
function Demo(){ const name = "jsx"; const arr = [3. React數據數組
數組會自動展開,注意添加key屬性
]; const func = () => { let result = "hello"; if (name){ result += name; } else { result += "world"; } return result; }; return ({/*注釋*/}) }hello {name || "world"}
hello {name && "world"}
{func()}
{arr}
React的prop
prop(property的簡寫)是從外部傳遞給組件的數據,一個組件通過定義自己能夠接受的prop就定義了自己的對外公共接口;
每個React組件都是獨立存在的模塊,組件之外的一切都是外部世界,外部世界就是通過prop來和組件對話的。
給prop賦值
class Demo extends Component{ render(){ return() } }//給子組件 傳入caption和initValue信息,子組件需定義相關prop接口
讀取prop值
給this.prop賦值是React.Component構造函數的工作之一;
如果一個組件需要定義自己的構造函數,一定要在構造函數的第一行super調用父類也就是React.Component的構造函數;
如果沒有在構造函數中調用super(props),那么組件實例被構造之后,類實例的所有成員就無法通過this.props訪問到父組件傳遞過來的props值。
class Child extends Component{ constructor(props){ super(props); this.state = { //獲取外部傳入的prop,并用于state初始化 count: props.initValue || 0, caption: props.caption } } }
propTypes檢查
prop是組件的對外接口,所以一個組件該聲明自己的接口規范,規范組件支持哪些prop,每個prop該是什么樣的格式;
React通過propTypes來規范,因為propTypes已經從React包中分離出來,所以新版React中無法使用React.PropTypes.*,需導入prop-types
即安裝:npm install prop-type --save導入import PropTypes from ("prop-types")
propTypes驗證器
JavaScript基本類型:
PropTypes.array
PropTypes.bool
PropTypes.func
PropTypes.number
PropTypes.object
PropTypes.string
可以被渲染為子節點的對象,包括數值、字符串ReactElement(指的是JSX中的閉合標簽)或數組:
PropTypes.node
ReactElement
PropTypes.element
指定類的實例
PropTypes.instanceOf(Message)
只接受指定的值:
PropTypes.oneOf(["News","Photos"])
多個對象類型中的一個:
PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
PropTypes.instanceOf(Message)
])
指定類型組成的數組:
PropTypes.arrayOf(PropTypes.number)
指定類型的屬性構成的對象:
PropTypes.objectOf(PropTypes.number)
符合指定格式的對象:
PropTypes.shape({
color: PropTypes.string,
fontSize: PropTypes.number
})
在任意類型上加上isRequired使其不為空:
PropTypes.func.isRequired
eg: Child.propTypes = { initValue: PropTypes.number, caption: PropTypes.string }
React的state
state代表組件的內部狀態,由于React組件不能修改傳入的prop,所以需要使用state記錄自身數據變化;
state初始化
constructor(props){ ... this.state = { count: props.initValue || 0 } }
注意:使用React.createClass方法創建出來的組件類,通過getInitialState方法獲取初始值,但這種方法已被廢棄。
讀取和更新state
讀取this.state
更新this.setState({})
注意:不要直接修改this.state的值,雖然能夠改變組件的內部狀態,但只是野蠻的修改了state,卻不會驅動組件從新渲染,所以變化不會反應到界面
而,this.setState()所做的事是先改變this.state的值,然后驅動組件更新
prop和state對比
prop用于定義外部接口,state用于記錄內部狀態;
prop的賦值在外部世界使用組件時,state的賦值在組件內部;
組件不應該改變prop的值,而state的存在就是為了讓組件來改變。
React的context
使用prop給內部子組件傳遞數據時需要一層一層的傳遞,即使中間有組件不需要使用,這樣比較麻煩;
使用context可以實現跨級傳遞。
context使用步驟
父組件通過getChildContext()方法將需要傳入的信息放進context,并聲明childContextTypes(如果不聲明無法再組件中使用getChildContext());
要使用的子組件中通過聲明contextTypes(需要和父組件一致)就可以通過組件實例的context屬性訪問接收到的數據;
無狀態的組件可以在函數參數中獲取context;而又狀態的組件可以通過this.context和生命周期函數獲取context。
eg:
父組件
class Parent extends React.Component{ getChildContext(){ return {color: "red"} } render(){ return() } } Parents.childContextTypes = { color: PropTypes.string.isRequired }
(有狀態)子組件:
class Child extends React.Component{ render(){ return() } } Child.contextTypes = { color: PropTypes.string.isRequired }有狀態的組件可以通過this.context獲取
(無狀態)孫子組件:
function Grandchild(context){ return(無狀態組件可以直接在函數的參數中獲取
) } Grandchild.contextTypes = { color:PropTypes.string.isRequired }
不積跬步,何以行千里
持續加載中.....
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92989.html
摘要:中的元素組件實例和節點,是中關系密切的個概念,也是很容易讓初學者迷惑的個概念。組件和元素關系密切,組件最核心的作用是返回元素。只有組件實例化后,每一個組件實例才有了自己的和,才持有對它的節點和子組件實例的引用。 React 深入系列,深入講解了React中的重點概念、特性和模式等,旨在幫助大家加深對React的理解,以及在項目中更加靈活地使用React。 React 中的元素、組件、實...
摘要:中的元素組件實例和節點,是中關系密切的個概念,也是很容易讓初學者迷惑的個概念。組件和元素關系密切,組件最核心的作用是返回元素。只有組件實例化后,每一個組件實例才有了自己的和,才持有對它的節點和子組件實例的引用。 文:徐超,《React進階之路》作者授權發布,轉載請注明作者及出處 React 深入系列,深入講解了React中的重點概念、特性和模式等,旨在幫助大家加深對React的理解...
摘要:前言以深入學習技術棧為線索,記錄下學習的重要知識內容。要傳入時,必須使用屬性表達式。如果要使用自定義屬性,要使用前綴這與標準是一致的。 前言 以《深入學習react技術棧》為線索,記錄下學習React的重要知識內容。本系列文章沒有涵蓋全部的react知識內容,只是記錄下了學習之路上的重要知識點,一方面是自己的總結,同時拿出來和在學習react的人們一塊分享,共同進步。 正文 一:rea...
摘要:本篇是深入系列的最后一篇,將介紹開發應用時,經常用到的模式,這些模式并非都有官方名稱,所以有些模式的命名并不一定準確,請讀者主要關注模式的內容。 React 深入系列,深入講解了React中的重點概念、特性和模式等,旨在幫助大家加深對React的理解,以及在項目中更加靈活地使用React。 本篇是React深入系列的最后一篇,將介紹開發React應用時,經常用到的模式,這些模式并非都有...
摘要:當真正執行狀態修改時,依賴的并不能保證是最新的,因為會把多次的修改合并成一次,這時,還是等于這幾次修改發生前的。下篇預告深入系列組件的生命周期新書推薦進階之路作者徐超畢業于浙江大學,碩士,資深前端工程師,長期就職于能源物聯網公司遠景智能。 文:徐超,《React進階之路》作者授權發布,轉載請注明作者及出處 React 深入系列3:Props 和 State React 深入系列,深...
閱讀 3092·2021-11-25 09:43
閱讀 2268·2021-09-07 10:28
閱讀 3615·2021-08-11 11:14
閱讀 2789·2019-08-30 13:49
閱讀 3556·2019-08-29 18:41
閱讀 1175·2019-08-29 11:26
閱讀 1984·2019-08-26 13:23
閱讀 3383·2019-08-26 10:43