IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

React Discussion :

Bonne utilisation hook : useSelector()


Sujet :

React

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 34
    Par défaut Bonne utilisation hook : useSelector()
    Hello la commu,


    je mets doucement les mains dans le code qu'un ami à fait dans l'idée d'ajouter de nouvelle fonctionnalité à notre appli.
    1ère découverte de réact, donc excusez d'avance mes questions

    on utilise un reducer :
    dans un fichier credentials.js :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    export const INITIAL_CREDENTIALS = {
      configReload: false,
      dataReload: false,
      dataReloadAuto: false,
      imgSetup: false,
      imgSetupAdd: false,
      imgSetupRemove: false,
      // ... et bien d'autres ... 
    }
     
    const creditentialsReducer = (state = INITIAL_CREDENTIALS, action) => {
      switch (action.type) {
        case 'SET_CREDENTIALS': {
          return {
            ...state,
            ...action.value,
          };
        }
        default:
          return state;
      }
    };
     
    export default creditentialsReducer;
    qui est mis à jour sur le store par un event en particulier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    store.dispatch({ type: 'SET_CREDENTIALS', value: appProfil });
    jusque là tout va bien


    Je souhaite ensuite utiliser ces infos pour afficher ou non certains éléments à l'écran.
    Ce qui est actuellement fait :
    screens/preferences.js
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    return (
        <ScrollView style={{ backgroundColor: 'transparent' }}>
          <View style={[styles.card, { backgroundColor: theme.colors.bgColor, borderRadius: theme.roundness }]}>
            {prefDataCred &&
              <List.Item
                title={t("Gestion des données")}
                left={() => <List.Icon icon="database-settings" color={theme.colors.primary} />}
                right={() => <List.Icon icon="chevron-right" color={theme.colors.text} />}
                onPress={() => { props.navigation.navigate('PrefDataManager'); }}
              />
            }
          </View>
        </ScrollView>
    );
    `prefDataCred` est aujourd'hui défini de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
      const credConfigReload = useSelector(state => state.creditentialsReducer.configReload);
      const credDataReload = useSelector(state => state.creditentialsReducer.dataReload);
      const credDataReloadAuto = useSelector(state => state.creditentialsReducer.dataReloadAuto);
      const credImgSetup = useSelector(state => state.creditentialsReducer.imgSetup);
      const credClearCache = useSelector(state => state.creditentialsReducer.clearCache);
      const credSystemSetup = useSelector(state => state.creditentialsReducer.systemSetup);
     
      const prefDataCred = (
        credConfigReload ||
        credDataReload ||
        credDataReloadAuto ||
        credImgSetup ||
        credClearCache ||
        credSystemSetup
      );
    15 lignes de code pour défini un élément, ca fait beaucoup, et c'est pas très lisible !
    d'autant plus que ça n'est pas le seul éléments, j'ai plusieurs dizaines d'éléments que je veux contrôler en fonction de différents droits dispo dans `creditentialsReducer`, du coup ça fait des lignes et des lignes de déclarations "pour rien", je trouve pas ça ultra propre et aimerait trouver une meilleure façon de factoriser tout ça.

    j'avais en tête de l'utiliser plutôt de cette façon : (l'objectif est bien de savoir si au moins un de ces éléments est à 'true')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const prefDataCred = (
        getCredentials('configReload', 'dataReload', 'dataReloadAuto', 'imgSetup', 'clearCache', 'systemSetup')
      );

    avec la fonction `getCredentials` définis dans un fichier helper comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    export const getCredentials = (...creds) => {
        var crendential = false;
        creds.forEach(function (item) {
            crendential = crendential || useSelector(state => state.creditentialsReducer[item]);
        });
     
        return crendential;
    }

    sauf que là mon pote me dit : "oulalalala malheureux ! c'est interdit de faire ça. t'essaies d'appeler un hook (useSelector) de façon conditionnelle, c'est interdit..."

    un avis ?
    est ce que ma proposition est si déconante que ca ?
    une autre proposition de votre côté ?

    merci pour votre aide

  2. #2
    Membre Expert
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Par défaut
    hello,

    En effet, appeler de façon conditionnelle un hook peut amener des bugs difficiles à comprendre.
    Peut être tu devrais faire un peu différemment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    export const getCredentials = (...creds) => {
        const mapped = creds.map((item) => useSelector(state => state.creditentialsReducer[item]));
     
        return mapped.some((granted) => granted);
    }
    Les différences avec ton code de base:
    • pour chaque argument passé à getCredentials, on a bien un appel à useSelector
    • on passe par map ce qui évite d'avoir à modifier dans l'itérateur une variable définie dans un scope plus haut
    • en utilisant mapped.some, on reproduit le || que tu avais dans ton code

Discussions similaires

  1. de la bonne utilisation de const
    Par gangsoleil dans le forum C
    Réponses: 2
    Dernier message: 14/09/2005, 15h44
  2. [Singleton] En faire une bonne utilisation
    Par Koubi dans le forum Langage
    Réponses: 6
    Dernier message: 01/09/2005, 17h52
  3. [C#] La bonne utilisation des WinForms (ouverture-Fermeture)
    Par Harry dans le forum Windows Forms
    Réponses: 28
    Dernier message: 03/08/2005, 11h39
  4. La bonne utilisation de TIBTransaction
    Par jibe74 dans le forum Connexion aux bases de données
    Réponses: 15
    Dernier message: 29/01/2005, 16h18
  5. [Tomcat][sleep]De la bonne utilisation du sleep??
    Par Titom dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 11/01/2005, 10h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo