React核心內容歸納總結
狀態、屬性、元件API、元件的生命週期
當react的狀態改變時,自動執行this.render()方法更新元件
ES6寫React的時候,事件裡不會自動繫結this,需要自己繫結,或者直接在constructor裡寫方法
constructor(props) { super(props); this.state = { liked: false }; this.handleClick = (e) => { this.setState({liked: !this.state.liked}); }; }
狀態
import React from 'react'; class LikeButton extends React.Component {// es6用constructor代替getInitialState constructor(props) { super(props); this.state = { liked: false } } handleClick (e) { this.setState({liked: !this.state.liked}) } render () { let text = this.state.liked ? '喜歡': '不喜歡'; return( <div> <p onClick={this.handleClick.bind(this)}> 你喜歡紅茶嗎?{text} </p> </div> ) } } export default LikeButton;
props
HelloMessage.jsx
import React from 'react'; class HelloMessage extends React.Component { render () {return ( <div> Hello, {this.props.name} </div> ) } } export default HelloMessage;
main.js
import React from 'react'; import ReactDOM from 'react-dom'; import HelloMessage from './component/HelloMessage'; const app = document.getElementById('app'); ReactDOM.render(<HelloMessage name="Runoob"/>, app);
props驗證
可以保證應用元件被正確使用
React.PropTypes提供很多驗證器(validator)來驗證傳入資料是否有效。當props傳入無效資料時,JavaScript控制檯會丟擲錯誤。
import React from 'react'; class HelloMessage extends React.Component { render () { return ( <div> Hello, {this.props.name} </div> ) } } // getDefaultProps要寫在外部 HelloMessage.defaultProps = { name: 'this is default name' }; HelloMessage.propTypes = { name: React.PropTypes.string.isRequired }; export default HelloMessage;
更多驗證器
React.createClass({ propTypes: { // 可以宣告 prop 為指定的 JS 基本資料型別,預設情況,這些資料是可選的 optionalArray: React.PropTypes.array, optionalBool: React.PropTypes.bool, optionalFunc: React.PropTypes.func, optionalNumber: React.PropTypes.number, optionalObject: React.PropTypes.object, optionalString: React.PropTypes.string, // 可以被渲染的物件 numbers, strings, elements 或 array optionalNode: React.PropTypes.node, // React 元素 optionalElement: React.PropTypes.element, // 用 JS 的 instanceof 操作符宣告 prop 為類的例項。 optionalMessage: React.PropTypes.instanceOf(Message), // 用 enum 來限制 prop 只接受指定的值。 optionalEnum: React.PropTypes.oneOf(['News', 'Photos']), // 可以是多個物件型別中的一個 optionalUnion: React.PropTypes.oneOfType([ React.PropTypes.string, React.PropTypes.number, React.PropTypes.instanceOf(Message) ]), // 指定型別組成的陣列 optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number), // 指定型別的屬性構成的物件 optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number), // 特定 shape 引數的物件 optionalObjectWithShape: React.PropTypes.shape({ color: React.PropTypes.string, fontSize: React.PropTypes.number }), // 任意型別加上 `isRequired` 來使 prop 不可空。 requiredFunc: React.PropTypes.func.isRequired, // 不可空的任意型別 requiredAny: React.PropTypes.any.isRequired, // 自定義驗證器。如果驗證失敗需要返回一個 Error 物件。不要直接使用 `console.warn` 或拋異常,因為這樣 `oneOfType` 會失效。 customProp: function(props, propName, componentName) { if (!/matchme/.test(props[propName])) { return new Error('Validation failed!'); } } }, /* ... */ });
React元件API
setState 設定狀態
replaceState 替換狀態
setProps 設定屬性
replaceProps 替換屬性
forceUpdate 強制更新
findDOMNode 獲取DOM節點,查詢真實DOM
React.findDOMNode()只在mounted元件中呼叫,如果在元件的render()方法中呼叫React.findDOMNode()就會丟擲異常。
React元件的生命週期
元件生命週期的三個狀態
Mounting: 已插入真實DOM
Updating: 正在被重新渲染
Unmounting: 已移除真實DOM
生命週期方法
componentWillMount 在渲染前呼叫,在客戶端也在服務端
componentDidMount 在第一次渲染後呼叫,只在客戶端。
之後元件已經生成了對應的DOM結構,可以通過this.getDOMNode()來進行訪問。
如果你想和其他JavaScript框架一起使用,可以在這個方法中呼叫setTimeout, setInterval或者傳送AJAX請求等操作(防止異部操作阻塞UI)。
componentWillReceiveProps 在初始化render時不會被呼叫,當元件接收到一個新的prop時被呼叫
shouldComponentUpdate 返回一個布林值。當確認不需要更新元件時使用。在元件接收到新的state或新的props時被呼叫。在初始化時或使用forceUpdate時不被呼叫
componentWillUpdate 初始化不會呼叫。元件接收到新的state或者props但還沒有render時被呼叫
componentDidUpdate 初始化不會呼叫。元件完成更新後立即呼叫。
componentWillUnmount 元件從DOM中移除的時候立刻被呼叫。
用state判斷是否已經插入真實DOM
componentWillMount() { this.mounted = false; } componentDidMount() { this.mounted = true; }
需求:寫一個例項,在元件載入以後,通過componentDidMount設定一個定時器,改變元件的透明度並重新渲染
HelloMessage.jsx
import React from 'react'; class HelloMessage extends React.Component { constructor (props) { super(props); this.state = { opacity: 1.0 }; } componentDidMount () { this.timer = setInterval(() => { let opacity = this.state.opacity; opacity -= 0.05; if(opacity <= 0.1) { opacity = 1.0; } this.setState({ opacity: opacity }); }, 100); } render () { let myStyle = { fontFamily: 'microsoft yahei', width: '100%', height: '100px', background: 'red', opacity: this.state.opacity }; return ( <div style={myStyle}> Hello, {this.props.name} <p>{this.state.opacity}</p> </div> ) } } // getDefaultProps要寫在外部 HelloMessage.defaultProps = { name: 'this is default name' }; HelloMessage.propTypes = { name: React.PropTypes.string.isRequired }; export default HelloMessage;
另一個例項,體現react的生命週期
import React from 'react'; class Content extends React.Component { componentWillMount () { console.log('元件將被插入到真實DOM'); } componentDidMount () { console.log('已經插入真實DOM'); } componentWillReceiveProps (newProps) { console.log('元件將要接收屬性,新屬性是:'); console.log(newProps); } shouldComponentUpdate (newProps, newState) { return true; } componentWillUpdate (nextProps, nextState) { console.log('元件將要更新,下一個屬性:' + nextProps + ',下一個狀態:' + nextState); console.log(nextProps); } componentDidUpdate (prevProps, prevState) { console.log('元件已更新,上一個屬性:' + prevProps + ',上一個狀態:' + prevState); console.log(prevProps); } componentWillUnmount () { console.log('已經移除真實DOM'); } render () { return ( <div> 次數:{this.props.myNum} </div> ) } } class Increment extends React.Component { constructor (props) { super(props); this.state = { data: 0 }; } setNewNumber () { this.setState({ data: this.state.data + 1 }); } render () { return ( <div> <button onClick={this.setNewNumber.bind(this)}>Increment</button> <Content myNum={this.state.data}/> </div> ) } } export default Increment;
未完待續 ... ...
相關推薦
React核心內容歸納總結
狀態、屬性、元件API、元件的生命週期 當react的狀態改變時,自動執行this.render()方法更新元件 ES6寫React的時候,事件裡不會自動繫結this,需要自己繫結,或者直接在constructor裡寫方法 constructor(props) {
【GPU精粹與Shader程式設計】(四) 《GPU Gems 2》全書核心內容提煉總結 · 上篇
毛星雲,網路ID「淺墨」,90後,熱愛遊戲開發、遊戲引擎、計算機圖形、實時渲染等技術,就職於騰訊互娛。 微軟最有價值專家 著作《Windows遊戲程式設計之從零開始》、《OpenCV3程式設計入門》 碩士就讀於南京航空航天大學航天學院(2013級碩士研究生),已於2016年三月畢業。本科
【GPU精粹與Shader程式設計】(八) 《GPU Pro 1》全書核心內容提煉總結
本文由@淺墨_毛星雲 出品,首發於知乎專欄,轉載請註明出處 本文是【GPU精粹與Shader程式設計】系列的第八篇文章,全文共兩萬餘字。文章盤點、提煉和總結了《GPU Pro 1》全書總計22章的核心內容。 題圖來自《荒野大鏢客2》。
【GPU精粹與Shader程式設計】(二) 《GPU Gems 1》全書核心內容提煉總結 · 上篇
本文由出品,首發於知乎專欄,轉載請註明出處 題圖背景來自《戰神4》。 系列文章前言 我們知道,《GPU Gems》1~3 、《GPU Pro》1~7 以及《GPU
【GPU精粹與Shader程式設計】(三) 《GPU Gems 1》全書核心內容提煉總結 · 下篇
本文由出品,首發於知乎專欄,轉載請註明出處 題圖背景來自《神祕海域4》。系列文章前言《GPU Gems》1~3 、《GPU Pro》1~7 以及《GPU Zen》組成的饕餮盛宴,共11本書,合稱“GPU精粹三部曲“,是遊戲開發、計算機圖形學和渲染領域的業界頂尖大牛們一線經驗的
【GPU精粹與Shader程式設計】(五) 《GPU Gems 2》全書核心內容提煉總結 · 下篇
本文由@淺墨_毛星雲 出品,首發於知乎專欄,轉載請註明出處 本文核心內容為《GPU Gems 2》中講到的真實感水體渲染,以及真實感頭髮渲染、通用的折射模擬、改進的Perlin噪聲等次核心內容。
Linux 核心 Starting kernel ... 串列埠無輸出問題歸納總結
Starting kernel ... Uncompressing Linux....................................................................................................................
編譯Android原始碼和核心原始碼的歸納總結
經過一個多星期的努力,終於在零基礎的情況下在ubuntu-12.04-desktop-amd64(64位Ubuntu系統)成功編譯了android-4.0.3的原始碼和Linux version 2.6.29的linux核心原始碼。期間遇到很多困難,好幾次想放棄
React-Native開發總結+構建-除錯-基礎歸納總結
更新時間:2017年11月07日16:47:07 對於前端工程師來說,這幾年是最輝煌的時刻,前端框架層出不窮,而且出現了像RN這種功能的框架,更讓移動開發工程師大跌眼鏡望洋興嘆。新技術的不斷湧現,說明了一個問題,前端在程式設計技術界的地位越來越高,而且前端工程師的崗位越
mysql ACID與四種隔離級別歸納總結
重新 style 出現 等待 mic 復讀 級別 for 保存 關於數據庫的ACID特性已經有很多的介紹,這裏再重新歸納總結一下: A(atomicity)原子性: 即事務要麽全部做完,要麽全部不做,不會出現只做一部分的情形,如A給B轉帳,不會出現A的錢少了,
react生命周期總結
react 生命周期 當通過createClass創建了組件之後,該React組件就有了生命周期。通常一個React組件的生命周期可分為三個階段:Mounting:掛載組件,也就是組件實例化ReciveProps:存在期,在這個時期組件的props和state會變化,重新渲染組件Unmounting:
React Native細節知識點總結<一>
idm tdi 刷新 循環 chan filelist sse inpu function 1.propTypes: static propTypes = { name:PropTypes.string, ID:PropTypes.num
30分鐘掌握ES6/ES2015核心內容[上和下], 不錯的說
還得 天下 span default es6 ava arguments nts http ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標準。因為當前版本的ES6是在2015年發布的,所以又稱ECMAScript 2015。 也就是說,E
React Native使用Redux總結
war lda 技術 pan strong blog connect lar win 1>npm安裝redux: "react-redux": "^5.0.5", "redux": "^3.7.1", "redux-thunk": "^2.2.0" 2>大
React Native使用Mobx總結
color nsh ... 博客 react 下大雨 shu mas https 參考博客: http://www.jianshu.com/p/505d9d9fe36a 這是目前為止覺得最詳細學習的博客了 Mobx實現購物車Demo: https://github
C#方法有關內容的總結--C#基礎
programe height tasks adk 實例方法 text 三角形面積 string math.sqrt 1、靜態方法與實例方法 using System;using System.Collections.Generic;using System.Linq;u
關於《軟件需求分析》需要掌握哪些必要的內容的總結與思考
http 可控 那種 基礎 由於 這一 技術 行為 領域 一、軟件需求的目的: 1.準確的理解和描述客戶需要的功能 客戶只知道他不滿意,但怎樣才能使他滿意呢?他不知道,於是就在一點兒一點兒試,於是這種反復變更就這樣發生了。 如果我們明白了這一點,深入地去理解客戶的業務,
字符串類型內建方法歸納總結
內建函數版本:python3.6在查看bulitins的內建函數時,對字符串的內建方法進行了分類總結。類別 方法描述示例查找string.find(sub, start=None, end=None)在指定的範圍內查找子串,找到則返回最小的index;未找到則返回-1mystr = ‘hello world
詳解斯坦納點及斯坦納樹及模版歸納總結
什麽是 com 需要 spa hub 等於 pac 其中 給定 ①什麽是斯坦納點? 假設原來已經給定了個點,庫朗等指出需要引進的點數至多為,此種點稱為斯坦納點。過每一斯坦納點,至多有三條邊通過。若為三條邊,則它們兩兩交成120°角;若為兩條邊,則此斯坦納點必為某一已
Hibernate核心接口總結
www html iar hibernate store c89 idt 核心 udf 1zazm7縣珊群啦號偎http://weibo.com/p/1005056358280635i9p7vt宰玖胤綠刑舊http://www.docin.com/bqpgm5506dsrl