validar validacion una termine que pagina funcion formularios formulario esperar enviar ejemplos ejecutar despues con cargar carga asincrona antes javascript reactjs redux action dispatch

validacion - validar formulario javascript html5



Reaccionar la acción de envío de Redux después de otra acción (5)

En lugar de enviar una acción después de una acción de sincronización, ¿puede llamar a la función desde el reductor?

Entonces sigue este flujo:

Llamada de acción de sincronización -> Llamada de reductor ---> Función de caja (reductor) ---> Función de caja (reductor)

En lugar del flujo habitual que probablemente sea esto para usted:

Llamada de acción de sincronización -> Llamada de reducción

Siga esta guía para dividir los reductores y ver qué reductores de caso son.

Si la acción que desea enviar tiene efectos secundarios, entonces la forma correcta es utilizar Thunks y luego puede enviar una acción después de una acción.

Ejemplo para Thunks :

export const setSkip = (skip) => { return (dispatch, getState) => { dispatch(someFunc()); //Do someFunc first then this action, use getState() for currentState if you want return { type: ''LIST.SET_SKIP'', skip: skip }; } };

Tengo una acción asíncrona , que busca datos de la API REST:

export const list = (top, skip) => dispatch => { dispatch({ type: ''LIST.REQUEST'' }); $.get(API_URL, { top: top, skip: skip }) .done((data, testStatus, jqXHR) => { dispatch({ type: ''LIST.SUCCESS'', data: data }); }); };

Una acción de sincronización , que cambia el estado de skip :

export const setSkip = (skip) => { return { type: ''LIST.SET_SKIP'', skip: skip }; };

Estado inicial para top = 10, skip = 0 . En componente:

class List extends Component { componentDidMount() { this.list(); } nextPage() { let top = this.props.list.top; let skip = this.props.list.skip; // After this this.props.onSetSkip(skip + top); // Here skip has previous value of 0. this.list(); // Here skip has new value of 10. } list() { this.props.List(this.props.list.top, this.props.list.skip); } render () { return ( <div> <table> ... </table> <button onClick={this.nextPage.bind(this)}>Next</button> </div> ); } }

Cuando se hace clic en el botón Siguiente a la primera vez, el valor del skip que utiliza la acción asíncrona no cambia. ¿Cómo puedo enviar acciones después de la acción de sincronización ?


Gracias por las respuestas, pero lo hice de esta manera:

let top = this.props.list.top; let skip = this.props.list.skip; let newSkip = skip + top; this.props.onList(top, newSkip); this.props.onSetSkip(newSkip);

Primero calculo un nuevo skip y envío una acción asíncrona con este nuevo valor. Luego envío una acción syns, que actualiza el skip en estado.


Si está utilizando redux thunk , puede combinarlos fácilmente. Es un middleware que permite a los creadores de acciones devolver una función en lugar de una acción.

Su solución podría haber funcionado para usted ahora si no necesita encadenar a los creadores de acciones y solo necesita ejecutarlos a ambos.

this.props.onList(top, newSkip); this.props.onSetSkip(newSkip);

Si necesita encadenamiento (llamarlos de manera sincrónica) o esperar de los datos de la primera acción despachada, esto es lo que recomendaría.

export function onList(data) { return (dispatch) => { dispatch(ONLIST_REQUEST()); return (AsyncAPICall) .then((response) => { dispatch(ONLIST_SUCCESS(response.data)); }) .catch((err) => { console.log(err); }); }; } export function setSkip(data) { return (dispatch) => { dispatch(SETSKIP_REQUEST()); return (AsyncAPICall(data)) .then((response) => { dispatch(SETSKIP_SUCCESS(response.data)); }) .catch((err) => { console.log(err); }); }; } export function onListAndSetSkip(dataForOnList) { return (dispatch) => { dispatch(onList(dataForOnList)).then((dataAfterOnList) => { dispatch(setSkip(dataAfterOnList)); }); }; }


dispatch ({type: ''LIST.SUCCESS'', data: data, skip: el valor que desea después de la acción de sincronización });