2016-10-12 3 views
1

Ich habe 2 Komponenten.Child Reactjs Komponente nicht neu rendern

  • Youtube - übernimmt die searchbar und einen Behälter für die Suchergebnisse
  • YoutubeSearchResults - wie angedeutet ... zeigt die Suchergebnisse nach einem Ajax-Aufruf

Zum ersten Mal beendet ist, wenn Sie suchen nach etwas, das Ergebnis zeigt sich gut. Aber wenn Sie erneut suchen (Abfrage geändert oder nicht), wird YoutubeSearchResults nicht aktualisiert (/ re-render), obwohl die Render-Funktion aufgerufen und ausgeführt wird (ich weiß, weil verschiedene show.output von console.log). Ich kann nicht herausfinden, warum das passiert und keine Suche scheint ähnlich zu sein, was ich erlebe.

Youtube Komponente:

... 
render() { 
    let body = null; 
    if(this.state.data !== null) { 
     body = <YoutubeSearchResults data={this.state.data} /> 
    } 
    return (
     <div> 
      <div className="youtube-header"> 
       <form name="youtube-search" action="" onSubmit={this.search.bind(this)} method="post" ref="youtubeSearch"> 
        <input type="text" name="q" placeholder="Search" autoComplete="off" /> 
       </form> 
      </div> 
      <div className="youtube-body" ref="youtubeBody">{body}</div> 
     </div> 
    ); 
} 
search(e) { 
    let self = this; 

    ... ajax request ... }, function(data) { 
     self.setState({ data: data }); 
    }); 
} 

YoutubeSearchResults Komponente:

export default class YoutubeSearchResults extends React.Component { 
    constructor(props) { 
     super(props); 

     this.state = { 
      data: null, 
      currentPage: 0, 
      currentVideoId: null 
     }; 
    } 
    componentWillReceiveProps() { 
     this.setState({ currentVideoId: null }); 
    } 
    render() { 
     let self = this; 
     ... 
     return (
      <div> 
       {(this.state.data||this.props.data).map(function(obj, key) { 
        return (
         <div key={key}> 
          <img src={obj.thumbnails.medium} className="youtube-result-thumbnail" /> 
          <h3 className="youtube-result-title">{obj.title}</h3> 
          <div className="youtube-result-duration"> 
           <span>{obj.contentDetails.duration.toSeconds().parseDuration()}</span> 
          </div> 
         </div> 
        ); 
       })} 
       ... 
      </div> 
     ); 
    } 
    ... 
} 
+0

Bitte Postleitzahl * hier * eingeben. Ich habe das diesmal für dich gemacht, aber bitte posten Sie es * hier *. Ich würde auch vorschlagen, uns nur relevanten Code für Ihr Problem zu geben, da das Durchsieben von zwei ganzen Dateien wirklich zeitaufwändig ist und viele davon abhalten wird, zu helfen. – Li357

+0

@AndrewL. Danke und Entschuldigung. Habe hier schon lange nicht mehr gepostet – 73cn0109y

+0

Warum hast du 'this.state.data || this.props.data'? Es hört sich so an, als ob deine 'render'-Funktion auf die Daten in deinem * state * verweist, die verhindern, dass sie die Daten in deinen * Requisiten * benutzt. – Wex

Antwort

0

Ok, so habe ich es heraus. Als ich eine Suche durchgeführt habe, habe ich den Suchergebnis-Container geleert.

search(e) { 
    let self = this; 

    ... ajax request ... }, function(data) { 
     $(self.refs.youtubeBody).empty(); // <-- This was the issue 
     self.setState({ data: data }); 
    }); 
} 

Sie wissen nicht, warum ich nicht dieses, bevor dachte aber ja, ich bin Vermutung es effektiv war das Löschen so die YoutubeSearchResults Komponente, wenn die Requisiten zu aktualisieren es nicht gesetzt oder etwas wurde. Habe es irrtümlicherweise auch nicht in Frage gestellt, weil ich damals nicht gedacht habe, dass das das Problem war.

Wenn Sie ein ähnliches Problem haben, stellen Sie sicher, dass Sie die Komponente nicht entfernen.

0

Sie benötigen Zustand in geordnete Komponente zu aktualisieren, wenn es neue Eigenschaften erhält:

componentWillReceiveProps(newProps) { 
    this.setState({ currentVideoId: null, data: newProps.data }); 
} 

Dieses Update wird auch Trigger erneut rendern.

+0

Immer noch das gleiche Problem. Es aktualisiert die Props/State-Daten, aber es wird nichts gerendert. – 73cn0109y

0

Wenn Sie in React nur etwas ohne Änderungen anzeigen müssen, vermeiden Sie die Speicherung im Status. Das fügt unnötige Komplikationen und Rendering-Overhead hinzu.

Ich habe das überflüssige Zustandsobjekt für data entfernt und den mehrdeutigen (this.state.data||this.props.data) Mapping-Aufruf entfernt. Funktioniert der folgende Code für Sie?

YoutubeSearchResults:

export default class YoutubeSearchResults extends React.Component { 
    constructor(props) { 
     super(props); 
     this.state = { 
      currentPage: 0, 
      currentVideoId: null 
     }; 
    } 
    componentWillReceiveProps() { 
     this.setState({ currentVideoId: null }); 
    } 

    render() { 
     const data = this.props.data; 
     // ... 
     return (
      <div> 
       { data.map((obj, key) => { 
        return (
         <div key={key}> 
          <img src={obj.thumbnails.medium} className="youtube-result-thumbnail" /> 
          <h3 className="youtube-result-title">{obj.title}</h3> 
          <div className="youtube-result-duration"> 
           <span>{obj.contentDetails.duration.toSeconds().parseDuration()}</span> 
          </div> 
         </div> 
        ); 
       })} 

      </div> 
     ); 
    } 
    // ... 
} 
Verwandte Themen