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?


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

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"})


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.


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()

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__


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)

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.


-1

Dengan alat pengembang react:

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.