Redux: Carga de archivos retrasada ... ¿dónde colocar los objetos de archivo?

Creado en 18 jul. 2016  ·  3Comentarios  ·  Fuente: reduxjs/redux

Estoy buscando una sugerencia sobre cómo manejar la carga de archivos. Tengo una página de destino donde los usuarios pueden arrastrar y soltar un archivo y luego se les solicita que se registren antes de que comience la carga del archivo. Necesito mantener el objeto de archivo arrastrado en algún lugar, pero como se supone que el estado de Redux solo contiene objetos JS simples, no estoy seguro de dónde colocar ese objeto de archivo. Podría mantenerlo en algún estado / accesorio de React, pero luego tengo que asegurarme de que finalmente se pase al componente correcto, etc.

Comentario más útil

@olalonde La recomendación de que el estado debe ser serializable es suave, no está establecida en piedra. Existe principalmente para facilitar la representación fácil del lado del servidor y la instantánea del estado porque necesita poder serializar su estado para hidratarlo en el cliente o enviarlo a alguna parte. Como esto se hace únicamente en el cliente, puede que no sea tan malo seguir adelante y almacenar ese objeto de archivo a corto plazo para su posterior procesamiento.

E incluso si luego serializa su estado, un File descriptor se serializará en un objeto objeto, por lo que no obtendrá un error de serialización.

Todos 3 comentarios

Una posible solución sería escuchar en la tienda los cambios de estado usando store.subscribe, aunque no estoy seguro de cómo obtener acceso a store.subscribe usando connect(...) . ¿Quizás this.context.store.subscribe() ?

@olalonde La recomendación de que el estado debe ser serializable es suave, no está establecida en piedra. Existe principalmente para facilitar la representación fácil del lado del servidor y la instantánea del estado porque necesita poder serializar su estado para hidratarlo en el cliente o enviarlo a alguna parte. Como esto se hace únicamente en el cliente, puede que no sea tan malo seguir adelante y almacenar ese objeto de archivo a corto plazo para su posterior procesamiento.

E incluso si luego serializa su estado, un File descriptor se serializará en un objeto objeto, por lo que no obtendrá un error de serialización.

Gracias. Terminé envolviendo mi creador de acciones de carga con la siguiente función:

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

y en mi componente:

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

Publicar aquí en caso de que sea útil para alguien

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

benoneal picture benoneal  ·  3Comentarios

cloudfroster picture cloudfroster  ·  3Comentarios

jbri7357 picture jbri7357  ·  3Comentarios

dmitry-zaets picture dmitry-zaets  ·  3Comentarios

caojinli picture caojinli  ·  3Comentarios