redux - objetos - metodos en javascript
Las acciones deben ser simples objetos javascript (3)
A continuación está el código para mi creador de acciones:
export function fetchPosts()
{
const request = axios.get(`${ROOT_URL}/posts${API_KEY}`);
return
{
type: FETCH_POSTS;
payload: request
};
}
Junto a escribir: FETCH_POSTS, si agrego, en lugar de; recibo el error Token inesperado. ¿Es esa la sintaxis para los creadores de acción?
Entonces si lo reemplazo, con; al compilar, obtengo el error ''Las acciones deben ser simples objetos JavaScript.
¿Alguna idea de por qué?
Cuando reemplazas , con ; Obtiene un error porque, como lo indica su mensaje de error, una acción debe devolver un objeto JavaScript.
En JavaScript, las propiedades de los objetos deben estar separadas por , como:
return
{
type: FETCH_POSTS, // use comma here
payload: request
};
De esta forma, la declaración de retorno devolverá un nuevo objeto con dos propiedades type y payload .
La respuesta de GibboK ya ha señalado el error de sintaxis.
Sin embargo, no creo que entiendas el uso correcto de las acciones. Tu corres:
const request = axios.get(`${ROOT_URL}/posts${API_KEY}`);
Esto está creando una promesa. Actualmente estás devolviendo esto en una acción. Los reductores están destinados a ser deterministas y libres de efectos secundarios, por lo tanto, las acciones deben ser simples objetos JS. No deberías enviar una promesa.
En su lugar, debe utilizar algún middleware relevante, por ejemplo, redux-thunk , redux-saga u otra cosa. Debe enviar una acción cuando la promesa real se haya resuelto.
Como un simple ejemplo artificial, usando redux-thunk :
export const fetchPosts = () => (dispatch) => {
// Send action to notify request started. Reducers often want to
// update the state to record that a request is pending, e.g. for
// UI purposes.
dispatch({type: FETCH_POSTS_START});
// Start request
request = axios.get(`${ROOT_URL}/posts${API_KEY}`)
.then(res => {
// Successfully received posts, submit response data
dispatch({type: FETCH_POSTS_COMPLETE, payload: res.data})
})
.catch(err => {
// API call failed, submit error
dispatch({type: FETCH_POSTS_ERROR, payload: err})
});
};
Tenga en cuenta que este código es solo un ejemplo y no necesariamente adecuado para su uso en un sistema de producción.
Según la documentación redux :
Actionsson objetos simples de JavaScript. Las acciones deben tener unatype propertyque indique el tipo de acción que se realiza. Los tipos normalmente se deben definir comostring constants. Una vez que su aplicación es lo suficientemente grande, es posible que desee moverlos a un módulo separado.
Y creadores de acción
Los creadores de acciones son funciones que crean acciones
En los creadores de acciones de Redux simplemente devuelven una acción:
function addTodo(text) { return { type: ADD_TODO, text } }
Entonces, cuando llame al action creator desde su componente a través del dispatch su creador de acciones solo tiene que devolver un objeto JavaScript simple.
Entonces, un creador de acción normal será
export function fetchPosts()
{
return
{
type: FETCH_POSTS;
payload: "somevalue"
};
}
Ahora, si desea llamar a las API dentro de sus creadores de acción, necesita hacer uso de middlewares como redux-thunk o redux-saga mientras crea una tienda
me gusta
import thunk from ''redux-thunk'';
const store = createStore(reducers, applyMiddleware(thunk));
Usted configura su tienda con middleware puede modificar sus acciones a
export function fetchPosts() {
return (dispatch) => {
axios.get(`${ROOT_URL}/posts${API_KEY}`)
.then((response)=> {
dispatch( {
type: FETCH_POSTS,
payload: request
})
})
}
}
Según la documentación redux-thunk
¿Por qué necesitas redux-thunk?
Redux Thunk middlewarepermite escribir creadores de acciones que devuelven una función en lugar de una acción. El thunk se puede utilizar para retrasar eldispatchde una acción, o paradispatchsolo si se cumple una determinada condición. La función interna recibe eldispatch and getStatemétodos de la tiendadispatch and getStatecomoparameters.