2017-04-10 12 views
5

मैं अपनी पहली प्रतिक्रिया/रेडक्स प्रोजेक्ट पर काम कर रहा हूं। सब ठीक हो रहा था, और फिर मैंने एक नया reducer बनाने की कोशिश की। मैंने सोचा कि यह एक बहुत ही सरल था, लेकिन जब मैं पेज लोड करता हूं तो मुझे एक त्रुटि मिलती है "प्रारंभकर्ता के दौरान रेड्यूसर एक्स अपरिभाषित हो जाता है।" ट्रेस का कहना है कि यह गठबंधन में किया जा रहा है रेड्यूसर()। मुझे कुछ समान प्रश्न मिले, लेकिन उन्होंने इस मुद्दे को हल नहीं किया।प्रतिक्रिया/रेडक्स रेड्यूसर प्रारंभिक के दौरान अपरिभाषित लौटा

इस सवाल पर: Why do I get “Reducer [...] returned undefined during initialization” despite providing initialState to createStore()?

मुद्दा यह है कि वे CreateStore(), जो मैं नहीं कर रहा हूँ में initialState का उपयोग कर रहे थे।

इस सवाल पर: Why does my Redux reducer think my state is undefined?

समस्या कम करने, जो मेरे पास है में एक लापता डिफ़ॉल्ट वापसी मान था।

मेरा reducer कोड नीचे है। मेरे पास शुरुआत में एक console.log() है और इसे बिल्कुल नहीं कहा जा रहा है।

reducers/

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; 
} 

reducers/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; 

सब कुछ ठीक संकलित reducer_which_sorter.js। वेबपैक से कोई त्रुटि नहीं। मेरे पास डबल, ट्रिपल और क्वाड्रूपल ने मेरे फ़ाइल पथों की जांच की है। मुझे कोई टाइपो नहीं दिख रहा है। क्या कोई ऐसा कुछ देख सकता है जिसे मैं याद कर रहा हूं?

+0

एक पंक्ति पर एक ब्रेकपॉइंट रखें जो एक त्रुटि फेंकता है और पृष्ठ को ताज़ा करता है। फिर जब यह डीबगर में टूट जाता है - आपके पास क्या हुआ इसके बारे में पूरा विवरण है। – zerkms

उत्तर

2

एक रेडक्स आवश्यकता type क्रियाओं पर संपत्ति का उपयोग करना है, which, जैसा कि आपने अपने उदाहरण में किया है। चूंकि आपका console.log चेक नहीं कहा जाता है, समस्या आपके अन्य रेड्यूसर में हो सकती है (आपके प्रश्न में नहीं दिखाया गया है।)

कारण यह है कि combineReducers आपके रेड्यूसर कार्यों को एक विशेष आईएनआईटी एक्शन प्रकार के साथ कॉल कर रहा है:

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

स्रोत: https://github.com/reactjs/redux/blob/master/src/combineReducers.js

आपका समारोह है, क्योंकि यह 'action.type' के स्थान पर 'action.which' पर स्विच, अपरिभाषित के अलावा कुछ वापस जाने के लिए विफल रहता है।

+0

मैंने अपना तर्क बदल दिया है, इसलिए यह कोड मेरे अन्य reducer में है क्योंकि यह वास्तव में केवल एक पंक्ति थी। यह सब अब काम करता है। मुझे लगता है कि आप स्विच होने के बारे में सही हैं। – RaneWrites

1

मेरे पास शुरुआत में एक console.log() है और इसे बिल्कुल भी नहीं कहा जा रहा है।

यह अजीब बात है, क्योंकि रेड्यूसर फ़ंक्शन को कम से कम एक बार @@INIT क्रिया के साथ बुलाया जाना चाहिए था।

यह जांचने का प्रयास करें कि आपका rootReducer बिल्कुल कॉल किया गया है या नहीं। इसे बदलें:

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

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

यदि इसे नहीं कहा जा रहा है, तो समस्या कहीं अधिक है, न कि reducer में।

संबंधित मुद्दे