原文地址: http://andrewhfarmer.com/detect-image-load/
我過去經常會問:
有沒有一種方法去判斷子類組件是否已經渲染完成?
答案當然是有的啦 componentDidMount()
,在react component 已經渲染完成時 就會調用 componentDidMount()方法
如果你對 componentDidMount() 不太熟悉, 那么建議你去看看react組件的生命周期(React Component Lifecycle Methods),
哪里每一個方法你早晚都會用到的。
稍微多了解一些,你會意識到提問者真的想要知道的是圖片何時才算已經完成加載了,以react已經渲染了<img>標簽為標准是不能拿來判斷圖片已經加載完成的。
讓我們來建立幾個簡單的定義來理解rendered 和 loaded:
rendered(也叫渲染完成):react 已經把你的虛擬DOM元素轉化到真實DOM元素中並和真實的DOM建立起連接。
loaded:指圖片數據或者其他來自服務器端等遠程客戶端上的內容已經下載完成了(或者已經下載失敗了)
如果你還不都清楚,簡單的說,render 總是會在 load 之前
為什么要等待一個圖片加載?
額, 也許當你的圖片已經加載完了后你希望:
- 隱藏loading圖標。
- 自動加載更多圖片。
- 轉化UI,使圖片更加凸顯。
- 或者其他理由
想要找出如何判斷圖片加載事件的方法,那么就接着往下讀吧。
onLoad & onError
onload 和 onerror 這兩個屬性以及可以正常的在DOM<img>標簽上使用了(HTMLImageElement),react 要使用駝峰格式來獲取這個事件,這也是onLoad
and onError的來由。react的文檔中已經提倡這么用了,但並沒有討論具體為什么要這么用(Image Events)
所以你只要添加 onLoad
and onError
這兩個事件在你的react <img>標簽中就行了。如果還是不夠清楚,那么看看下面的代碼栗子吧!
Short Example
這里是一個關於使用 onLoad 事件的簡短的栗子, 想看更多詳細的關於如何顯示loading圖直到圖標加載完成的栗子, 就看看作者的下一篇文章(React Image Gallery)
下面的這個組件, ImageWithStatusText, 加載一張圖片和和顯示一段文本:'loaded' 或者 'failed to load'
import React from 'react'; class ImageWithStatusText extends React.Component { constructor(props) { super(props); this.state = { imageStatus: null }; } handleImageLoaded() { this.setState({ imageStatus: 'loaded' }); } handleImageErrored() { this.setState({ imageStatus: 'failed to load' }); } render() { return ( <div> <img src={this.props.imageUrl} onLoad={this.handleImageLoaded.bind(this)} onError={this.handleImageErrored.bind(this)} /> {this.state.imageStatus} </div> ); } } export default ImageWithStatusText;
它相當短吧。好好理解吧,希望對你們有用(這段話是譯者瞎嗶嗶的)