2016-04-05 8 views
11

Passaggio di un po 'di codice in Meteor 1.3 a ES6 + Sintassi di reazione. Il componente richiede l'acquisizione di dati Meteor, quindi sto utilizzando un componente create per sostituire getMeteorData(). Il problema è che il vecchio stato getMeteorData utilizzato dal componente, a cui non si accede dal componente createContainer.Come gestire Meteor Data che richiede lo stato dal componente figlio?

vecchio codice:

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() { 
    ... 
    } 
}); 

Nuovo Codice finora

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); 

ottenere l'errore "non può ottenere currentMonth di indefinito," dal momento che sta cercando di accedere a Stato. Eventuali suggerimenti?

+0

cercare di non inviare da bambino a genitore, dovrebbe essere il contrario, madre detiene lo stato dei bambini e lo passa verso il basso come oggetti di scena ... reagiscono documenti su più componenti: In React , i flussi di dati dal proprietario al componente di proprietà attraverso gli oggetti di scena: https://facebook.github.io/react/docs/multiple-components.html – JordanHendrix

+0

sì, me ne rendo conto, ma sto cercando di capire il modo migliore per convertire fino al nuovo formato basato sul modo in cui veniva gestito in precedenza. Sto solo cercando di capire se ho bisogno di rielaborare completamente il modo in cui stiamo ottenendo la variabile "mo" nel codice corrente o se c'è una sorta di soluzione per i componenti che in precedenza utilizzavano lo stato del componente in getMeteorData. – ebrillhart

+0

perché non puoi semplicemente inserire la funzione getMeteorData all'interno del react.Component? va bene per fare – JordanHendrix

risposta

21

È possibile dividere il componente precedente in due componenti parziali: uno che contiene lo stato e gestisce gli eventi e uno puro che visualizza solo i risultati. Assicurati di passare i gestori di eventi come richiami al componente figlio. Notare inoltre come il componente principale utilizza il valore restituito della funzione createContainer().

// 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

grazie! questo farà il trucco. – ebrillhart

+0

@aedm GRANDI GRAZIE! – DonFabiolas

Problemi correlati