2017-04-10 19 views
5

İlk React/Redux projem üzerinde çalışıyorum. Her şey iyi gidiyordu ve sonra yeni bir redüktör yaratmaya çalıştım. Oldukça basit bir şey olduğunu düşündüm, ancak sayfayı yüklediğimde bir hata alıyorum "Reducer X başlatma sırasında undefined döndü." Iz, bunun birleştirmeReducers() içinde olduğunu söylüyor. Birkaç benzer soru buldum ama sorunu çözmediler. Bu sorundaReaktivite/Redux redüktör, başlatma sırasında tanımsız olarak döndü

: Why do I get “Reducer [...] returned undefined during initialization” despite providing initialState to createStore()?

sorunu onlar yapmıyorum CreateStore(), içinde initialState kullandıklarını olmasıydı. Bu sorunda

: Why does my Redux reducer think my state is undefined?

sorun ben redüktör, bir eksik varsayılan dönüş değeri oldu.

Redüktör kodum aşağıda verilmiştir. Başlangıçta bir console.log() var ve hiç çağrılmıyor.

düşürücüler/

import { SORT_CAMPERS } from '../actions/index'; 

export default function(state = null, action) { 
    console.log("action is", action); 
    switch(action.which) { 
     case 'recent': 
     case 'alltime': 
      return action.which; 
      break; 
     default: 
      return state; 
    } 

    return state; 
} 

düşürücüler/index.js

import { combineReducers } from 'redux'; 
import Campers from './reducer_camper_list'; 
import ActiveSorter from './reducer_which_sorter'; 

const rootReducer = combineReducers({ 
    campers: Campers, 
    activeSorter: ActiveSorter 
}); 

export default rootReducer; 

Her şey iyi derler reducer_which_sorter.js. Webpack'den hata yok. Dosya yollarımda iki, üç ve dört kez kontrol ettim. Ben herhangi bir yazım hatası göremiyorum. Burada kaybolan bir şey gören var mı?

+0

Hata veren ve sayfayı yenileyen bir satırda kesme noktası koyun. Sonra hata ayıklayıcısını kırdığında - neler olduğuna dair tüm ayrıntılara sahip olursunuz. – zerkms

cevap

2

Örneğinizde yaptığınız gibi, Redux gereksinimi, which numaralı eylemlerde değil, type özelliğini kullanmaktır. Console.log denetimi çağrılmadığından, sorun diğer redüktörünüzde olabilir (sorunuzda gösterilmemiştir.)

Bunun önemli olmasının nedeni, combineReducers'un redüktör işlevlerinizi özel bir INIT eylem türüyle çağırmasıdır:

const initialState = reducer(undefined, { type: ActionTypes.INIT }) 

Kaynak: https://github.com/reactjs/redux/blob/master/src/combineReducers.js

İşleviniz, bunun yerine 'action.type' arasında 'action.which' açılır beri, tanımlanmamış dışında bir şey dönmek için başarısız olur.

+0

Mantığımı değiştirdim, bu yüzden bu kod diğer redüktörümdeydi, çünkü bu sadece bir satırdı. Her şey şimdi çalışıyor. Bence bu konuda anahtar hakkın var. – RaneWrites

1

Başta bir console.log() var ve hiç çağrılmıyor.

Bu gariptir çünkü redüktör işlevi en az bir kez @@INIT eylemi ile çağrılmalıdır.

rootReducer ürününüzün denenip test edilmediğini test etmeye çalışın. bunu değiştirin: o çağrıldığını değilse

const rootReducer = (state = {}, action) => { 
    console.log('Test if rootReducer is ever called') 

    return { 
    campers: Campers(state.campers, action), 
    activeSorter: ActiveSorter(state.activeSorter, action) 
    } 
} 

, o zaman sorun değil redüktör kendisinde yere yüksektir.

İlgili konular