2016-09-01 1 views
0

Dieser Meteor-Code zeigt die Daten aus der Mongo-Sammlung CarsCol im Browser nicht an.
Was mache ich falsch?Meteor Export-Sammlung zu React-Komponente

Dank
// /imports/api/collections.js 
export const CarsCol = new Mongo.Collection('carsCol'); 


// /imports/ui/myList.jsx 
import React from 'react'; 

export const ListItems = ({listItems}) => { //<---- {listItems} undefined 
    if (listItems && listItems.length > 0) { 
    return (
     <ol> 
     {listItems.map((item) => (
      <li key={item._id}>{item.car}</li> 
     ))} 
     </ol> 
    ); 
    } else { 
    return (
     <p>No cars yet!</p> //<------------ shows in browser 
    ); 
    } 
}; 


// /client/cars.js 
import React from 'react'; 
import ReactDOM from 'react-dom'; 
import { composeWithTracker } from 'react-komposer'; 
import { ListItems } from '../imports/ui/myList.jsx'; 
import { CarsCol } from '../imports/api/collections.js'; 

const composer = (props, onData) => { 
    const sub = Meteor.subscribe('carsCol'); 
    if (sub.ready()) { 
    const cars = CarsCol.find().fetch(); 
    onData(null, {cars}); 
    } 
}; 

const Container = composeWithTracker(composer) (ListItems); 
ReactDOM.render(<Container />, document.getElementById('react-root')); 

enter image description here

Antwort

0

Sehr bekanntes Problem. Versuchen Bezug auf Sammlung zu übergeben statt abgerufenen Daten über Requisiten auf die Komponente, wie folgt aus:

// /imports/api/collections.js 
export const CarsCol = new Mongo.Collection('carsCol'); 


// /imports/ui/myList.jsx 
import React from 'react'; 

export const ListItems = ({cars}) => { 
    const listItems = cars.find().fetch(); // <- fetching data from a collection received as a prop right here 

    if (listItems && listItems.length > 0) { 
    return (
     <ol> 
     {listItems.map((item) => (
      <li key={item._id}>{item.car}</li> 
     ))} 
     </ol> 
    ); 
    } else { 
    return (
     <p>No cars yet!</p> //<------------ shows in browser 
    ); 
    } 
}; 


// /client/cars.js 
import React from 'react'; 
import ReactDOM from 'react-dom'; 
import { composeWithTracker } from 'react-komposer'; 
import { ListItems } from '../imports/ui/myList.jsx'; 
import { CarsCol } from '../imports/api/collections.js'; 

const composer = (props, onData) => { 
    const sub = Meteor.subscribe('carsCol'); 
    if (sub.ready()) { 
    onData(null, { 
     cars: CarsCol // <- now the "cars" prop is the collection 
    }); 
    } 
}; 

const Container = composeWithTracker(composer) (ListItems); 
ReactDOM.render(<Container />, document.getElementById('react-root')); 

Ich glaube, dass sollte funktionieren, obwohl ich starke Gefühl zu haben bin, dass Sie nicht zu 100% des Codes nicht geteilt beteiligt. Aber hoffentlich ist die Idee klar: wenn das Abonnement bereit ist, übergeben Sie die Sammlung selbst, nicht die Daten, die von ihr abgerufen werden, über Requisiten und führen dann das Holen innerhalb der Komponente selbst durch. Auf diese Weise erhalten Sie auch die Reaktivität, z. Wenn die Sammlung aktualisiert wird, wird die Komponente aktualisiert (gerendert).

+0

Ich habe alle Datensätze aus der Sammlung entfernt, aber der Browser wurde nicht aktualisiert und zeigt nichts an. Warum funktioniert die Reaktivität in diesem Fall nicht? –

+0

Das ist eine gute Frage, ich habe noch nie gesehen, dass es nicht so funktioniert, wie Sie es beschreiben. Ich denke, mit [Tracker-Komponente] (https://github.com/studiointeract/tracker-component) würde das Problem lösen, obwohl es erhebliche Änderungen im Code erfordern würde. –

+0

Ich habe gelernt, dass die Reactive Compose Reaktivität innerhalb des Containers getan wird, also innerhalb der Funktion 'compose', wie kann sie auf Änderungen an der Mongo Collection reagieren, wird das Collection Fetching in die ui Komponente verschoben, wie in der angenommenen Antwort vorgeschlagen ? [https://voice.kadira.io/using-meteor-data-and-react-with-meteor-1-3-13cb0935dedb#.bz29237uj] –