2017-09-27 4 views
1

Meine React-Komponente verfügt über eine Requisite, die eine Klasseninstanz basierend auf Daten aus dem Redux-Speicher ist.React-Klasseninstanzreproduktion verhindert die Verwendung von PureComponent

Der Grund dafür ist, dass es viel bequemer ist, mit diesen Daten mit einer Klasse und all ihren benutzerdefinierten Methoden (mehr als 50) umzugehen.

Ich kann nicht PureComponent als React verwenden immer berücksichtigen, dass diese Stütze geändert hat. Das Problem ist, dass die meisten meiner React-Komponenten mit diesem prop verbunden sind ...

Ich bin bewusst, Lösung wie erneut auswählen, aber dies würde bedeuten, zu viele (so viele wie meine Klasse hat benutzerdefinierte Methoden) Selektoren nur für die Manipulation dieser Daten.

Was würden Sie vorschlagen?

Mein redux wählen sieht wie folgt aus:

getStation(state) { 
    // some logic to fetch the right station 
    return new WeatherStation(state.services.stationList[i]) 
} 

wo Weather ist:

class WeatherStation { 
    constructor (data) { 
    this.station = data 
    } 

    getId() {...} 
    // many more methods 
} 

und in meinen React Compoonent:

class MyComponent extends React.Component { 
    ... 
    const mapStateToProps = (state, ownProps) => { 
    return { 
     station: getStation(state), 
    } 
    } 
} 
+2

Können Sie relevante Teile Ihres Codes? –

+0

Haben Sie ImmutableJS ausprobiert? – hawk

+0

Würde auch gerne den Code sehen. Vor allem, wenn Sie Ihre Klasseninstanz erstellen. – jonahe

Antwort

0

Haben Sie reselect entlang dieser Linien versucht, mit ?

import { createSelector } from 'reselect'; 

getStationData(state) { 
    // some logic to fetch the right station 

    // no new instances here, just selecting the relevant data 
    return state.services.stationList[i]; 
} 


// create "memoized" selector. 
const getEnhancedStation = createSelector(
    getStationData, 
    stationData => new WeatherStation(stationData) 
) 

Wenn ich reselect und createSelector richtig verstehen, dann sollte dies eine neue Instanz erzeugen Weather nur, wenn die zugrunde liegenden Daten, dh. das Ding von getStationData zurückgegeben hat sich geändert. (Anstatt eine neue Instanz jedes Mal zu erzeugen irgendetwas im Zustand ändert.)

+1

Vielen Dank @jonahe, es funktioniert wie ein Charme. Dies wird mir helfen, viel unnötigen Code aus den Methoden von sollteComponentUpdate meiner Komponenten zu entfernen –

+0

Kein Problem :) Schön zu hören, es hat funktioniert! – jonahe

Verwandte Themen