Redux: Verzögerter Datei-Upload... wo sollen Datei-Objekte abgelegt werden?

Erstellt am 18. Juli 2016  ·  3Kommentare  ·  Quelle: reduxjs/redux

Ich suche nach einem Vorschlag zum Umgang mit Datei-Uploads. Ich habe eine Zielseite, auf der Benutzer eine Datei per Drag & Drop verschieben können und dann aufgefordert werden, sich anzumelden, bevor der Dateiupload beginnt. Ich muss das gezogene Dateiobjekt irgendwo halten, aber da der Redux-Zustand nur einfache JS-Objekte enthalten soll, bin ich mir nicht sicher, wo ich dieses Dateiobjekt ablegen soll. Ich könnte es in einem React-Zustand/-Prop halten, aber ich muss dann sicherstellen, dass es schließlich an die richtige Komponente weitergegeben wird usw.

Hilfreichster Kommentar

@olalonde Die Empfehlung, dass der Zustand serialisierbar sein sollte, ist eine weiche - sie ist nicht in Stein gemeißelt. Es existiert hauptsächlich, um ein einfaches serverseitiges Rendering und Zustands-Snapshots zu ermöglichen, da Sie in der Lage sein müssen, Ihren Zustand zu serialisieren, um ihn auf dem Client zu hydratisieren oder an einen anderen Ort zu senden. Da dies ausschließlich auf dem Client erfolgt, ist es möglicherweise nicht so schlimm, dieses Dateiobjekt kurzzeitig zur weiteren Verarbeitung zu speichern.

Und selbst wenn Sie dann Ihren Zustand serialisieren, wird ein File Deskriptor zu einem Objektobjekt serialisiert, sodass Sie keinen Serialisierungsfehler erhalten.

Alle 3 Kommentare

Eine mögliche Lösung wäre, den Store mit store.subscribe auf Zustandsänderungen abzuhören, obwohl ich nicht sicher bin, wie ich mit connect(...) Zugriff auf store.subscribe bekomme. Vielleicht this.context.store.subscribe() ?

@olalonde Die Empfehlung, dass der Zustand serialisierbar sein sollte, ist eine weiche - sie ist nicht in Stein gemeißelt. Es existiert hauptsächlich, um ein einfaches serverseitiges Rendering und Zustands-Snapshots zu ermöglichen, da Sie in der Lage sein müssen, Ihren Zustand zu serialisieren, um ihn auf dem Client zu hydratisieren oder an einen anderen Ort zu senden. Da dies ausschließlich auf dem Client erfolgt, ist es möglicherweise nicht so schlimm, dieses Dateiobjekt kurzzeitig zur weiteren Verarbeitung zu speichern.

Und selbst wenn Sie dann Ihren Zustand serialisieren, wird ein File Deskriptor zu einem Objektobjekt serialisiert, sodass Sie keinen Serialisierungsfehler erhalten.

Vielen Dank. Am Ende habe ich meinen Upload-Action-Ersteller mit der folgenden Funktion verpackt:

waitIntroMessageShowedActionCreator.js

// delays execution of `fn` until `state.session.user.ui.introMessageShowed === true`

export const initWaitIntroMessageShowed = ({ getState, subscribe }) => (fn) => () => (
  new Promise((resolve, reject) => {
    const handleChange = () => {
      const state = getState()
      if (!state.session.user.ui) return null
      if (!state.session.user.ui.introMessageShowed) return null
      /* eslint-disable no-use-before-define */
      unsubscribe()
      return Promise
        .resolve()
        .then(() => fn())
        .catch(reject)
        .then(resolve)
    }
    const unsubscribe = subscribe(handleChange)
    handleChange()
  })
)

und in meiner Komponente:

class DragDropSignup extends Component {
  constructor(props) {
    super(props)
    const waitIntroMessageShowed = initWaitIntroMessageShowed(this.props.store)
    this.onSignupSuccess = waitIntroMessageShowed(this.onSignupSuccess.bind(this))
  }
 // ...
}
// ...

// pass store object as prop
const connectStore = () => (WrappedComponent) => {
  const ConnectStore = (props, context) => (
    <WrappedComponent store={context.store} {...props} />
  )
  ConnectStore.contextTypes = { store: React.PropTypes.object }
  return ConnectStore
}

export default connectStore()(connect()(DragDropSignup))

Hier posten, falls es für jemanden nützlich ist

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen