2016-04-05 5 views
11

Umschalten einiger Code in Meteor 1.3 zu ES6 + React Syntax. Für die Komponente müssen Meteor-Daten abgerufen werden. Daher verwende ich createComponent, um getMeteorData() zu ersetzen. Das Problem ist, dass der alte getMeteorData-Status aus der Komponente stammt, auf die die createContainer-Komponente nicht zugreift.Wie wird mit Meteor Data verfahren, die einen Status von einer untergeordneten Komponente erfordert?

Alter Code:

Component = React.createClass({ 
    mixins: [ReactMeteorData], 
    getMeteorData() { 
    var mo = this.state.currentMonth; 
    var start = newDate(moment(mo).startOf('month')); 
    return { 
    events:  collections.events.find({ 
     $or:  qwry, 
     startDate: { $gte: start }, 
     endDate: { $lte: end } 
     }).fetch(), 
    } 
    }, 
    render() { 
    ... 
    } 
}); 

Neuer Code So Far

class Component = React.Component { 
constructor(props) { 
    super(props); 
} 
render() { 
    ... 
} 
} 

export default createContainer(({params}) => { 
var mo = this.state.currentMonth; 
     var start = newDate(moment(mo).startOf('month')); 
     return { 
     events:  collections.events.find({ 
      $or:  qwry, 
      startDate: { $gte: start }, 
      endDate: { $lte: end } 
      }).fetch(), 
     } 
}, Component); 

gibt es die Fehlermeldung "kann nicht currentMonth undefinierten bekommen", da es versucht, Zustand zugreifen. Irgendwelche Vorschläge?

+0

Versuchen Sie es nicht von Kind zu Eltern zu schicken, sollte es anders sein, um, Eltern, die den Zustand der Kinder halten und übergeben sie als Requisiten auf ... reagiert docs auf mehreren Komponenten: In React , Daten fließt vom Eigentümer zu Besitz-Komponente durch Requisiten: https://facebook.github.io/react/docs/multiple-components.html – JordanHendrix

+0

Ja, das ist mir klar, aber ich versuche herauszufinden, die beste Art zu konvertieren zu dem neuen Format, basierend auf der Art, wie es zuvor gehandhabt wurde. Ich versuche nur herauszufinden, ob ich die Art und Weise, wie wir die Variable "mo" im aktuellen Code bekommen, komplett überarbeiten muss oder ob es eine Art Workaround für Komponenten gibt, die zuvor den Status der Komponente in getMeteorData verwendet haben. – ebrillhart

+0

Warum können Sie nicht einfach die Funktion getMeteorData in die react.Component einfügen? das ist in Ordnung – JordanHendrix

Antwort

21

Sie können die alte Komponente in zwei Teilkomponenten aufteilen: eine, die den Status enthält und Ereignisse behandelt, und eine reine, die nur Ergebnisse anzeigt. Stellen Sie sicher, dass Ereignishandler als Rückrufe an die untergeordnete Komponente übergeben werden. Beachten Sie auch, wie die übergeordnete Komponente den Rückgabewert der createContainer()-Funktion verwendet.

// Parent component, setState should go here 
export default class StateHolder extends React.Component { 
    constructor(params) { 
    super(params); 
    this.state = {myKey: 1}; 
    } 

    incrementKey() { 
    this.setState({myKey: this.state.myKey + 1}); 
    } 

    render() { 
    return <Container myKey={this.state.myKey} onClick={this.incrementKey.bind(this)} />; 
    } 
} 

// Child component, renders only 
class PureComponent extends React.Component { 
    render() { 
    return <div> 
     {this.props.myValue} 
     <button onClick={this.props.onClick}>click me</button> 
    </div>; 
    } 
} 

// Decorated child container. 
// Make sure to use this one in parent component's render() function! 
let Container = createContainer((props) => { 
    let doc = MyCollection.findOne({someKey: props.myKey}); 
    return { 
    myValue: doc ? doc.someValue : null 
    } 
}, PureComponent); 
+0

danke! das wird den Trick machen. – ebrillhart

+0

@aedm GROSSES DANKE! – DonFabiolas

Verwandte Themen