2016-12-01 2 views
1

ich ein Geschäft erstellt haben mobx wie folgt:mobx: array.map() ist keine Funktion

import {extendObservable} from 'mobx'; 

class InfluencerFeedStore { 
    constructor() { 
     extendObservable(this, { 
      data: [] 
     }); 
    } 

    setData(items = []) { 
     this.data = items; 
    } 
} 

export default new InfluencerFeedStore(); 

Und ich beobachte dann diesen Speicher in meinem React Ansicht:

import React from 'react'; 
import {observer} from 'mobx-react'; 
import FeedItem from './FeedItem'; 
import InfluencerFeedStore from '../../core/stores/InfluencerFeed'; 

import './style.css'; 

const generateItems =() => { 
    return InfluencerFeedStore.data.map((item, i) => (
     <FeedItem key={`feeditem-${i}`} {...item} /> 
    )); 
}; 

const Feed =() => (
    <div className="Feed vertical-scroll-flex-child"> 
     {generateItems()} 
    </div> 
); 

export default observer(Feed); 

On Erstes Rendern, meine Feed Ansicht funktioniert einwandfrei (obwohl es keine Elemente im Array gibt).

Wenn ich später Teile der Ladung durch InfluencerFeedStore.setData() Aufruf korrekt versuchen reagieren wird wieder machen die Feed Ansicht (weil es die mobx beobachtbaren aktualisiert bemerkt) ... aber ich habe einen Fehler, dass InfluencerFeedStore.data.map is not a function beschweren.

Aus der Lektüre durch den mobx docs, entnehme ich, dass die Neuzuweisung meine data Eigenschaft problematisch ist, weil es ein Array (während andere Datentypen wie Strings „einfach funktionieren“) ist. Kann mir jemand sagen, was ich hier falsch mache?

+0

Völlig für meine eigenen Erbauung, Sie scheinen, dass die Daten val in einer statischen Weise zugreifen, nicht von einer Instanz der Klasse (Daten werden im Konstruktor initialisiert). Ist das in Ordnung? ObservableFeed würde eine Instanz darstellen. –

+0

In der Tat, Konstruktor wird nie aufgerufen, also wird dies nicht funktionieren. Store sollte zuerst instanziiert werden – mweststrate

Antwort

2

So stellt sich heraus, dass ich zwei Probleme hatte:

  1. Ich brauchte die replace() Methode werden mit Hilfe der observable array zu überschreiben, anstatt zu versuchen, die Produktion eines neuen Wert
  2. ich nicht wirklich war neu zuweisen Übergeben eines Arrays in meine setData() Methode; deshalb habe ich auf den „Karte ist keine Funktion“ Fehler

Es sollte wie folgt aussehen:

import {extendObservable} from 'mobx'; 

class InfluencerFeedStore { 
    constructor() { 
     extendObservable(this, { 
      data: [] 
     }); 
    } 

    setData(items = []) { 
     this.data.replace(items); 
    } 
} 

export default new InfluencerFeedStore(); 
0

Problem ist (ich glaube, basierend auf meinem Kommentar) Sie nicht "Daten" von einer Instanz der Klasse zugreifen, Sie greifen statisch auf, so dass der Konstruktor der Klasse nie ausgeführt wird, und "Daten" nie initialisiert. "ObservableFeed" ist eine Instanz.

+0

Ich glaube nicht, dass das richtig ist. In meiner Speicherdatei exportiere ich nur "ObservableFeed exportieren". Wenn ich "InfluencerFeedStore" importiere, referenziert es also das gleiche Instanzobjekt (es wird nur umbenannt). Es sei denn, ich missverstehe ES2015 komplett (was möglich ist!) – arthurakay

+0

Hmm ... aber willst du nicht das exportierte Mitglied importieren (was wäre eine Instanz)? Mein Verständnis von ES6-Modulen ist ein bisschen wackelig, da die Builder, die ich verwende, sie nicht unterstützen. Aber von dem, was Sie sagen, können Sie eine Sache exportieren (ObervableFeed), eine andere importieren (InfluencerFeedStore), und dadurch das Verhalten von ObervableFeed implizit bekommen? –

+0

Ich fand dies, was scheint zu gelieren: "Es kann nur einen Standard-Export. Dies wird vor allem verwendet, wenn Sie eine einzelne Sache, wie eine Klasse oder eine einzige Funktion exportieren, die Sie voraussichtlich ohne zusätzliche verwendet werden Wenn Sie ein Modul mit einem Standardexport importieren, verwenden Sie import d from c. " Würde das bedeuten, ObservableFeed aus './etc/InfluencerFeed' importieren? –