2017-09-27 3 views
1

Mon composant React possède un accessoire qui est une instance de classe basée sur des données provenant du magasin redux.Réactualiser l'instance de la classe empêche d'utiliser PureComponent

La raison en est qu'il est beaucoup plus pratique de traiter ces données en utilisant une classe et toutes ses méthodes personnalisées (plus de 50).

Je ne peux pas utiliser PureComponent car React considère toujours que cet accessoire a changé. Le problème est que la plupart de mes composants React sont connectés à ce prop ...

Je suis conscient de la solution comme reselect mais cela signifierait avoir trop de sélecteurs (autant que ma classe a des méthodes personnalisées) seulement pour la manipulation de ces données.

Que suggéreriez-vous?

Mon redux sélectionnez ressemble à ceci:

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

où WeatherStation est:

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

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

et dans mon React Compoonent:

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

Pouvez-vous publier des parties pertinentes de votre code? –

+0

Avez-vous essayé ImmutableJS? – hawk

+0

Aimera aussi voir le code. Surtout quand vous créez votre instance de classe. – jonahe

Répondre

0

Avez-vous essayé d'utiliser reselect le long de ces lignes ?

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

Si je comprends bien reselect et createSelector, cela devrait générer une nouvelle instance de WeatherStation seulement si les données sous-jacentes, à savoir. la chose retournée de getStationData, a changé. (Au lieu de générer une nouvelle instance à chaque fois quoi que ce soit dans les changements d'état.)

+1

Merci beaucoup @jonahe, ça fonctionne comme un charme. Cela m'aidera à enlever beaucoup de code inutile des méthodes de mes composants shouldComponentUpdate –

+0

Pas de problème :) C'est agréable de l'entendre fonctionner! – jonahe