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