Redux: Téléchargement de fichier retardé... où placer les objets de fichier ?

Créé le 18 juil. 2016  ·  3Commentaires  ·  Source: reduxjs/redux

Je recherche une suggestion sur la gestion des téléchargements de fichiers. J'ai une page de destination où les utilisateurs peuvent faire glisser et déposer un fichier et sont ensuite invités à s'inscrire avant le début du téléchargement du fichier. J'ai besoin de conserver l'objet fichier déplacé quelque part, mais comme l'état Redux n'est censé contenir que des objets JS simples, je ne sais pas où placer cet objet fichier. Je pourrais le maintenir dans un état/prop React, mais je dois ensuite m'assurer qu'il est finalement transmis au bon composant, etc.

Commentaire le plus utile

@olalonde La recommandation selon laquelle l'État devrait être sérialisable est une recommandation douce - ce n'est pas la pierre angulaire. Il existe principalement afin de faciliter le rendu côté serveur et la prise d'instantanés d'état car vous devez pouvoir sérialiser votre état afin de l'hydrater sur le client ou de l'envoyer quelque part. Comme cela est purement fait sur le client, il n'est peut-être pas trop mal d'aller de l'avant et de stocker cet objet de fichier à court terme pour un traitement ultérieur.

Et même si vous sérialisez ensuite votre état, un descripteur File sera sérialisé en un objet objet, vous n'obtiendrez donc pas d'erreur de sérialisation.

Tous les 3 commentaires

Une solution possible serait d'écouter le magasin pour les changements d'état à l'aide de store.subscribe bien que je ne sache pas comment accéder à store.subscribe à l'aide de connect(...) . Peut-être this.context.store.subscribe() ?

@olalonde La recommandation selon laquelle l'État devrait être sérialisable est une recommandation douce - ce n'est pas la pierre angulaire. Il existe principalement afin de faciliter le rendu côté serveur et la prise d'instantanés d'état car vous devez pouvoir sérialiser votre état afin de l'hydrater sur le client ou de l'envoyer quelque part. Comme cela est purement fait sur le client, il n'est peut-être pas trop mal d'aller de l'avant et de stocker cet objet de fichier à court terme pour un traitement ultérieur.

Et même si vous sérialisez ensuite votre état, un descripteur File sera sérialisé en un objet objet, vous n'obtiendrez donc pas d'erreur de sérialisation.

Merci. J'ai fini par envelopper mon créateur d'action de téléchargement avec la fonction suivante :

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

et dans mon composant :

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

Publier ici au cas où cela serait utile à quelqu'un

Cette page vous a été utile?
0 / 5 - 0 notes