Redux: Aktion bei Versand im Store nie gesehen.

Erstellt am 16. Mai 2016  ·  3Kommentare  ·  Quelle: reduxjs/redux

Ich habe ein Nicht-React-Projekt mit dem folgenden Code
.

_index.js_

import configureStore from 'js/store/configureStore'

/* Redux Imports */
import { createPage } from 'js/actions/page'

// Boot the App
document.addEventListener('DOMContentLoaded', function () {
  const initialState = window.__INITIAL_STATE__
  const pageId = window.__INITIAL_STATE__.page
  const store = configureStore(initialState)
  store.dispatch(createPage(pageId))
})

*actions/page.js*
function initPage (pageId) {
  return {
    type: 'CREATE_PAGE',
    page: pageId
  }
}

export function createPage (pageId) {
  return dispatch => {
    dispatch(initPage(pageId))
  }
}

_reduzierer/page.js_

/**
 * Page Mediators get imported here
 * Page Mediators are brokers that hold page initialization.
 * The bundle includes all page mediators but they will not be activated
 * unless thre reducer calls them.
 */
import * as cart from 'js/templates/cart'

/**
 * This is a edge case, index.js boots the app and we are subscribing to 
 * a Redux @<strong i="11">@INIT</strong> action instead of adding one more layer of actions
 * which leads to unintended scenarios.
 */

const page = (state = {page: []} , action) => {

  console.log(state)
  switch (action.type) {
    case '@<strong i="12">@INIT</strong>':
      console.log('initializing page:' + state.id)
      console.log(state)
      dispatch({type: 'CREATE_PAGE',page: state.id})
      cart.init()
      return state
    case 'CREATE_PAGE':
      console.log('initializing page:' + state.id)
      cart.init()
      return state
    default:
      return state
  }
}
export default page

Das Problem, das ich habe, ist, dass actions/page.js die Aktion CREATE_PAGE nie sieht. Irgendwelche Gedanken?

Hilfreichster Kommentar

Nicht verwandt, aber

  • Dies ist ein Randfall, index.js bootet die App und wir abonnieren
  • eine Redux @ @ INIT- Aktion, anstatt eine weitere Aktionsebene hinzuzufügen
  • was zu ungewollten Szenarien führt.

kann Ihre App jeden Tag kaputt machen.

Wir sagen konkret :

  • Dies sind private Aktionstypen, die von Redux reserviert sind.
  • Für alle unbekannten Aktionen müssen Sie den aktuellen Status zurückgeben.
  • Wenn der aktuelle Status nicht definiert ist, müssen Sie den Anfangsstatus zurückgeben.
  • Verweisen Sie in Ihrem Code nicht direkt auf diese Aktionstypen.

Alle 3 Kommentare

Nicht verwandt, aber

  • Dies ist ein Randfall, index.js bootet die App und wir abonnieren
  • eine Redux @ @ INIT- Aktion, anstatt eine weitere Aktionsebene hinzuzufügen
  • was zu ungewollten Szenarien führt.

kann Ihre App jeden Tag kaputt machen.

Wir sagen konkret :

  • Dies sind private Aktionstypen, die von Redux reserviert sind.
  • Für alle unbekannten Aktionen müssen Sie den aktuellen Status zurückgeben.
  • Wenn der aktuelle Status nicht definiert ist, müssen Sie den Anfangsstatus zurückgeben.
  • Verweisen Sie in Ihrem Code nicht direkt auf diese Aktionstypen.

Danke @gaearon - Ich beabsichtige, dies zu entfernen, ich habe es hinzugefügt, weil die von mir erstellten Aktionen nie

Bitte verwenden Sie StackOverflow für Fragen. Wir versuchen, den Issue Tracker für Fehler- und Feature-Diskussionen zu verwenden, jedoch nicht für Support.

Der Code verstößt gegen die Einschränkungen von Redux, indem er einen Nebeneffekt ( cart.init() ) ausführt und versucht, eine Aktion ( dispatch() ) innerhalb des Reducers auszuführen. Dies ist nicht erlaubt, wie in der Dokumentation mehrfach vermerkt. Reduzierer müssen reine Funktionen sein, daher sollten Sie Nebenwirkungen vor oder nach dem Versand der Aktion platzieren.

Wenn Sie in einem Reduzierstück versenden, sollte Ihr Code fehlschlagen. Wenn es nicht fehlschlägt, haben Sie vielleicht ein Versprechen, das den Fehler irgendwo verschluckt. Es ist schwer, mehr aus diesem Codeschnipsel zu sagen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen