J'utilise AsyncStorage pour essayer de conserver mon état redux dans mon application React, mais j'obtiens cette erreur : TypeError : undefined n'est pas une fonction (près de '...state.reduce. ..')
. J'ai regardé d'autres réponses avec des erreurs similaires mais sans succès. Je ne sais même pas lequel n'est pas défini puisqu'il dit simplement "près".我已经检查了state对象,它不是空的。 Le message suivant : 应用程序.js:
importer Main depuis "./src/components/Main" importer { NativeRouter } depuis "react-router-native" importer { createStore } depuis "redux" importer { Fournisseur } depuis "react-redux" importer un réducteur depuis "./src/reducer" importer AsyncStorage depuis "@react-native-async-storage/async-storage" import { persistStore, persistReducer } depuis "redux-persist" importer { PersistGate } depuis "redux-persist/integration/react" importer du texte depuis "./src/components/Text" const persistConfig = { clé : "racine", stockage : AsyncStorage, } const persistedReducer = persistReducer (persistConfig, réducteur) const store = createStore (persistedReducer) const persistor = persistStore (magasin) exporter la fonction par défaut App() { retour () } Chargement...} persistor={persistor}> 这是réducteur的代码 : 减速器.js:
const réducteur = (state = [], action) => { commutateur (action.type) { cas "NEW_NOTE" : { console.log("état :>> ", état) const max = state.reduce( (précédent, actuel) => { // si (!current) retourne précédent retourner current.id > identifiant précédent ? actuel : précédent }, { identifiant : 0, corps : "" } ) const newNote = { id : max.id + 1, corps : "" } retourner state.concat (newNote) } cas "UPDATE_NOTE" : { const newNotes = state.filter((note) => action.data.id !== note.id) renvoyer [action.data, ...newNotes] } cas "DELETE_NOTE" : { return state.filter((note) => action.id !== note.id) } défaut: { état de retour } } } exporter le réducteur par défaut编辑
有任何关于为什么会发生这种情况的想法吗?
使用普通reducer的state对象:
[{"body" : "Ddtstostksoyoyyxcuj", "id" : 2}, {"body" : "Ftistldpufipf Hhxgjbv", "id": 1}]≪/pre>使用持久化reducer的state对象:
{"0" : {"body": "ma première note", "id" : 1}, "1" : { "corps" : "ma deuxième note", "identifiant" : 2}, "2" : {"corps" : "ma troisième note", "identifiant" : 3}};修复
减速器.js
const réducteur = (state = [], action) => { état = Objet.valeurs (état) ...选择器:
const notes = useSelector((state) => Object.values(state).slice(0, -1))
{"0": {"body": "嗨", "id": 7}, "1": {"body": "", "id": 8}, "2": {" body" :“”,“id”:9},“_persist”:{“重新水合”:true,“版本”:-1}}
Pourquoi une TypeError se produit-elle ?
Vous avez cette erreur
TypeError: undefined is not a function (near '...state.reduce...')
,因为state
Ce n'est pas un tableau, c'est un objetL'objet n'a pas de
reduce
méthodesPourquoi
react-persist
convertir votre tableau en objet ?Dans le
react-persist
源代码的这一行中,你可以看到let { _persist, ...rest } = state || {}
code sourcecette ligne a>, vous pouvez voirlet { _persist, ...rest } = state || Déplier un tableau comme celui-ci entraîne sa conversion en objet.
Est-ce un bug ?
Probablement oui, je ne trouve aucune information dans la documentation indiquant que l'état doit être un objet.
Comment y remédier ?
Soit enveloppez votre état dans un objet au lieu d'utiliser directement un tableau
Ou reconvertissez l'objet en tableau à chaque fois que vous l'utilisez