Trong khi gỡ lỗi, tôi có thể truy cập vào cửa hàng Redux từ bảng điều khiển của trình duyệt không?


87

Tôi có các bài kiểm tra đơn vị cho của tôi reducers. Tuy nhiên, khi gỡ lỗi trong trình duyệt, tôi muốn kiểm tra xem các hành động của mình đã được gọi đúng chưa và trạng thái đã được sửa đổi cho phù hợp chưa.

Tôi đang tìm kiếm một cái gì đó như:

window._redux.store

... trong trình duyệt để tôi có thể nhập nội dung đó trên bảng điều khiển và kiểm tra mọi thứ đang diễn ra như thế nào.

Làm thế nào tôi có thể đạt được điều đó?


1
Ngoài ra, bạn có thể cân nhắc sử dụng Redux Devtools cùng với công cụ nàyLogMonitor để trực quan hóa các hành động và trạng thái kết quả của mình.
Michelle Tilley

1
Nói về bảo mật, trong chế độ xây dựng sản xuất, liệu có thể đọc cửa hàng từ bảng điều khiển trình duyệt không?
JRichardsz

Câu trả lời:


151

Cách xem cửa hàng redux trên bất kỳ trang web nào, không thay đổi mã

Cập nhật tháng 11 năm 2019

Các devtools phản ứng đã thay đổi kể từ câu trả lời ban đầu của tôi. componentsTab mới trong devtools của chrome vẫn có dữ liệu, nhưng bạn có thể phải tìm kiếm thêm một chút.

  1. mở chrome devTools
  2. chọn Componentstab của react devtool
  3. nhấp vào nút trên cùng và nhìn vào cột bên storephải để được hiển thị
  4. lặp lại bước 3 xuống cây cho đến khi bạn tìm thấy store(đối với tôi đó là cấp độ 4)
  5. Bây giờ bạn có thể làm theo các bước bên dưới với $r.store.getState()

Ảnh chụp màn hình ví dụ

Câu trả lời gốc

Nếu bạn có các công cụ phát triển phản ứng đang chạy, bạn có thể sử dụng $r.store.getState();không có thay đổi nào đối với cơ sở mã của mình .

Lưu ý: Trước tiên, bạn phải mở react devtool trong cửa sổ công cụ dành cho nhà phát triển của mình để nó hoạt động, nếu không bạn sẽ gặp $r is not definedlỗi

  1. mở các công cụ dành cho nhà phát triển
  2. nhấp vào tab React
  3. đảm bảo nút nhà cung cấp (hoặc nút trên cùng) được chọn
  4. sau đó nhập $r.store.getState();hoặc $r.store.dispatch({type:"MY_ACTION"})vào bảng điều khiển của bạn

2
Lưu ý: để điều này hoạt động, bạn cần lưu trữ statedưới dạng thuộc tính trên thành phần gốc của mình. Nếu bạn làm theo hướng dẫn và có <Provider>thành phần cấp cao nhất, điều này sẽ hoạt động tốt. Chỉ cần có một chút bằng cách di chuyển nó xung quanh!
Aidan Feldman

3
Hãy thử$r.state.store.getState()
dùng1032752

4
Có vẻ như $rđề cập đến thành phần hiện được chọn trong Componentsphần Công cụ nhà phát triển. Tôi dường như không thể truy cập toàn bộ storethông qua $r, có lẽ bởi vì tôi đang sử dụng lưỡi câu ở khắp mọi nơi, nhưng tôi có thể nhìn thấy một phần của các cửa hàng mà thành phần của tôi có thể thấy, đó là gần như là tốt, và đôi khi nhiều hơn đến điểm!
Dima Tisnek 25/09/19

2
$r.hooks[0].subHooks[0].subHooks[0].value.store.getState()làm việc cho những thành phần mà useSelector... Ob, YMMV tùy thuộc vào móc bạn sử dụng ....
Dima Tisnek

3
Tôi đã phải sử dụng$r.props.store
Kris Dover

62

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

Bây giờ bạn có thể truy cập cửa hàng từ window.store trong bảng điều khiển như sau:

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


6
và cũng có thể truy cập vào nhà nước:window.store.getState()
Liran Brimer

13

Bạn có thể sử dụng phần mềm trung gian ghi nhật ký như được mô tả trong Sách Đỏ :

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

Ngoài ra, bạn có thể thay đổi việc ghi nhật ký để chỉ thêm vào một mảng toàn cục (của bạn window._redux) và bạn có thể xem trong mảng khi bạn cần thông tin về một trạng thái cụ thể.


1
Hoặc thậm chí tốt hơn, sử dụng một thư viện như Redux-logger
Anand Sainath

Nếu bạn đang nhập các bộ giảm như thế này: nhập bộ giảm từ './reducers/' thì bạn chỉ có thể sử dụng let store = createStoreWithMiddleware (bộ giảm) vì tệp './reducers/' thường sẽ có các kết hợp trong đó.
Bruce Seymour

6

Nếu bạn đang sử dụng Next JS , bạn có thể truy cập cửa hàng bằng cách: window.__NEXT_REDUX_STORE__.getState()

Bạn cũng có thể gửi các hành động, chỉ cần xem các tùy chọn bạn có trongwindow.__NEXT_REDUX_STORE__


6

Giải pháp được đề xuất không phù hợp với tôi.

Lệnh đúng là:

$r.props.store.getState()

nó phải là một bình luận cho những câu trả lời này
gdbdable

1

Trong trường hợp bạn muốn xem trạng thái cửa hàng để gỡ lỗi, bạn có thể làm như sau:

#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

Một câu trả lời khác đề xuất thêm cửa hàng vào cửa sổ, nhưng nếu bạn chỉ muốn truy cập cửa hàng dưới dạng một đối tượng, bạn có thể xác định một getter trên cửa sổ.

Mã này cần được thêm vào nơi bạn đã định cấu hình cửa hàng của mình - trong ứng dụng của tôi, đây là tệp giống như nơi <Provider store={store} />được gọi.

Bây giờ bạn có thể gõ reduxStorevào bảng điều khiển để lấy một đối tượng - và copy(reduxStore)sao chép nó vào khay nhớ tạm.

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

Bạn có thể bọc nó trong một if (process.env.NODE_ENV === 'development')để tắt nó trong sản xuất.


-1

Với các công cụ của nhà phát triển phản ứng:

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

1
đưa ra Uncaught TypeError: Cannot read property 'values' of undefinedlỗi
gdbdable

-2

Trước hết, bạn cần xác định cửa hàng trong windowđối tượng (Bạn có thể đặt nó trong configureStoretệp của mình):

window.store = store;

Sau đó, bạn chỉ cần viết trong bảng điều khiển như sau:

window.store.getState();

Hy vọng điều này sẽ giúp.


cửa hàng không được xác định trong bảng điều khiển theo mặc định. Làm thế nào để nó đến đó?
Jen S.

Trước tiên, Store cần được xác định trong đối tượng window trước khi nó có thể được sử dụng.
Rafael Rozon

@RafaelRozon Vâng, bạn nói đúng, tôi đã chỉnh sửa câu trả lời của mình để thể hiện điều đó.
Alberto Perez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.