Saat men-debug, dapatkah saya mengakses toko Redux dari konsol browser?

91

Saya memiliki tes unit untuk saya reducers . Namun, saat saya men-debug di browser, saya ingin memeriksa apakah tindakan saya telah dipanggil dengan benar dan apakah status telah dimodifikasi dengan semestinya.

Saya mencari sesuatu seperti:

window._redux.store

... di browser sehingga saya dapat mengetiknya di konsol dan memeriksa bagaimana keadaannya.

Bagaimana saya bisa mencapai itu?

André Pena
sumber
1
Sebagai catatan, Anda mungkin mempertimbangkan menggunakan Redux Devtools bersama dengan paraLogMonitor memvisualisasikan tindakan Anda dan negara yang dihasilkan.
Michelle Tilley
1
Berbicara tentang keamanan, dalam mode build produksi, mungkinkah read store dari konsol browser?
JRichardsz

Jawaban:

153

Cara melihat toko redux di situs web apa pun, tanpa perubahan kode

Perbarui November 2019

Alat pengembang react telah berubah sejak jawaban asli saya. componentsTab baru di devtools chrome masih memiliki datanya, tetapi Anda mungkin harus mencari lebih banyak lagi.

  1. buka chrome devTools
  2. pilih Componentstab react devtool
  3. klik pada simpul paling atas dan cari di kolom kanan untuk storeditampilkan
  4. ulangi langkah 3 ke bawah pohon sampai Anda menemukan store(bagi saya itu adalah tingkat ke-4)
  5. Sekarang Anda dapat mengikuti langkah-langkah di bawah ini dengan $r.store.getState()

Contoh tangkapan layar

Jawaban Asli

Jika Anda memiliki bereaksi alat pengembang berjalan Anda dapat menggunakan $r.store.getState();dengan tidak ada perubahan ke basis kode Anda .

Catatan: Anda harus membuka react devtool di jendela alat pengembang Anda terlebih dahulu untuk membuat ini berfungsi, jika tidak Anda akan mendapatkan $r is not definedkesalahan

  1. buka alat pengembang
  2. klik tab React
  3. pastikan node penyedia (atau node paling atas) dipilih
  4. lalu ketik $r.store.getState();atau $r.store.dispatch({type:"MY_ACTION"})ke konsol Anda
S.Kiers
sumber
2
Catatan: agar ini bekerja, Anda perlu menyimpan statesebagai properti pada komponen root Anda. Jika Anda mengikuti petunjuk dan memiliki <Provider>sebagai komponen tingkat atas, ini akan bekerja dengan baik. Dapatkan sedikit dengan menggerakkannya!
Aidan Feldman
3
Coba$r.state.store.getState()
pengguna1032752
4
Sepertinya $rmengacu pada komponen yang saat ini dipilih di Componentsbagian Alat Pengembang. Saya tampaknya tidak dapat mengakses seluruh storemelalui $r, mungkin karena saya menggunakan kait di mana-mana, tapi aku bisa melihat bagian dari toko yang komponen saya bisa melihat, yang hampir sama baiknya, dan kadang-kadang lebih ke titik!
Dima Tisnek
2
$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()bekerja untuk komponen yang useSelector... Ob., YMMV tergantung pada pengait yang Anda gunakan ...
Dima Tisnek
4
Saya harus menggunakan$r.props.store
Kris Dover
63

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

Sekarang Anda dapat mengakses store dari window.store di konsol seperti ini:

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

Adrian Silvescu
sumber
6
dan juga dapat mengakses negara bagian:window.store.getState()
Liran Brimer
13

Anda dapat menggunakan middleware logging seperti yang dijelaskan di Buku 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)

Alternatifnya, Anda dapat mengubah pencatatan menjadi hanya menambahkan ke larik global (milik Anda window._redux) dan Anda dapat melihat di larik saat Anda membutuhkan informasi tentang keadaan tertentu.

Sean Vieira
sumber
1
Atau lebih baik lagi, gunakan perpustakaan seperti redux-logger
Anand Sainath
Jika Anda mengimpor reduksi seperti ini: import reducers dari './reducers/' maka Anda dapat menggunakan let store = createStoreWithMiddleware (reducers) karena file './reducers/' biasanya akan memiliki CombineReducers di dalamnya.
Bruce Seymour
7

Solusi yang disarankan tidak berhasil untuk saya.

Perintah yang benar adalah:

$r.props.store.getState()
thodwris
sumber
itu harus menjadi komentar untuk jawaban ini
gdbdable
6

Jika Anda menggunakan JS Berikutnya , Anda dapat mengakses penyimpanan dengan: window.__NEXT_REDUX_STORE__.getState()

Anda juga dapat mengirimkan tindakan, lihat saja opsi yang Anda miliki diwindow.__NEXT_REDUX_STORE__

Satwik Gupta
sumber
1

Jika Anda ingin melihat status penyimpanan untuk debugging, Anda dapat melakukan ini:

#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)
igor
sumber
1

Jawaban lain menyarankan untuk menambahkan toko ke jendela, tetapi jika Anda hanya ingin mengakses toko sebagai objek, Anda dapat menentukan pengambil di jendela.

Kode ini perlu ditambahkan di tempat Anda telah mengonfigurasi toko Anda - di aplikasi saya, ini adalah file yang sama dengan tempat <Provider store={store} />dipanggil.

Sekarang Anda dapat mengetik reduxStoredi konsol untuk mendapatkan objek - dan copy(reduxStore)menyalinnya ke clipboard.

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

Anda dapat membungkus ini if (process.env.NODE_ENV === 'development')untuk menonaktifkannya dalam produksi.

James Wilson
sumber
-1

Dengan alat pengembang react:

const store = [...__REACT_DEVTOOLS_GLOBAL_HOOK__.reactDevtoolsAgent.internalInstancesById.values()].find(e=>e.elementType.name==="Provider").pendingProps.store
VARP-DOH
sumber
1
memberikan Uncaught TypeError: Cannot read property 'values' of undefinedkesalahan
gdbdable
-2

Pertama-tama, Anda perlu menentukan penyimpanan di windowobjek (Anda dapat menempatkannya di configureStorefile Anda ):

window.store = store;

Maka Anda hanya perlu menulis di konsol berikut ini:

window.store.getState();

Semoga ini bisa membantu.

Alberto Perez
sumber
store tidak ditentukan di konsol secara default. Bagaimana itu bisa sampai di sana?
Jen S.
Store perlu didefinisikan terlebih dahulu di objek jendela sebelum dapat digunakan.
Rafael Rozon
@RafaelRozon Ya, Anda benar, saya telah mengedit jawaban saya untuk menunjukkan itu.
Alberto Perez