2016-08-31 15 views
28

मेरे पास एक reducer है, और नए राज्य की गणना करने के लिए मुझे कार्रवाई से डेटा की आवश्यकता है और राज्य के एक हिस्से से डेटा भी इस reducer द्वारा प्रबंधित नहीं है। विशेष रूप से, reducer में मैं नीचे दिखाऊंगा, मुझे accountDetails.stateOfResidenceId फ़ील्ड तक पहुंच की आवश्यकता है।Redux reducer के अंदर राज्य का उपयोग कैसे करें?

initialState.js:

export default { 
    accountDetails: { 
     stateOfResidenceId: '', 
     accountType: '', 
     accountNumber: '', 
     product: '' 
    }, 
    forms: { 
     blueprints: [ 

     ] 
    } 
}; 

formsReducer.js:

import * as types from '../constants/actionTypes'; 
import objectAssign from 'object-assign'; 
import initialState from './initialState'; 
import formsHelper from '../utils/FormsHelper'; 
export default function formsReducer(state = initialState.forms, action) { 
    switch (action.type) { 
    case types.UPDATE_PRODUCT: { 
     //I NEED accountDetails.stateOfResidenceId HERE 
     console.log(state); 
     const formBlueprints = formsHelper.getFormsByProductId(action.product.id); 
     return objectAssign({}, state, {blueprints: formBlueprints}); 
    } 

    default: 
     return state; 
    } 
} 

index.js (रूट कम करने):

import { combineReducers } from 'redux'; 
import accountDetails from './accountDetailsReducer'; 
import forms from './formsReducer'; 

const rootReducer = combineReducers({ 
    accountDetails, 
    forms 
}); 

export default rootReducer; 

मैं इस क्षेत्र तक कैसे पहुंच सकता हूं?

+0

[अद्यतन कर रहा है आवेदन की स्थिति के आधार पर राज्य में एक विरोधी है -पटरर्न] (https://stackoverflow.com/questions/35851837/redux-and-within-a-reducer-accessing-a- अलग-reducer-how) – Igorsvee

+5

वह कथन कोई समझ नहीं आता है। रेड्यूसर फ़ंक्शन का पूरा बिंदु यह है कि आप * वर्तमान स्थिति * और कार्रवाई के आधार पर निर्णय लेते हैं। – markerikson

उत्तर

41

मैं इसके लिए thunk का प्रयोग करेंगे, यहाँ एक उदाहरण है:

export function updateProduct(product) { 
    return (dispatch, getState) => { 
    const { accountDetails } = getState(); 

    dispatch({ 
     type: UPDATE_PRODUCT, 
     stateOfResidenceId: accountDetails.stateOfResidenceId, 
     product, 
    }); 
    }; 
} 

मूल रूप से आप सभी डेटा आप कार्रवाई पर की जरूरत हो, तो आप अपने कम करने के लिए कि डेटा भेज सकते हैं।

शुभकामनाएं!

-1

एक क्रिया प्रेषण करते समय, आप एक पैरामीटर पास कर सकते हैं। इस मामले में, आप कार्रवाई के लिए accountDetails.stateOfResidenceId पास कर सकते हैं और फिर उसे पेलोड के रूप में reducer पर भेज सकते हैं।

3

आपके विकल्प या तो combineReducers का उपयोग करने के अलावा, और कार्रवाई में अधिक डेटा शामिल करने के अलावा अधिक तर्क लिखने के लिए हैं। रेडक्स एफएक्यू इस विषय को शामिल करता है: http://redux.js.org/docs/faq/Reducers.html#reducers-share-state

इसके अलावा, मैं वर्तमान में "स्ट्रक्चरिंग रेडुकर्स" के विषय पर रेडक्स डॉक्स में पृष्ठों के एक नए सेट पर काम कर रहा हूं, जिसे आप सहायक पा सकते हैं। वर्तमान डब्ल्यूआईपी पेज https://github.com/markerikson/redux/blob/structuring-reducers-page/docs/recipes/StructuringReducers.md पर हैं।

+0

आपके उत्तर के लिए धन्यवाद। मैंने आपके द्वारा लिंक किए गए कुछ संसाधनों की खोज की है, और ऐसा करना जारी रखेंगे। हालांकि, आपके लिए सवाल, क्योंकि आप जानकार प्रतीत होते हैं। एक और जवाब ने 'थंक' के उपयोग का सुझाव दिया। क्या आपको लगता है कि यह मेरी समस्या का एक अच्छा समाधान होगा? अगर यह मेरे कोड की गड़बड़ी करने जा रहा है या यह सबसे अच्छा अभ्यास नहीं है, तो यह कोई समाधान नहीं है जिसे मैं आगे बढ़ाना चाहता हूं, लेकिन मुझे इन विकल्पों के दीर्घकालिक प्रभावों को निर्धारित करने के लिए पर्याप्त जानकारी नहीं है। – Tylerlee12

+1

यूप, थंक्स साइड इफेक्ट्स प्रबंधित करने और जटिल तर्क निष्पादित करने के लिए मानक बुनियादी दृष्टिकोण हैं जिनमें एकाधिक प्रेषण शामिल हैं और वर्तमान ऐप स्थिति का उपयोग करना शामिल है। वर्तमान ऐप स्थिति को पढ़ने वाले थंक फ़ंक्शन को लिखना पूरी तरह सामान्य है, और सशर्त रूप से प्रेषण जैसी चीजें करता है, कई क्रियाएं भेजता है, या राज्य के अंगों को पकड़ता है और इसमें एक प्रेषित कार्रवाई में शामिल होता है। मेरे पास https://gist.github.com/markerikson/ea4d0a6ce56ee479fe8b356e099f857e पर सामान्य थंक पैटर्न के कुछ उदाहरण हैं। – markerikson

0

मुझे पता चलता है कि आप इसे एक्शन निर्माता में पास करते हैं। तो किसी ऐसे स्थान पर आप एक एक्शन निर्माता है कि कुछ इस तरह करता होगा:

updateProduct(arg1, arg2, stateOfResidenceId) { 
    return { 
    type: UPDATE_PRODUCT, 
    stateOfResidenceId 
    } 
} 

जगह है जहाँ आप कार्यवाही प्रारंभ में, आप प्रतिक्रिया का उपयोग कर रहे मान, आप

function mapStateToProps(state, ownProps) { 
    return { 
    stateOfResidenceId: state.accountdetails.stateOfResidenceId 
    } 
} 

का उपयोग करें और कनेक्ट कर सकते हैं प्रतिक्रिया-रेडक्स के कनेक्ट का उपयोग कर अपने प्रतिक्रिया घटक के लिए।

connect(mapStateToProps)(YourReactComponent); 

अब, अपनी प्रतिक्रिया घटक जहां कार्रवाई updateProduct को गति प्रदान में, आप stateOfResidenceId एक आधार के रूप में होना चाहिए, और आप इसे अपनी कार्रवाई निर्माता को पारित कर सकते हैं।

यह गड़बड़ लगता है, लेकिन यह वास्तव में चिंताओं को अलग करने के बारे में है।

0

आप उपयोग करने का प्रयास कर सकते हैं:

redux-named-reducers

तुम इतनी तरह अपने कोड में कहीं भी राज्य पाने के लिए अनुमति देता है कौन सा:

const localState1 = getState(reducerA.state1) 
const localState2 = getState(reducerB.state2) 
संबंधित मुद्दे