2016-04-05 9 views
11

Przełączanie niektórych kodów w Meteor 1.3 na ES6 + Składnia odpowiedzi. Komponent wymaga uzyskania danych Meteor, więc używam createComponent do zamiany getMeteorData(). Problem polega na tym, że stary getMeteorData używał stanu z komponentu, do którego nie ma dostępu komponent createContainer.Jak obsługiwać dane meteorytów, które wymagają stanu z komponentu potomnego?

Stary kod:

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

Nowy Kodeks dotąd

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

Uzyskiwanie błąd "nie można uzyskać currentMonth undefined", ponieważ próbuje uzyskać dostęp do stanu. Jakieś sugestie?

+0

nie próbować wysłać ją od dziecka do rodzica, powinno być na odwrót, dominująca posiada stan dzieci i przekazuje go jako rekwizyty ... reagują dokumenty na wielu komponentów: W React , dane przepływają od właściciela do posiadanego komponentu przez rekwizyty: https://facebook.github.io/react/docs/multiple-components.html – JordanHendrix

+0

tak, zdaję sobie z tego sprawę, ale staram się wymyślić najlepszy sposób na konwersję do nowego formatu w oparciu o sposób, w jaki był wcześniej obsługiwany. Po prostu próbuję dowiedzieć się, czy muszę całkowicie przerobić sposób, w jaki otrzymujemy zmienną "mo" w bieżącym kodzie, lub jeśli istnieje jakiś rodzaj obejścia dla komponentów, które wcześniej używały stanu komponentu w getMeteorData. – ebrillhart

+0

dlaczego nie możesz po prostu umieścić funkcji getMeteorData wewnątrz elementu react.Component? to dobrze, że robię – JordanHendrix

Odpowiedz

21

Stary komponent można podzielić na dwa komponenty: jeden, który przechowuje stan i obsługuje zdarzenia, i czysty, który wyświetla tylko wyniki. Należy przekazać funkcje obsługi zdarzeń jako zwrotne do komponentu potomnego. Zwróć też uwagę, jak komponent macierzysty używa wartości zwracanej funkcji 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

dzięki! to wystarczy. – ebrillhart

+0

@aedm WIELKIE DZIĘKUJEMY! – DonFabiolas