2016-10-30 8 views
9

'ı ateş etmiyor Diğer sınıflarımda, componentWillReceiveProps güzel çalışıyordu, ama bir nedenden dolayı, burada ateş etmiyor. geçmez edilecek veya dizi ItemView için olmak üzere olduğu takdirdecomponentWillReceiveProps

ItemView.jsx

class ItemView extends React.Component { 
    constructor(props) { 
     super(props); 

     this.state = { 
      name: null, 
      rating: null, 
      sector: null, 
      location: null, 
      description: null, 
      image: "blank.png", 
      show: false 
     }; 
    } 

    ... 

    componentWillReceiveProps(nextProps) { 

     if(!nextProps.companyToRender) { 
      this.setState({ 
       name: null, 
       rating: null, 
       sector: null, 
       location: null, 
       description: null, 
       image: "blank.png", 
       show: false 
      }); 
     } 
     else { 
      var companyToRender = nextProps.companyToRender; 

      this.setState({ 
       name: companyToRender.name, 
       rating: companyToRender.rating, 
       sector: companyToRender.sector, 
       location: companyToRender.location, 
       description: companyToRender.description, 
       image: companyToRender.image, 
       show: true 
      }); 
    } 

    ... 

    render() { 
     return(
     <div> 
     ... 
     <CommentBox show={this.state.show} companyToRender={this.state.name}/> 
     ... 
     </div> 
     ); 

    } 
} 

CommentBox.jsx pervane itemView iletilen

class CommentBox extends React.Component { 
    constructor(props) { 
     super(props); 
     this.state = {companyToRender: null}; 
    } 

    componentWillReceiveProps(nextProps) { 
     this.setState({companyToRender: nextProps.companyToRender}); 
    } 

    ... 
} 

ya sıfırdır.

componentWillReceiveProps(), yalnızca durumun nitelikleri boşaldığında, ancak ayarlandığında değil, tetiklenir. ((null -> entry) çalışmıyor ama (entry -> null) çalışır).

Bir şeyleri kaçırıyor muyum? Teşekkürler!

- düzenleme:

(boş -> girişi) güncellemeler devlet, ancak günlükleri veya sonraki herhangi componentWillRecieveProps çağırmaz(). (Ancak, giriş -> boş yapar.)

Logs for null --> entry

Logs for entry --> null

+0

"Item" öğesi "componentWillReceiveProps" veya "name" durumunun doğru olarak ayarlandığı kromun "tepki" denetçisi eklentisi aracılığıyla doğruladınız mı? 'Item' 'yeniden adlandırılıyor çünkü' isim 'değişmedi. –

+0

Hem componentWillReceiveProps() işlevinin içine hem de CommentBox.jsx'in render() işlevine giriş yapmayı denedim. Garip bir şekilde, logWarRecieveProps() içindeki günlüğü yazdırmaz, ancak null -> girişi sırasında render() içindeki durumu değiştirmez. Çıkışı krom üzerinde göstermek için girişi güncelleyeceğim. –

+0

"Öğeye geçirilen öğe, aktarılacak hiçbir şey yoksa veya ItemView öğesinin atadığı dizilerse null." Sorunuzda sadece bir hata mı var, yoksa '' companyToRender'' bir dizidir (dediğiniz gibi)? Sanırım bir nesne olmalı. Ayrıca, bileşen ilk kez monte edildiğinde componentWillReceiveProps çağrılmıyor (ancak bundan sonra). –

cevap

10

çok acı ayıklama sonra sorunun ItemView (reaksiyona-önyükleme) bir modal içinde adı edildiğini olduğunu tespit hangi bir nedenden dolayı, componentWillRecieveProps() desteklemiyor. Kodu yeniden kodlayarak sorunu gidermekle sonuçlandı. Teşekkürler beyler!

+0

Ağda bu bir yerde onay buldunuz mu ya da bir hata mı buldunuz? – ruffin

+4

Bu, mükemmel bir anlam ifade ediyor! Modal, her değişiklik olduğunda yepyeni bir bileşen oluşturması gerektiğinden, 'componentWillReceiveProps' hiçbir zaman çağrılmamaktadır (yalnızca ilk başta değil, _new_ sahne olduğunda çağrılmalıdır). Pervane mantığınızı yerine 'constructor()' yerine koymaya çalışın! Ayrıca, bana bir zaman hata ayıklama kaydetmek için Ty. –

+0

Sorunun ne olduğunu takip ettiğinizde ve yayınladığınız için teşekkürler! Ben sadece tepki modal ile oluşturulan bir modal içinde bir bileşenle aynı şeyi yaşadım ve cevabınız hızla bana bu konuda uyardı. – rockfakie

1

Aynı problemi yaşadım. Birisi doğrudan bir URL'de yazdığında, componentwillreceiveprops ateş etmedi. Tüm çalışmamı sağlamak için kodumu da yeniden düzenlemek zorunda kaldım.

render( 
 
<Router history={hashHistory} > 
 
{routes} 
 
</Router> 
 
, document.getElementById('root'));

varsayılan rota benim app.tsx oldu: yarattığım

Değişiklikler (yani dış unsur olarak yönlendirici var) gibi benim ilk index.tsx sahip bir şey oldu bir yapıyla sayfa aşağıdaki gibi: render() {

return (
<Provider store={store}> 
    <div id="appContainer"> 
      {this.props.children} 
    </div> 
</Provider> 
); 

}

Eğer daha önce olduğu gibi aynı sahne alıyorsanız
6

başkasının Bu konuda bir sorunu yaşıyorsa ...

componentWillReceivePropsçağrılmaz olacaktır. Ne etrafında almak için yapabileceğiniz Eğer bileşen içten bir şekilde

click() { 
    this.setState({counter: ++this.state.counter, unchangingProp:true}) 
} 
<Component unchangingProp={this.state.unChangingProp} counter={this.state.counter}/> 

componentWillRecieveProps her zaman tetiklenecek Bu şekilde kendini sıfırlar bu durumda bileşene aynı pervane göndermek istediğiniz her zaman dolaşır bir kukla pervane ekleyin .

+0

, bir şekilde bileşen durumunu güncellemek 'componentWillReceiveProps'ı da tetiklemiyor. –