React 入門學習筆記2

摘自阮一峰:React入門實例教程,轉載請注明出處。

?

一、獲取真實的DOM節點

  組件并不是真實的 DOM 節點,而是存在于內存之中的一種數據結構,叫做虛擬 DOM (virtual DOM)。只有當它插入文檔以后,才會變成真實的 DOM 。根據 React 的設計,所有的 DOM 變動,都先在虛擬 DOM 上發生,然后再將實際發生變動的部分,反映在真實 DOM上,這種算法叫做 DOM diff ,它可以極大提高網頁的性能表現。

  但是,有時需要從組件獲取真實 DOM 的節點,這時就要用到 ref 屬性。

var MyComponent = React.createClass({handleClick: function() {this.refs.myTextInput.focus();},render: function() {return (<div><input type="text" ref="myTextInput" /><input type="button" value="Focus the text input" onClick={this.handleClick} /></div>);}
});ReactDOM.render(<MyComponent />,document.getElementById('example')
);

  上面代碼中,組件 MyComponent 的子節點有一個文本輸入框,用于獲取用戶的輸入。這時就必須獲取真實的 DOM 節點,虛擬 DOM 是拿不到用戶輸入的。為了做到這一點,文本輸入框必須有一個 ref 屬性,然后 this.refs.[refName] 就會返回這個真實的 DOM 節點。

  需要注意的是,由于 this.refs.[refName] 屬性獲取的是真實 DOM ,所以必須等到虛擬 DOM 插入文檔以后,才能使用這個屬性,否則會報錯。上面代碼中,通過為組件指定 Click 事件的回調函數,確保了只有等到真實 DOM 發生 Click 事件之后,才會讀取 this.refs.[refName] 屬性。

  React 組件支持很多事件,除了 Click 事件以外,還有 KeyDown 、Copy、Scroll 等,完整的事件清單請查看官方文檔。

?

二、this.state 組件狀態

  組件免不了要與用戶互動,React的一大創新,就是將組件看成是一個狀態機,一開始有一個初始狀態,然后用戶互動,導致狀態變化,從而觸發重新渲染 UI。

var LikeButton = React.createClass({getInitialState: function() { //定義初始狀態,也就是一個對象return {liked: false};},handleClick: function(event) {this.setState({liked: !this.state.liked}); //通過this.state屬性讀取定義的狀態//每次修改以后,自動調用 this.render 方法,再次渲染組件},render: function() {var text = this.state.liked ? 'like' : 'haven\'t liked';return (<p onClick={this.handleClick}>You {text} this. Click to toggle.</p>);}
});ReactDOM.render(
<LikeButton />,document.getElementById('example') );

  上面代碼是一個 LikeButton 組件,它的 getInitialState 方法用于定義初始狀態,也就是一個對象,這個對象可以通過 this.state 屬性讀取。當用戶點擊組件,導致狀態變化,this.setState 方法就修改狀態值,每次修改以后,自動調用 this.render 方法,再次渲染組件。

  由于 this.props 和 this.state 都用于描述組件的特性,可能會產生混淆。一個簡單的區分方法是,this.props 表示那些一旦定義,就不再改變的特性,而 this.state 是會隨著用戶互動而產生變化的特性。

?

三、表單

  用戶在表單填入的內容,屬于用戶跟組件的互動,所以不能用 this.props 讀取。

var Input = React.createClass({getInitialState: function() {return {value: 'Hello!'};},handleChange: function(event) {this.setState({value: event.target.value});},render: function () {var value = this.state.value;return (<div><input type="text" value={value} onChange={this.handleChange} /><p>{value}</p></div>);}
});ReactDOM.render(<Input/>, document.body);

  上面代碼中,文本輸入框的值,不能用 this.props.value 讀取,而要定義一個 onChange 事件的回調函數,通過 event.target.value 讀取用戶輸入的值。textarea 元素、select元素、radio元素都屬于這種情況.

?

四、組件的生命周期

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

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):組件判斷是否重新渲染時調用

  下面是一個例子。

var Hello = React.createClass({getInitialState: function () {return {opacity: 1.0};},componentDidMount: function () {this.timer = setInterval(function () {var opacity = this.state.opacity;opacity -= .05;if (opacity < 0.1) {opacity = 1.0;}this.setState({opacity: opacity});}.bind(this), 100);},render: function () {return (<div style={{opacity: this.state.opacity}}>Hello {this.props.name}</div>);}
});ReactDOM.render(<Hello name="world"/>,document.body
);

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

  另外,組件的style屬性的設置方式也值得注意,不能寫成

style="opacity:{this.state.opacity};"

  而要寫成

style={{opacity: this.state.opacity}}

  這是因為 React 組件樣式是一個對象,所以第一重大括號表示這是 JavaScript 語法,第二重大括號表示樣式對象。

?

五、Ajax

  組件的數據來源,通常是通過 Ajax 請求從服務器獲取,可以使用 componentDidMount 方法設置 Ajax 請求,等到請求成功,再用 this.setState 方法重新渲染 UI.

var UserGist = React.createClass({getInitialState: function() {return {username: '',lastGistUrl: ''};},componentDidMount: function() {$.get(this.props.source, function(result) {var lastGist = result[0];if (this.isMounted()) {this.setState({username: lastGist.owner.login,lastGistUrl: lastGist.html_url});}}.bind(this));},render: function() {return (<div>{this.state.username}'s last gist is<a href={this.state.lastGistUrl}>here</a>.</div>);}
});ReactDOM.render(<UserGist source="https://api.github.com/users/octocat/gists" />,document.body
);

  上面代碼使用 jQuery 完成 Ajax 請求,這是為了便于說明。React 本身沒有任何依賴,完全可以不用jQuery,而使用其他庫。

轉載于:https://www.cnblogs.com/lishuxue/p/6121775.html

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

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

相關文章

c語言getchar函數_C語言中帶有示例的getchar()函數

c語言getchar函數C語言中的getchar()函數 (getchar() function in C) The getchar() function is defined in the <stdio.h> header file. getchar()函數在<stdio.h>頭文件中定義。 Prototype: 原型&#xff1a; int getchar(void);Parameters: FILE *filename(f…

python及pycharm

1.python簡介&#xff1a; Python是一種計算機程序設計語言。是一種動態的、面向對象的腳本語言&#xff0c;最初被設計用于編寫自動化腳本(shell)&#xff0c;隨著版本的不斷更新和語言新功能的添加&#xff0c;越來越多被用于獨立的、大型項目的開發。 python最重要的功能&am…

anaconda如何更改環境配置_手把手教新手安裝Anaconda配置開發環境

Anaconda是針對Python的集成環境&#xff0c;它已經成為全球數千萬數據科學從業人員必備的開發工具&#xff0c;幫助人們有效地解決數據科學和機器學習相關地問題。如果你想從事數據科學和機器學習的工作&#xff0c;可以從本文開始&#xff0c;了解一下如何安裝Anaconda。1. 初…

詳解摘要認證

1. 什么是摘要認證摘要認證與基礎認證的工作原理很相似&#xff0c;用戶先發出一個沒有認證證書的請求&#xff0c;Web服務器回復一個帶有WWW-Authenticate頭的響應&#xff0c;指明訪問所請求的資源需要證書。但是和基礎認證發送以Base 64編碼的用戶名和密碼不同&#xff0c;在…

Python的基礎知識

1.注釋&#xff1a; #單行注釋ctrl / 批量注釋&#xff0c;選中需要注釋的所有行ctrl / 批量取消注釋&#xff0c;選中已經被注釋的所有行 塊注釋&#xff1a;上下各三個雙引號的部分全部被注釋 “”“ hello haha ”“”2.變量&#xff1a; 變量命名的規則&#xff1a; …

樹莓派該文件名_樹莓派:文本編輯器與文件

GNU nano是Unix系統下一款常用的文本編輯器&#xff0c;以簡單易用著稱。與之相比&#xff0c;功能更強大的Vi和Emacs編輯器&#xff0c;學習曲線比nano陡峭很多。由于nano對于一般的文本編輯來說已經足夠&#xff0c;所以我想簡單介紹一下&#xff0c;以便于更好入門。基本使用…

Java SimpleTimeZone setStartYear()方法與示例

SimpleTimeZone類setStartYear()方法 (SimpleTimeZone Class setStartYear() method) setStartYear() method is available in java.util package. setStartYear()方法在java.util包中可用。 setStartYear() method is used to set the DST (Daylight Savings Time) starting y…

報表在IBM AIX系統下resin部署

&#xfeff;&#xfeff;報表是用java開發的&#xff0c;具有良好的跨平臺性。不僅可以應用在windows、linux、操作系統&#xff0c;還可以應用在AIX等等的unix操作系統。在各種操作系統上部署過程有一些差別。下面說一下在AIX操作系統的部署的步驟。 1. 首先&#xff0c;下載…

python——if語句、邏輯運算符號

1.if條件判斷語句&#xff1a; if 要判斷的條件(True):條件成立的時候&#xff0c;要做的事情 elif 要判斷的條件(True):.... elif 要判斷的條件(True):.... else:條件不成立的時候要做的事情示例&#xff1a; 判斷學生分數等級&#xff1a; 100——90&#xff08;包括90&…

sox處理mp3_使用SoX將mp3文件拆分為TIME秒

I need to split mp3 file into slices TIME sec each. Ive tried mp3splt, but it doesnt work for me if output is less than 1 minute.Is it possible do do with:sox file_in.mp3 file_out.mp3 trim START LENGTHWhen I dont know mp3 file LENGTH解決方案You can run SoX…

Java ObjectOutputStream writeInt()方法及示例

ObjectOutputStream類writeInt()方法 (ObjectOutputStream Class writeInt() method) writeInt() method is available in java.io package. writeInt()方法在java.io包中可用。 writeInt() method is used to write the given 4 bytes of an integer value. writeInt()方法用于…

移動端適配方案(上)

轉載自:https://github.com/riskers/blog/issues/17 要搞懂移動端的適配問題&#xff0c;就要先搞明白像素和視口。 像素 在移動端給一個元素設置 width:200px 時發生了什么&#xff1f;這里的px到底是多長呢&#xff1f;像素是網頁布局的基礎&#xff0c;但是我們一直在用直覺…

python——rang函數、for、braek循環

rang函數&#xff1a; start: 計數從 start 開始。默認是從 0 開始。例如range&#xff08;5&#xff09;等價于range&#xff08;0&#xff0c; 5&#xff09;; stop: 計數到 stop 結束&#xff0c;但不包括 stop。例如&#xff1a;range&#xff08;0&#xff0c; 5&#xf…

Java文件類boolean isHidden()方法(帶示例)

文件類boolean isHidden() (File Class boolean isHidden()) This method is available in package java.io.File.isHidden(). 軟件包java.io.File.isHidden()中提供了此方法。 This method is used to check whether the file is hidden or not. 此方法用于檢查文件是否隱藏。…

js導出的xlsx無法打開_js-xlsx 導出表格至excel

引入js文件下載地址&#xff1a;鏈接: https://pan.baidu.com/s/1gdOl1HnTrM5mZgPgd5qeDQ 提取碼: c8js導入4個js文件js/xlsx.extendscript.js,js/xlsx.full.min.js,js/export.js,js/jszip.js,js/xlsx-style/xlsx.full.min.js其中 js/xlsx-style/xlsx.full.min.js 是表格樣式的…

oracle sql 語句如何插入全年日期?

為什么80%的碼農都做不了架構師&#xff1f;>>> oracle sql 語句如何插入全年日期&#xff1f; create table BSYEAR (d date); insert into BSYEAR select to_date(20030101,yyyymmdd)rownum-1 from all_objects where rownum < to_char(to_date(20031231,…

getparent_Java文件類字符串getParent()方法(帶示例)

getparent文件類字符串getParent() (File Class String getParent()) This method is available in package java.io.File.getParent(). 軟件包java.io.File.getParent()中提供了此方法。 This method is used to return the parent of the given file object(i.e In case of f…

python—while循環、字符串

1. while循環&#xff1a; while 條件滿足&#xff1a;滿足條件執行的語句 else:不滿足條件執行的語句while 死循環 只要滿足 while的條件永遠為真&#xff0c;就會進入無限循環 while True:print(一直循環)while嵌套 \t &#xff1a;在控制臺輸出一個制表符&#xff0c;協助…

java基礎——java基本運算

java基本運算 轉載于:https://www.cnblogs.com/zhouj/p/6132535.html

【Java】MybatisPlus

MybatisPlus MybatisPlus是在mybatis基礎上的一個增強型工具。它對mybatis的一些操作進行了簡化&#xff0c;能夠提高開發的效率。 springboot整合了mybatis之后&#xff0c;其實已經非常方便了&#xff0c;只需要導入mybatis的包后&#xff0c;在配置文件中編寫數據源信息&a…