डिबगिंग करते समय, क्या मेरे पास ब्राउज़र कंसोल से Redux स्टोर तक पहुंच हो सकती है?


87

मेरे पास मेरे लिए यूनिट परीक्षण हैं reducers। हालांकि, जब मैं ब्राउज़र में डिबगिंग कर रहा हूं, तो मैं यह जांचना चाहता हूं कि क्या मेरे कार्यों को सही तरीके से बुलाया गया है और क्या राज्य को तदनुसार संशोधित किया गया है।

मैं कुछ इस तरह की तलाश में हूँ:

window._redux.store

... ब्राउज़र में इसलिए मैं कंसोल पर टाइप कर सकता हूं और जांच सकता हूं कि चीजें कैसे चल रही हैं।

मैं उसे कैसे प्राप्त कर सकता हूं?


1
एक तरफ ध्यान दें के रूप में, आप विचार कर सकते हैं Redux DevTools के साथ अपने कार्यों और जिसके परिणामस्वरूप राज्यों कल्पना करने के लिए। LogMonitor
मिशेल टायली

1
उत्पादन बिल्ड मोड में सुरक्षा के बारे में बात करते हुए, क्या ब्राउज़र कंसोल से स्टोर पढ़ना संभव है?
20

जवाबों:


151

बिना किसी कोड परिवर्तन के किसी भी वेबसाइट पर Redux स्टोर कैसे देखें

अद्यतन नवंबर 2019

मेरे मूल उत्तर के बाद से प्रतिक्रिया विचलन बदल गए हैं। componentsक्रोम के डैटूल में नए टैब में अभी भी डेटा है, लेकिन आपको थोड़ा और खोज करना पड़ सकता है।

  1. खुला क्रोम devTools
  2. devtool Componentsटैब को चुनें
  3. शीर्ष-सबसे नोड पर क्लिक करें और storeदिखाए जाने के लिए दाहिने हाथ के कॉलम में देखें
  4. जब तक आपको पेड़ न मिल जाए, तब तक चरण 3 को दोहराएं store(मेरे लिए यह 4 वां स्तर था)
  5. अब आप नीचे दिए गए चरणों का पालन कर सकते हैं $r.store.getState()

उदाहरण स्क्रीनशॉट

मूल उत्तर

आप उपयोग कर सकते चल डेवलपर उपकरण प्रतिक्रिया यदि आपके पास $r.store.getState();के साथ अपने codebase में कोई परिवर्तन नहीं

नोट: आपको यह काम करने के लिए सबसे पहले अपने डेवलपर टूल विंडो में रिएक्शन देवटूल को खोलना होगा, अन्यथा आपको एक $r is not definedत्रुटि मिलेगी

  1. डेवलपर उपकरण खोलें
  2. रिएक्ट टैब पर क्लिक करें
  3. प्रदाता नोड (या सबसे ऊपरी नोड) का चयन करना सुनिश्चित करें
  4. फिर टाइप करें $r.store.getState();या $r.store.dispatch({type:"MY_ACTION"})अपने कंसोल में

2
नोट: इसे काम करने के लिए, आपको stateअपने मूल घटक पर एक संपत्ति के रूप में संग्रहीत करने की आवश्यकता है । यदि आप निर्देशों का पालन करते हैं और <Provider>शीर्ष-स्तरीय घटक के रूप में हैं, तो यह ठीक काम करेगा। बस थोड़ा सा इधर उधर हो जाने से!
एडन फेल्डमैन

3
कोशिश करें$r.state.store.getState()
user1032752

4
ऐसा लगता है कि देव उपकरण $rके Componentsअनुभाग में वर्तमान में चयनित घटक को संदर्भित करता है । मुझे लगता है मैं पूरी तरह storeसे उपयोग करने में सक्षम नहीं हो सकता है $r, हो सकता है क्योंकि मैं हर जगह हुक का उपयोग कर रहा हूं, लेकिन मुझे स्टोर का वह हिस्सा देखने को मिलता है जिसे मेरा घटक देख सकता है, जो लगभग उतना ही अच्छा है, और कभी-कभी अधिक बिंदु!
दीमा टिस्नेक

2
$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()उन घटकों के लिए काम करता है जो useSelector... Ob।, YMMV आपके द्वारा उपयोग किए जाने वाले हुक के आधार पर ...
Dima Tisnek

3
मुझे इस्तेमाल करना था$r.props.store
क्रिस डोवर


13

आप Redux बुक में वर्णित लॉगिंग मिडलवेयर का उपयोग कर सकते हैं :

/**
 * Logs all actions and states after they are dispatched.
 */
const logger = store => next => action => {
  console.group(action.type)
  console.info('dispatching', action)
  let result = next(action)
  console.log('next state', store.getState())
  console.groupEnd(action.type)
  return result
}

let createStoreWithMiddleware = applyMiddleware(logger)(createStore)

let yourApp = combineReducers(reducers)
let store = createStoreWithMiddleware(yourApp)

वैकल्पिक रूप से, आप लॉगिंग को केवल एक वैश्विक सरणी (अपने window._redux) में जोड़ सकते हैं और जब आप किसी विशेष राज्य की जानकारी की आवश्यकता हो तो आप सरणी में देख सकते हैं।


1
या इससे भी बेहतर, redux-logger जैसी
आनंद साईंनाथ

यदि आप इस तरह रिड्यूसर आयात कर रहे हैं: './reducers/' से रिड्यूसर आयात करें, तो आप बस let = storeStoreWithMiddleware (रिड्यूसर) को './reducers/' फ़ाइल के रूप में उपयोग कर सकते हैं।
ब्रूस सेमुर

6

यदि आप Next JS का उपयोग कर रहे हैं , तो आप स्टोर तक पहुंच सकते हैं: window.__NEXT_REDUX_STORE__.getState()

आप कार्रवाई भी भेज सकते हैं, बस उन विकल्पों को देखें जो आपके पास हैंwindow.__NEXT_REDUX_STORE__


6

अनुशंसित समाधान मेरे लिए काम नहीं करता है।

सही आदेश है:

$r.props.store.getState()

यह इन जवाब के लिए एक टिप्पणी होनी चाहिए
gdbdable

1

यदि आप डिबगिंग के लिए स्टोर स्टेट देखना चाहते हैं तो आप ऐसा कर सकते हैं:

#import global from 'window-or-global'
const store = createStore(reducer)
const onStateChange = (function (global) {
  global._state = this.getState()
}.bind(store, global))
store.subscribe(onStateChange)
onStateChange()
console.info('Application state is available via global _state object.', '_state=', global._state)

1

एक अन्य जवाब में दुकान को खिड़की से जोड़ने का सुझाव दिया गया है, लेकिन अगर आप सिर्फ एक वस्तु के रूप में दुकान तक पहुंच चाहते हैं, तो आप खिड़की पर एक गटर को परिभाषित कर सकते हैं।

इस कोड को जोड़ने की आवश्यकता है जहां आपने अपना स्टोर कॉन्फ़िगर किया है - मेरे ऐप में, यह वही फ़ाइल है जहां <Provider store={store} />कहा जाता है।

अब आप reduxStoreकंसोल में एक ऑब्जेक्ट प्राप्त करने के लिए टाइप कर सकते हैं - और copy(reduxStore)इसे क्लिपबोर्ड पर कॉपी करने के लिए।

  Object.defineProperty(window, 'reduxStore', {
    get() {
      return store.getState();
    },
  });

if (process.env.NODE_ENV === 'development')उत्पादन में इसे निष्क्रिय करने के लिए आप इसे लपेट सकते हैं ।


-1

प्रतिक्रिया के साथ डेवलपर उपकरण:

const store = [...__REACT_DEVTOOLS_GLOBAL_HOOK__.reactDevtoolsAgent.internalInstancesById.values()].find(e=>e.elementType.name==="Provider").pendingProps.store

1
Uncaught TypeError: Cannot read property 'values' of undefinedत्रुटि देता है
gdbdable

-2

सबसे पहले, आपको windowऑब्जेक्ट में स्टोर को परिभाषित करने की आवश्यकता है (आप इसे आप configureStoreफ़ाइल में रख सकते हैं ):

window.store = store;

फिर आपको केवल निम्नलिखित कंसोल में लिखने की आवश्यकता है:

window.store.getState();

हॉप यह मदद करता है।


स्टोर कंसोल में डिफ़ॉल्ट रूप से अपरिभाषित है। वहां कैसे पहुंचता है?
जेएन एस।

स्टोर ऑब्जेक्ट को विंडो ऑब्जेक्ट में पहले उपयोग करने से पहले परिभाषित करने की आवश्यकता होगी।
राफेल रोजोन

@ राफेलरोज़न हाँ, आप सही कह रहे हैं, मैंने यह दिखाने के लिए अपना उत्तर संपादित किया है।
अल्बर्टो पेरेज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.