2016-02-02 19 views
5

API'mdan bir görüntü yükleyen bir kullanıcı avatarını temsil eden bir bileşenim var. Avatar yüklenirken varsayılan bir avatarı (başka bir görüntüyü değil) görüntülemesini istiyorum.Resim yüklenirken varsayılan öğeyi göster Resim

constructor() { 
    super(); 
    this.state = { 
    loaded: false, 
    }; 
} 

render() { 
    if (!this.props.uri || !this.state.loaded) { 
    return (
     <DefaultAvatar /> 
    ); 
    } 
    return <Image onLoad={this.onLoad.bind(this)} uri={this.props.uri} />; 
} 

onLoad() { 
    this.setState({loaded: true}); 
} 

Ben sorun bu akım koduyla, Image hale asla, bu nedenle devlet asla değişmeyecek olmasıdır. React ilkelerini ve gereksinimlerimi tatmin edecek bir çözüm bulamıyorum (görüntüyü görüntülemeden önce yüklemek için hayalet bileşenler yok).

+0

Görüntü sahne üzerinden yükleniyor mu? –

+0

DOM'da değilse, resim etiketinin yüklenmesini isteyemez. Yüklenene kadar 'display: none;' olarak ayarlayabilir misiniz? –

cevap

3
class LazyImage extends React.Component{ 
    constructor() { 
    super(this.props) 
    this.state = {loaded: false} 
    } 

    handleLoad() { 
    this.setState({loaded:true}) 
    } 

    componentDidMount() { 
    this.img = new Image() 
    this.img.onload = this.handleLoad.bind(this) 
    this.img.src = this.props.src 
    } 

    render() { 
    return this.state.loaded?<img src={this.props.src}/>:<div>Loading...</div> 
    } 
} 

Yerel bir Image unsuru oluşturmak ve yüklenmesini bekleyin. Ardından görüntüyü tepkiyle elde edersiniz. Tarayıcı akıllıdır ve bu sefer önbellekten alır. Anında render!

Bir demo için bkz. http://jsfiddle.net/4hq3y4ra/3/.

+0

Cevabınız için teşekkürler! Senin demonunu kontrol ettim ve harika çalışıyor, ama tepki ve tepki-yerli olarak düşündüğümden daha farklı benim için çalışmıyor. Sorumu, – Bhullnatik

+0

Bu konuda size yardımcı olamayacağını üzülerek düzenleyeceğim, üzgünüm. Ancak yeni bir soru oluşturmak ve bunu olduğu gibi bırakmak isteyebilirsiniz. – fl0cke

+0

Bu harika bir cevaptır! Neden kimse oy vermiyor? – pors

1

Bunun başarılabilmesi için birkaç yol vardır, ancak işleri basitleştirmek için varsayılan avatarı ve gerçek görüntüyü değiştirmek için bir hazır koşul kullanabilirsiniz.

constructor() { 
    super(); 
    this.state = { 
    loaded: false, 
    }; 
} 

onLoad(dataUri) { 
if(dataUri !== undefined){ 
    this.setState({loaded: true}); 
    } 

}, 

render() { 

    return (
      <Image onLoad={this.onLoad} uri={this.state.loaded ? this.props.uri : 'default-avatar'} /> 
     ); 

} 
+1

durumunda aranmaz. Cevabınız için teşekkür ederiz! Ne yazık ki benim durumumda çalışmıyor 'DefaultAvatar' başka bir bileşen, kullanabileceğim varsayılan bir uri değil. : / – Bhullnatik

İlgili konular