169 votes

Comment ajouter un élément au tableau dans le réducteur de React native redux ?

Comment ajouter des éléments dans mon tableau arr[] de l'état redux dans le reducer ? Je fais ceci

import {ADD_ITEM} from '../Actions/UserActions'
const initialUserState = {
    arr:[]
}

export default function userState(state = initialUserState, action)
{
    console.log(arr);
    switch (action.type)
    {
        case ADD_ITEM: 
            return { 
                      ...state,
                      arr: state.arr.push([action.newItem])
                   }

        default:
            return state
    }
}

425voto

free-soul Points 7949

Deux options différentes pour ajouter un élément à un tableau sans mutation

case ADD_ITEM :
    return { 
        ...state,
        arr: [...state.arr, action.newItem]
    }

OU

case ADD_ITEM :
    return { 
        ...state,
        arr: state.arr.concat(action.newItem)
    }

2 votes

Lequel doit être considéré comme préférable ?

20 votes

@sapht si vous écrivez du code en ES6 je préfère la première qui est plus lisible et élégante IMO.

5 votes

Aussi, le premier est pur, le second ne l'est pas. Extrait de la documentation de Redux : "Il est très important que le réducteur reste pur. Les choses que vous ne devriez jamais faire à l'intérieur d'un reducer : 1. muter ses arguments ; 2. effectuer des effets secondaires comme des appels API et des transitions de routage ; 3. appeler des fonctions non pures, par exemple Date.now() ou Math.random()."

24voto

martinarroyo Points 5609

push ne retourne pas le tableau, mais la longueur de celui-ci ( docs ), donc ce que vous faites, c'est remplacer le tableau par sa longueur, en perdant la seule référence à celui-ci que vous aviez. Essayez ceci :

import {ADD_ITEM} from '../Actions/UserActions'
const initialUserState = {

    arr:[]
}

export default function userState(state = initialUserState, action){
     console.log(arr);
     switch (action.type){
        case ADD_ITEM :
          return { 
             ...state,
             arr:[...state.arr, action.newItem]
        }

        default:return state
     }
}

1 votes

Quelqu'un peut-il répondre à cette question avec Object.assign pour les changements du tableau à l'intérieur de l'état s'il vous plaît ?

2 votes

Pourquoi avez-vous besoin Object.assign ? Il est utilisé pour les objets, et c'est essentiellement la même chose. Lorsque vous avez arr:[...state.arr, action.newItem] vous pouvez utiliser obj: Object.assign({}, state.obj, action.newItem à condition que obj et newItem sont des objets. Si vous voulez faire ça à l'état entier, vous pouvez juste faire Object.assign({}, state, {arr: [..state.arr, action.newItem]})

1 votes

@martinarroyo, merci, je l'ai fait : var obj = { isLoading: true, data: ['a', 'b', 'c', 'd'] } var newObj = Object.assign({}, obj, { data: [...obj.data, 'e'] }); et ça me donne ça : { isLoading: true, data: [ 'a', 'b', 'c', 'd', 'e' ] } pour newObj, ce qui est suffisant pour ce dont j'ai besoin. Mais je voulais utiliser Object.assign sans l'opérateur d'étalement pour produire le même résultat. Est-ce possible ?

19voto

Joe Privett Points 55

Si vous avez besoin d'insérer dans une position spécifique dans le tableau, vous pouvez le faire :

case ADD_ITEM :
    return { 
        ...state,
        arr: [
            ...state.arr.slice(0, action.pos),
            action.newItem,
            ...state.arr.slice(action.pos),
        ],
    }

2 votes

Je suis tombé ici... bien que cette réponse ne corresponde pas exactement à la question ci-dessus. Néanmoins, c'était exactement ce que je cherchais. Je cherchais un moyen d'insérer un objet à un index spécifique dans un tableau. C'est pourquoi j'ai voté pour cette réponse. Elle a été très utile et m'a fait gagner du temps. Merci !

1voto

phry Points 4685

Puisque cette question reçoit beaucoup d'attention :

Si vous cherchez la réponse à cette question, il y a de fortes chances que vous suivez un tutoriel Redux très obsolète .

La recommandation officielle (depuis 2019) est la suivante utiliser la boîte à outils officielle de Redux pour écrire du code Redux moderne .

Cela permettra, entre autres, d'éliminer les constantes d'action de type chaîne et de générer des créateurs d'action pour vous.

Il emploiera également des méthodes qui vous permettront d'écrire simplement une logique de mutation dans vos Réducteurs créés par createReducer ou createSlice donc il n'est pas nécessaire d'écrire du code immuable dans les réducteurs dans le Redux moderne en premier lieu.

Veuillez suivre le tutoriels officiels sur Redux au lieu de tutoriels de tiers pour obtenir toujours les informations les plus récentes sur les bonnes pratiques de Redux. Il vous montrera également comment utiliser Redux Toolkit dans différents scénarios courants.

0 votes

@coderzzz18 ce serait génial si vous pouviez marquer cette réponse comme étant la réponse puisque celle qui est actuellement marquée est techniquement correcte, mais pourrait orienter les personnes qui la suivent vers un style de Redux que nous ne recommandons plus vraiment d'apprendre/enseigner.

0voto

Vishal Pawar Points 167

Si vous avez besoin d'ajouter des tableaux l'un après l'autre, vous pouvez utiliser

//initial state
const initialState = {
   array: [],
}

...
case ADD_ARRAY :
    return { 
        ...state,
        array: [...state.array, ...action.newArr],
    }
//if array = [1,2,3,4]
//and newArr = [5,6,7]
//then updated array will be -> [1,2,3,4,5,6,7]
...

Cette syntaxe Spread (...) itère les éléments du tableau et les stocke dans le tableau [ ], ce que vous pouvez simplement faire avec " pour boucle " ou avec n'importe quelle boucle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X