Hata ayıklama sırasında tarayıcı konsolundan Redux mağazasına erişebilir miyim?


91

Benim için birim testlerim var reducers. Ancak, tarayıcıda hata ayıklarken, eylemlerimin doğru şekilde çağrılıp çağrılmadığını ve durumun buna göre değiştirilip değiştirilmediğini kontrol etmek istiyorum.

Şunun gibi bir şey arıyorum:

window._redux.store

... tarayıcıda, böylece konsola yazabilir ve işlerin nasıl gittiğini kontrol edebilirim.

Bunu nasıl başarabilirim?


1
Bir yan not olarak, kullanmayı düşünebilirsiniz Redux DevTools'un birlikte işlemlerinizi ve elde durumlarını görselleştirmek için. LogMonitor
Michelle Tilley

1
Güvenlik hakkında konuşurken, üretim oluşturma modunda, tarayıcı konsolundan mağaza okumak mümkün müdür?
JRichardsz

Yanıtlar:


153

Redux mağazası herhangi bir web sitesinde kod değişikliği olmadan nasıl görüntülenir

Kasım 2019 Güncellemesi

İlk cevabımdan bu yana tepki geliştiricileri değişti. componentsChrome'un geliştiricilerindeki yeni sekme hala verilere sahip, ancak biraz daha fazla arama yapmanız gerekebilir.

  1. chrome devTools'u aç
  2. react devtool'un Componentssekmesini seçin
  3. En üstteki düğümü tıklayın ve storegösterilmek için sağdaki sütuna bakın
  4. bulana kadar ağaçta 3. adımı tekrarlayın store(benim için 4. seviyeydi)
  5. Şimdi aşağıdaki adımları takip edebilirsiniz. $r.store.getState()

Örnek ekran görüntüsü

Orijinal Cevap

Eğer varsa kullanabilirsiniz çalışan geliştirici araçları tepki $r.store.getState();ile sizin kod tabanına hiçbir değişiklik .

Not: Bunun çalışması için önce geliştirici araçları pencerenizdeki react devtool'u açmanız gerekir, aksi takdirde bir $r is not definedhata alırsınız

  1. geliştirici araçlarını aç
  2. Tepki sekmesine tıklayın
  3. sağlayıcı düğümünün (veya en üstteki düğümün) seçildiğinden emin olun
  4. sonra konsolunuza $r.store.getState();veya yazın$r.store.dispatch({type:"MY_ACTION"})

2
Not: Bunun çalışması için, statekök bileşeninizde bir özellik olarak depolamanız gerekir . Eğer izlerseniz yön ve sahip <Provider>üst düzey bileşeni, bu irade işi para cezası olarak. Sadece hareket ettirerek ısırıldı!
Aidan Feldman

3
Deneyin$r.state.store.getState()
user1032752

4
Görünüşe göre Geliştirme Araçları bölümünde $rseçili olan bileşene başvuruyor Components. Ben tüm erişmek mümkün görünmemektedir storethrough $rher yerde kanca kullanıyorum çünkü belki, ama bazen daha neredeyse iyiliği gibidir benim bileşeni görebilirsiniz mağazanın, bir kısmını görmek için almak ve nokta!
Dima Tisnek

2
$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()şu bileşenler için çalışıyor useSelector... Ob.,
Kullandığınız

4
Ben kullanmak zorunda$r.props.store
Kris Dover

63

let store = createStore(yourApp); window.store = store;

Artık mağazaya konsoldaki window.store'dan şu şekilde erişebilirsiniz:

window.store.dispatch({type:"MY_ACTION"})


6
ve şu eyalete de erişebilir:window.store.getState()
Liran Brimer

13

Redux Book'ta açıklandığı gibi bir günlük ara yazılımını kullanabilirsiniz :

/**
 * 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)

Alternatif olarak, günlüğü yalnızca bir genel diziye (sizin window._redux) eklenecek şekilde değiştirebilir ve belirli bir durum hakkında bilgiye ihtiyacınız olduğunda diziye bakabilirsiniz.


1
Hatta daha da iyisi, böyle bir kütüphane kullanma redux-kaydedici
Anand Saniath'ın

İndirgeyicileri şu şekilde içe aktarıyorsanız: indirgeyicileri './reducers/' adresinden içe aktarın, o zaman './reducers/' dosyasında tipik olarak birleşikRedüktörler bulunacağından, let store = createStoreWithMiddleware (indirgeyiciler) kullanabilirsiniz.
Bruce Seymour

7

Önerilen çözüm benim için çalışmıyor.

Doğru komut şudur:

$r.props.store.getState()

bu yanıt için bir yorum olmalı
gdbdable

6

Next JS kullanıyorsanız , mağazaya şu şekilde erişebilirsiniz: window.__NEXT_REDUX_STORE__.getState()

Eylemleri de gönderebilirsiniz, sadece içinde sahip olduğunuz seçeneklere bakın.window.__NEXT_REDUX_STORE__


1

Hata ayıklama için mağaza durumunu görmek isterseniz, şunu yapabilirsiniz:

#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

Başka bir yanıt, mağazayı pencereye eklemeyi önerir, ancak mağazaya yalnızca bir nesne olarak erişmek istiyorsanız, pencerede bir alıcı tanımlayabilirsiniz.

Bu kodun mağazanızı yapılandırdığınız yere eklenmesi gerekiyor - benim uygulamamda bu <Provider store={store} />, çağrıldığı dosyayla aynı dosya .

Artık reduxStorebir nesne almak ve copy(reduxStore)onu panoya kopyalamak için konsola yazabilirsiniz .

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

if (process.env.NODE_ENV === 'development')Üretimde devre dışı bırakmak için bunu bir içine sarabilirsiniz .


-1

React geliştirici araçlarıyla:

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 undefinedhata veriyor
gdbdable

-2

Öncelikle, windownesnede depoyu tanımlamanız gerekir ( configureStoreDosyanıza yerleştirebilirsiniz):

window.store = store;

O zaman konsola yalnızca aşağıdakileri yazmanız gerekir:

window.store.getState();

Umarım bu yardımcı olur.


mağaza varsayılan olarak konsolda tanımsızdır. Oraya nasıl gider?
Jen S.

Mağazanın kullanılmadan önce pencere nesnesinde tanımlanması gerekir.
Rafael Rozon

@RafaelRozon Evet, haklısın, cevabımı bunu göstermek için düzenledim.
Alberto Perez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.