ขณะทำการดีบักฉันสามารถเข้าถึง Redux store จากคอนโซลของเบราว์เซอร์ได้หรือไม่


91

ฉันมีการทดสอบหน่วยสำหรับreducersไฟล์. อย่างไรก็ตามเมื่อฉันทำการดีบักในเบราว์เซอร์ฉันต้องการตรวจสอบว่าการกระทำของฉันถูกเรียกอย่างถูกต้องหรือไม่และสถานะได้รับการแก้ไขตามนั้นหรือไม่

ฉันกำลังมองหาสิ่งที่ต้องการ:

window._redux.store

... ในเบราว์เซอร์เพื่อให้ฉันพิมพ์สิ่งนั้นบนคอนโซลและตรวจสอบว่าสิ่งต่างๆเป็นอย่างไร

ฉันจะบรรลุสิ่งนั้นได้อย่างไร?


1
ตามบันทึกข้างคุณอาจพิจารณาใช้Redux Devtoolsพร้อมกับที่จะเห็นภาพการกระทำและส่งผลให้รัฐของคุณ LogMonitor
Michelle Tilley

1
พูดถึงความปลอดภัยในโหมดการสร้างการผลิตเป็นไปได้ไหมที่จะอ่านที่เก็บจากคอนโซลเบราว์เซอร์
JRichardsz

คำตอบ:


153

วิธีดูร้านค้า redux บนเว็บไซต์ใด ๆ โดยไม่มีการเปลี่ยนแปลงรหัส

อัปเดตพฤศจิกายน 2019

เครื่องมือตอบสนองมีการเปลี่ยนแปลงตั้งแต่คำตอบเดิมของฉัน componentsแท็บใหม่ใน devtools ของ chrome ยังคงมีข้อมูลอยู่ แต่คุณอาจต้องค้นหาอีกเล็กน้อย

  1. เปิด Chrome devTools
  2. เลือกComponentsแท็บreact devtool
  3. คลิกที่โหนดบนสุดและดูในคอลัมน์ทางขวามือเพื่อstoreให้แสดง
  4. ทำซ้ำขั้นตอนที่ 3 ลงต้นไม้จนกว่าคุณจะพบstore(สำหรับฉันมันคือระดับที่ 4)
  5. ตอนนี้คุณสามารถทำตามขั้นตอนด้านล่างด้วย $r.store.getState()

ตัวอย่างภาพหน้าจอ

คำตอบเดิม

หากคุณมีการตอบสนองเครื่องมือสำหรับนักพัฒนาที่ทำงานคุณสามารถใช้$r.store.getState();กับการเปลี่ยนแปลง codebase

หมายเหตุ:คุณต้องเปิดเครื่องมือตอบกลับในหน้าต่างเครื่องมือสำหรับนักพัฒนาของคุณก่อนจึงจะสามารถใช้งานได้มิฉะนั้นคุณจะได้รับ$r is not definedข้อผิดพลาด

  1. เปิดเครื่องมือสำหรับนักพัฒนา
  2. คลิกแท็บ React
  3. ตรวจสอบให้แน่ใจว่าได้เลือกโหนดผู้ให้บริการ (หรือโหนดบนสุด)
  4. จากนั้นพิมพ์$r.store.getState();หรือ$r.store.dispatch({type:"MY_ACTION"})ลงในคอนโซลของคุณ

2
หมายเหตุ: เพื่อให้ใช้งานได้คุณต้องจัดเก็บstateเป็นคุณสมบัติในองค์ประกอบรากของคุณ หากคุณทำตามคำแนะนำและมี<Provider>องค์ประกอบระดับบนสุดการดำเนินการนี้จะใช้ได้ดี เพียงแค่ขยับมันไปมา!
Aidan Feldman

3
ลอง$r.state.store.getState()
user1032752

4
ดูเหมือน $rหมายถึงส่วนประกอบที่เลือกในปัจจุบันในComponentsส่วนของ Dev Tools ฉันดูเหมือนจะไม่สามารถเข้าถึงทั้งstoreผ่าน$rอาจจะเพราะผมใช้ตะขอทุกที่ แต่ผมได้เห็นส่วนหนึ่งของการจัดเก็บที่องค์ประกอบของฉันสามารถมองเห็นซึ่งเกือบจะเป็นที่ดีและบางครั้งมากขึ้น จุด!
Dima Tisnek

2
$r.hooks[0].subHooks[0].subHooks[0].value.store.getState() ใช้ได้กับส่วนประกอบเหล่านั้น useSelector ... Ob., YMMV ขึ้นอยู่กับตะขอที่คุณใช้ ...
Dima Tisnek

4
ฉันต้องใช้$r.props.store
Kris Dover

63

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

ตอนนี้คุณสามารถเข้าถึง store ได้จาก window.store ในคอนโซลดังนี้:

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


6
และยังสามารถเข้าถึงสถานะ:window.store.getState()
Liran Brimer

13

คุณสามารถใช้มิดเดิลแวร์การบันทึกตามที่อธิบายไว้ใน Redux Book :

/**
 * 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
Anand Sainath

หากคุณกำลังนำเข้าตัวลดเช่นนี้: นำเข้าตัวลดจาก "./reducers/" คุณสามารถใช้ let store = createStoreWithMiddleware (ตัวลดขนาด) เป็นไฟล์ "./reducers/" โดยทั่วไปแล้วจะมี combinationReducers อยู่
Bruce Seymour

8

วิธีแก้ปัญหาที่แนะนำไม่ได้ผลสำหรับฉัน

คำสั่งที่ถูกต้องคือ:

$r.props.store.getState()

ควรเป็นความคิดเห็นสำหรับคำตอบเหล่านี้
gdbdable

6

หากคุณใช้Next JSคุณสามารถเข้าถึงร้านค้าได้โดย: window.__NEXT_REDUX_STORE__.getState()

คุณยังสามารถจัดส่งการกระทำได้เพียงแค่ดูตัวเลือกที่คุณมีในwindow.__NEXT_REDUX_STORE__


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

คำตอบอื่นแนะนำให้เพิ่ม store ลงในหน้าต่าง แต่ถ้าคุณต้องการเข้าถึง store เป็นวัตถุคุณสามารถกำหนด getter บนหน้าต่างได้

ต้องเพิ่มรหัสนี้ในตำแหน่งที่คุณกำหนดค่าร้านค้าของคุณ - ในแอปของฉันนี่เป็นไฟล์เดียวกับที่<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();

หวังว่านี่จะช่วยได้


store ไม่ได้กำหนดไว้ในคอนโซลตามค่าเริ่มต้น มันไปที่นั่นได้อย่างไร?
Jen S.

ต้องมีการกำหนด Store ก่อนในหน้าต่างวัตถุก่อนจึงจะใช้งานได้
Rafael Rozon

@RafaelRozon ใช่คุณพูดถูกฉันแก้ไขคำตอบของฉันเพื่อที่จะแสดงให้เห็นว่า
Alberto Perez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.