2016-07-23 4 views
9

मैं सोच रहा हूं, कभी-कभी मेरे पास एक reducer है जिसके लिए एक और reducer से जानकारी की जरूरत है। क्योंकि अन्यथा मैं सूचकांक सही ढंग से निर्धारित नहीं कर सकता,रेडक्स: एक reducer फ़ंक्शन में store.getState() को कॉल करना, क्या एक विरोधी पैटर्न है?

import * as ActionTypes from '../actions/action_type_constants'; 
import KeyCode from 'keycode.js/index'; 
import {store} from "../index"; 
import {mod} from "../pure_functions"; 

export function selectedCompletion(state = 0, action) { 
    if (action.type === ActionTypes.arrowKeyPressed) { 
    const completionsLength = store.getState().completions.data.length; 
    if (action.keyCode === KeyCode.UP) { 
     return mod(state - 1, completionsLength); 
    } else if (action.keyCode === KeyCode.DOWN) { 
     return mod(state + 1, completionsLength); 
    } 
    } 
    return state; 
} 

मैं समारोह की दूसरी पंक्ति में store.getState फोन करते हैं: उदाहरण के लिए मैं इस कम करने की है।

मैं शायद यह और अन्य reducer refactor सकता है, ताकि यह एक बड़ा reducer हो, लेकिन पठनीयता के लिए मैं इस विकल्प को पसंद करेंगे।

मुझे यकीन नहीं है कि अगर मैं कॉलर स्टोर.getState() को एक reducer में कॉल करने के इस पैटर्न का उपयोग करता हूं तो मुझे कोई समस्या नहीं होगी।

उत्तर

12

हां, यह बिल्कुल एक विरोधी पैटर्न है। Reducer कार्यों "शुद्ध" होना चाहिए, और केवल उनके प्रत्यक्ष इनपुट (वर्तमान स्थिति और कार्रवाई) के आधार पर होना चाहिए।

रेडक्स अकसर किये गए सवाल http://redux.js.org/docs/FAQ.html#reducers-share-state पर इस तरह के मुद्दे पर चर्चा करते हैं। असल में, आपको या तो कुछ कस्टम रेड्यूसर तर्क लिखना चाहिए जो आवश्यक अतिरिक्त जानकारी को पास करता है, या अपनी कार्रवाई में अधिक जानकारी डालता है।

मैंने रेडक्स डॉक्स के लिए एक अनुभाग भी लिखा है जिसे Structuring Reducers कहा जाता है, जो रेड्यूसर तर्क से संबंधित कई महत्वपूर्ण अवधारणाओं पर चर्चा करता है। मैं आपको इसके माध्यम से पढ़ने के लिए प्रोत्साहित करता हूं।

+0

मैं यहां थोड़ा उलझन में हूं, कैसे एक स्टेटस्टेट वर्तमान स्थिति के आधार पर उल्लंघन का उल्लंघन करता है? विशेष रूप से एक तृतीय पक्ष reducer के उपयोग मामले दिया है कि आप पुनर्व्यवस्थित नहीं कर सकते हैं। –

+1

सबसे पहले, "शुद्ध कार्य" की परिभाषा "एक ऐसा कार्य है जो केवल इसके इनपुट पर निर्भर करता है, और स्वयं के बाहर कुछ भी संशोधित या प्रभावित नहीं करता है"। एक आयातित स्टोर का संदर्भ देना मतलब है कि यह _not_ शुद्ध है। दूसरा, यह जोड़ उस विशिष्ट स्टोर इंस्टेंस के लिए reducer, जिसका मतलब है कि यह परीक्षण या एकाधिक स्टोर जैसे मामलों में काम नहीं करेगा। इसलिए, अधिकांश मामलों में कोड _may_ काम करता है, लेकिन यह निश्चित रूप से "सही" नहीं है। चीज़ों को संभालने के तरीके के बारे में जानकारी के लिए कृपया उस एफएक्यू एंट्री और [स्ट्रक्चरिंग रेड्यूसर] (http://redux.js.org/docs/recipes/StructuringReducers.html) को दोबारा पढ़ें। – markerikson

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