{"id":160,"date":"2018-07-19T16:07:33","date_gmt":"2018-07-19T23:07:33","guid":{"rendered":"https:\/\/rosolutions.com.mx\/blog\/?p=160"},"modified":"2018-10-09T12:20:48","modified_gmt":"2018-10-09T19:20:48","slug":"consumir-api-con-react-redux","status":"publish","type":"post","link":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/","title":{"rendered":"Consumir API con React + Redux"},"content":{"rendered":"<p>En este tutorial aprenderemos a consumir una restfull\u00a0api en un proyecto con React y Redux.\u00a0 Crearemos una aplicaci\u00f3n para mostrar un listado de posts, ademas de poder agregar, modificar y eliminar posts.<\/p>\n<h3>\u00bfQu\u00e9 necesitamos para comenzar?<\/h3>\n<ul>\n<li>Conocer y saber utilizar ES6<\/li>\n<li>Conocimientos b\u00e1sicos de React<\/li>\n<li>Conocimiento b\u00e1sico de redux<\/li>\n<li>Node.js &gt;=v6 en tu computadora<\/li>\n<\/ul>\n<p>Partiremos de un repositorio que tiene ya una p\u00e1gina para mostrar posts y nosotros solo agregaremos la funcionalidad de consultar\u00a0 los posts desde la api de <a href=\"https:\/\/jsonplaceholder.typicode.com\/\"><em>jsonPlaceholder<\/em><\/a>. Para ello, vamos a clonar el repositorio.<\/p>\n<pre><span style=\"background-color: #fcfcfc; font-family: Inconsolata, monospace;\">$ <\/span><code>git clone https:\/\/github.com\/Clau8a\/redux-ejemplo.git nombre_proyecto<\/code><\/pre>\n<p>&nbsp;<\/p>\n<p>Una vez clonado el proyecto podemos correrlo para ver su funcionalidad.<\/p>\n<pre>$ npm run start<\/pre>\n<p>&nbsp;<\/p>\n<p>Ahora que tenemos nuestro repositorio analicemos un poco el ejemplo, estamos utilizando la vista App.js para desplegar los posts e interactuar con ellos, adem\u00e1s tenemos un archivo post.js que tiene las mec\u00e1nicas de comportamiento para un post. Los posts\u00a0est\u00e1n estructurados en formato json y tienen cuatro propiedades un userId, id, title, y body, por lo tanto esas propiedades utilizaremos para modificarlos.<\/p>\n<p>Lo que vamos a hacer es agregar un archivo para crear las funciones HTTP. Asi que, dentro de la carpeta\u00a0<em><code>src<\/code><\/em> creamos una carpeta llamada <em><code>lib<\/code><\/em>\u00a0 y dentro creamos un archivo con el nombre de <em><code>api.js.<\/code><\/em><\/p>\n<p>Para hacer llamadas utilizaremos la funci\u00f3n <em><code><a href=\"https:\/\/developer.mozilla.org\/es\/docs\/Web\/API\/Fetch_API\/Utilizando_Fetch\">fetch<\/a>.<\/code><\/em>\u00a0 \u00a0La funci\u00f3n fetch es una alternativa a\u00a0<a title=\"XMLHttpRequest es un objeto JavaScript que fue dise\u00f1ado por Microsoft y adoptado por Mozilla, Apple y Google. Actualmente es un est\u00e1ndar de la W3C. Proporciona una forma f\u00e1cil de obtener informaci\u00f3n de una URL sin tener que recargar la p\u00e1gina completa. Una p\u00e1gina web puede actualizar s\u00f3lo una parte de la p\u00e1gina sin interrumpir lo que el usuario est\u00e1\u00a0haciendo. XMLHttpRequest es ampliamente usado en la programaci\u00f3n AJAX.\" href=\"https:\/\/developer.mozilla.org\/es\/docs\/Web\/API\/XMLHttpRequest\"><code>XMLHttpRequest<\/code><\/a>,\u00a0 fetch regresa una promesa que no ser\u00e1 rechazada como error HTTP, en cambio \u00e9sta se resolver\u00e1,\u00a0 siempre y cuando no haya un fallo en la red.<\/p>\n<p>Enviaremos dos par\u00e1metros en la funci\u00f3n fetch, <em>url<\/em> y<em> request<\/em>. La variable <em>url<\/em> la formaremos con una base que es la url del servidor y le concatenaremos los par\u00e1metros necesarios para cada tipo de petici\u00f3n y en el <em>request<\/em> pondremos el m\u00e9todo HTTP, el body y los headers.<\/p>\n<p><span style=\"font-weight: 400;\">Como mencionamos anteriormente, utilizaremos\u00a0<a href=\"https:\/\/jsonplaceholder.typicode.com\/\">jsonPlaceholder <\/a><\/span>, que es una api gratuita para regresar datos en formato json, por lo tanto vamos a agregar una variable con la url del servidor:<\/p>\n<div>\n<pre><span style=\"color: #999999;\">\/\/variable url del servidor<\/span>\r\n<span style=\"color: #3366ff;\">const<\/span> BASEURL = <span style=\"color: #ff9900;\">\"https:\/\/jsonplaceholder.typicode.com\"<\/span>;\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>A continuaci\u00f3n tenemos un ejemplo de una funci\u00f3n para agregar un post, en ella recibimos un objeto como par\u00e1metro llamado <em>post <\/em>(este contiene las propiedades userId, id, title, y body)<em>,\u00a0<\/em>formamos la <em>url<\/em> concatenando <em>BASEURL<\/em>\u00a0(url del servidor) m\u00e1s la ruta a consultar, despu\u00e9s creamos el objeto <em>request<\/em> al cual le agregamos el m\u00e9todo HTTP POST, como <em>body<\/em> le mandamos el par\u00e1metro <em>post <\/em>y utilizamos <em>JSON.stringify()<\/em>\u00a0y especificamos que el contenido que mandaremos es tipo <em>json<\/em>, por \u00faltimo\u00a0 hacemos la petici\u00f3n con el <em>fetch<\/em> el cual nos regresar\u00e1 un objeto que transformaremos a json.<\/p>\n<\/div>\n<div>\n<pre><span style=\"color: #993366;\">export<\/span> <span style=\"color: #3366ff;\">const<\/span> <span style=\"color: #99cc00;\">apiAddPost<\/span> = (post) =&gt; {\r\n    <span style=\"color: #3366ff;\">const<\/span> url = BASEURL + \"\/posts\/\";\r\n    <span style=\"color: #3366ff;\">const<\/span> request = {\r\n        method:'POST',\r\n        body: JSON.stringify(post),\r\n        headers: {\"Content-type\":\"application\/json; charset=UTF-8\"}\r\n    };\r\n    <span style=\"color: #993366;\">return<\/span> <span style=\"color: #99cc00;\">fetch<\/span>(url, request)\r\n        .<span style=\"color: #99cc00;\">then<\/span>(response =&gt; response.json());\r\n};<\/pre>\n<\/div>\n<div>\n<p>&nbsp;<\/p>\n<p>Agregaremos lo siguiente a nuestro archivo <em>api.js <\/em>(archivo api.js completo)<\/p>\n<\/div>\n<p>[codepen_embed height=&#8221;265&#8243; theme_id=&#8221;dark&#8221; slug_hash=&#8221;djMJNm&#8221; default_tab=&#8221;js&#8221; user=&#8221;8aclau&#8221;]See the Pen &lt;a href=&#8217;https:\/\/codepen.io\/8aclau\/pen\/djMJNm\/&#8217;&gt;api.js&lt;\/a&gt; by Claudia (&lt;a href=&#8217;https:\/\/codepen.io\/8aclau&#8217;&gt;@8aclau&lt;\/a&gt;) on &lt;a href=&#8217;https:\/\/codepen.io&#8217;&gt;CodePen&lt;\/a&gt;.[\/codepen_embed]<\/p>\n<p>Ya tenemos nuestras peticiones listas ahora necesitamos comenzar con nuestros reducers. Por ello, agregaremos Redux.js a nuestro proyecto.<\/p>\n<pre>$ npm i redux<\/pre>\n<p>&nbsp;<\/p>\n<p>Agregaremos tambi\u00e9n react-redux para hacer nuestro enlazamiento de datos con las vistas.<\/p>\n<pre>$ npm i react-redux<\/pre>\n<p>&nbsp;<\/p>\n<p>Y agregamos tambi\u00e9n un middleware para facilitar el manejo del <em>dispatch<\/em> de <em>Redux<\/em><\/p>\n<pre>$ npm i redux-thunk<\/pre>\n<p>&nbsp;<\/p>\n<p>En la carpeta <em>src<\/em> agregamos una carpeta llamada\u00a0<em>reducers<\/em> y dentro de ella agregamos un archivo <em>postReducer.js. <\/em>En este archivo vamos a importar\u00a0las funciones del archivo api.js<\/p>\n<div>\n<pre><span style=\"color: #800080;\">import <\/span>{<span style=\"color: #00ccff;\">apiGetPost, apiAddPost, apiDeletePost, apiUpdatePost<\/span>} <span style=\"color: #800080;\">from<\/span> \r\n<span style=\"color: #ff9900;\">'..\/lib\/api'<\/span>;<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Despu\u00e9s vamos a agregar nuestro estado inicial en el cual solo tendremos una lista de posts<\/p>\n<div>\n<pre><span style=\"color: #3366ff;\">const<\/span> <span style=\"color: #00ccff;\">initialState<\/span> = {<span style=\"color: #00ccff;\">posts<\/span>: []};<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Agregamos los tipos de <em>actions<\/em> que ser\u00e1n cuatro y las <em>actions<\/em><\/p>\n<div>\n<pre><span style=\"color: #3366ff;\"><span style=\"color: #999999;\"><em>\/\/tipos de actions<\/em><\/span>\r\nconst<\/span> <span style=\"color: #00ccff;\">GET_POSTS<\/span> = <span style=\"color: #ff9900;\">'GET_POSTS'<\/span>;\r\n<span style=\"color: #3366ff;\">const<\/span> <span style=\"color: #00ccff;\">ADD_POST<\/span> = <span style=\"color: #ff9900;\">'ADD_POST'<\/span>;\r\n<span style=\"color: #3366ff;\">const<\/span> <span style=\"color: #00ccff;\">UPDATE_POST<\/span> = <span style=\"color: #ff9900;\">'UPDATE_POST'<\/span>;\r\n<span style=\"color: #3366ff;\">const<\/span> <span style=\"color: #00ccff;\">DELETE_POST<\/span> = <span style=\"color: #ff9900;\">'DELETE_POST'<\/span>;\r\n\r\n<span style=\"color: #999999;\"><em>\/\/actions<\/em><\/span>\r\n<span style=\"color: #0000ff;\">const <\/span><span style=\"color: #99cc00;\">getPosts <\/span>= (<span style=\"color: #00ccff;\">posts<\/span>) =&gt; ({<span style=\"color: #00ccff;\"> type: GET_POSTS, payload: posts<\/span> });\r\n<span style=\"color: #0000ff;\">const <\/span><span style=\"color: #99cc00;\">addPost<\/span> = (<span style=\"color: #00ccff;\">post<\/span>) =&gt; ({ <span style=\"color: #00ccff;\">type: ADD_POST, payload: post<\/span> });\r\n<span style=\"color: #0000ff;\">const <\/span><span style=\"color: #99cc00;\">updatePost<\/span> = (<span style=\"color: #00ccff;\">post<\/span>) =&gt; ({ <span style=\"color: #00ccff;\">type: UPDATE_POST, payload: post<\/span> });\r\n<span style=\"color: #0000ff;\">const <\/span><span style=\"color: #99cc00;\">deletePost<\/span> = (<span style=\"color: #00ccff;\">id<\/span>) =&gt; ({ <span style=\"color: #00ccff;\">type: DELETE_POST, payload: id<\/span> });<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Agregamos las funciones que utilizaremos en nuestras vistas para hacer las peticiones y que ser\u00e1n las responsables de desencadenar nuestras <em>actions.<\/em><\/p>\n<div>\n<pre><span style=\"color: #993366;\">export<\/span> <span style=\"color: #3366ff;\">const<\/span> <span style=\"color: #99cc00;\">fetchGetPost <\/span>= () =&gt; {\r\n<span style=\"color: #999999;\">\/\/redux-thunk nos permite mandar el dispatch como par\u00e1metro<\/span>\r\n    <span style=\"color: #993366;\">return<\/span> (<span style=\"color: #00ccff;\">dispatch<\/span>) =&gt; {\r\n    <span style=\"color: #999999;\">\/\/Llamamos a la funci\u00f3n de la api<\/span>\r\n        <span style=\"color: #99cc00;\">apiGetPost<\/span>()\r\n            .<span style=\"color: #99cc00;\">then<\/span>(<span style=\"color: #00ccff;\">res<\/span> =&gt; \r\n<span style=\"color: #999999;\">\/\/al reolverse la petici\u00f3n de manera correcta desencadenamos la acci\u00f3n\r\n\/\/ getPosts enviando los posts recibidos<\/span>\r\n                {<span style=\"color: #99cc00;\">dispatch<\/span>(<span style=\"color: #99cc00;\">getPosts<\/span>(<span style=\"color: #00ccff;\">res<\/span>));})\r\n            .<span style=\"color: #99cc00;\">catch<\/span>(<span style=\"color: #00ccff;\">res<\/span> =&gt; {console.log(res);})\r\n    }\r\n};<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Agregamos la funci\u00f3n para hacer las modificaciones en el <em>store<\/em>, la cual debe ser una funci\u00f3n pura, que pueda exportarse y que considere todos los tipos de acciones.<\/p>\n<blockquote>\n<h3><span style=\"font-weight: 400;\">\u00bfQu\u00e9 es una funci\u00f3n pura?<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Uno de los principios de Redux es realizar cambios mediante el uso de funciones puras.\u00a0Una funci\u00f3n pura\u00a0 es una funci\u00f3n que regresa un valor que es procesado basado en sus argumentos. Las funciones puras toman al menos un argumento y siempre regresan un valor. Otra de las caracter\u00edsticas de las funciones puras es que no alteran variables globales\u00a0 o cambian alg\u00fan elemento del estado de la aplicaci\u00f3n.<\/span><\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<div>\n<pre><span style=\"color: #993366;\">export<\/span> <span style=\"color: #993366;\">default<\/span> (state = initialState, action) =&gt; {\r\n<span style=\"color: #993366;\">  switch<\/span> (action.type) {\r\n    <span style=\"color: #993366;\">case<\/span> GET_POSTS:\r\n      <span style=\"color: #993366;\">return<\/span> { ...state, posts:action.payload };\r\n    <span style=\"color: #993366;\">case<\/span> ADD_POST:\r\n      <span style=\"color: #993366;\">return<\/span> {...state,\r\n        posts: [action.payload, ...state.posts]};\r\n    <span style=\"color: #993366;\">case<\/span> UPDATE_POST:\r\n      <span style=\"color: #993366;\">return<\/span> {...state,\r\n        posts: [...state.posts.<span style=\"color: #99cc00;\">map<\/span>((post) =&gt; post.id === action.payload.id ?\r\n               action.payload:post)]}\r\n    <span style=\"color: #993366;\">case<\/span> DELETE_POST:\r\n      <span style=\"color: #993366;\">return<\/span> {...state,\r\n        post: [...<span style=\"color: #00ccff;\">state<span style=\"color: #000000;\">.<\/span>posts<span style=\"color: #000000;\">.<\/span><span style=\"color: #99cc00;\">filter<\/span><\/span>(elem=&gt;elem.id!==action.payload)]}\r\n    <span style=\"color: #993366;\">default<\/span>:\r\n      <span style=\"color: #993366;\">return<\/span> { ...state };}\r\n}\r\n\r\n<\/pre>\n<\/div>\n<div><\/div>\n<div><\/div>\n<div>A continuaci\u00f3n tenemos el archivo completo<\/div>\n<div><\/div>\n<div>[codepen_embed height=&#8221;265&#8243; theme_id=&#8221;dark&#8221; slug_hash=&#8221;KBMWxd&#8221; default_tab=&#8221;js&#8221; user=&#8221;8aclau&#8221;]See the Pen &lt;a href=&#8217;https:\/\/codepen.io\/8aclau\/pen\/KBMWxd\/&#8217;&gt;postReducer.js&lt;\/a&gt; by Claudia (&lt;a href=&#8217;https:\/\/codepen.io\/8aclau&#8217;&gt;@8aclau&lt;\/a&gt;) on &lt;a href=&#8217;https:\/\/codepen.io&#8217;&gt;CodePen&lt;\/a&gt;.[\/codepen_embed]<\/div>\n<div><\/div>\n<div><\/div>\n<div>Ya hemos creado nuestro <em>reducer<\/em> ahora necesitamos\u00a0 crear nuestro <em>store<\/em>, asi que dentro de la carpeta <em>reducers<\/em> agregamos un archivo llamado <em>store.js <\/em>y dentro del archivo vamos a hacer un <em>main reducer<\/em> y utilizar las funciones <em>createStore<\/em> y <em>applyMiddleware<\/em> para utilizar <em>redux-thunk<\/em><\/div>\n<div><\/div>\n<div>\n<div>\n<pre><span style=\"color: #993366;\"><span style=\"color: #999999;\">\/\/importamos las funciones de redux<\/span>\r\nimport<\/span> { <span style=\"color: #99cc00;\">createStore<\/span>, <span style=\"color: #99cc00;\">applyMiddleware<\/span>, <span style=\"color: #99cc00;\">combineReducers<\/span> } <span style=\"color: #993366;\">from<\/span> 'redux';\r\n<span style=\"color: #993366;\">import<\/span> <span style=\"color: #99cc00;\">thunk<\/span> <span style=\"color: #993366;\">from<\/span> 'redux-thunk';\r\n\r\n<span style=\"color: #999999;\">\/\/importamos nuestro reducer<\/span>\r\n<span style=\"color: #993366;\">import<\/span> <span style=\"color: #99cc00;\">postsReducer<\/span> <span style=\"color: #993366;\">from<\/span> '.\/postsReducer';\r\n\r\n<span style=\"color: #999999;\">\/\/creamos un reducer principal que combina todos los reducer que realicemos<\/span>\r\n<span style=\"color: #999999;\">\/\/en este caso solo tenemos un reducer<\/span>\r\n<span style=\"color: #3366ff;\">const<\/span> <span style=\"color: #00ccff;\">mainReducer <\/span>= <span style=\"color: #99cc00;\">combineReducers<\/span>({posts:postsReducer});\r\n\r\n<span style=\"color: #999999;\">\/\/creamos el store especificando que utilizamos thunk <\/span>\r\n<span style=\"color: #993366;\">export<\/span> <span style=\"color: #993366;\">default<\/span> <span style=\"color: #99cc00;\">createStore<\/span>(mainReducer,<span style=\"color: #99cc00;\">applyMiddleware<\/span>(thunk));<\/pre>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Es momento de agregar el <em>store<\/em> a nuestra aplicaci\u00f3n para ello es necesario modifica nuestro <em>index.js<\/em>. Primero agregaremos <em>provider<\/em> y el<em> store<\/em><\/p>\n<div>\n<pre><span style=\"color: #993366;\">import<\/span> { Provider } <span style=\"color: #993366;\">from<\/span> 'react-redux';\r\n<span style=\"color: #993366;\">import<\/span> store <span style=\"color: #993366;\">from<\/span> '.\/reducers\/store';<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Modificamos el <em>render<\/em> para asignar el <em>store<\/em><\/p>\n<div>\n<pre><span style=\"color: #3366ff;\">ReactDOM<\/span>.<span style=\"color: #99cc00;\">render<\/span>(\r\n  &lt;<span style=\"color: #339966;\">Provider <span style=\"color: #3366ff;\">store<\/span><\/span>={<span style=\"color: #3366ff;\">store<\/span>}&gt;\r\n    &lt;<span style=\"color: #339966;\">App<\/span>\/&gt;\r\n  &lt;\/<span style=\"color: #339966;\">Provider<\/span>&gt;,\r\n  <span style=\"color: #3366ff;\">document<\/span>.<span style=\"color: #99cc00;\">getElementById<\/span>(<span style=\"color: #ff9900;\">'root'<\/span>)\r\n);<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Ya es hora de hacer modificaciones a la vista para hacer uso de nuestro <em>reducer<\/em>. Para conectar nuestra vista con el <em>reducer\u00a0<\/em> primero debemos agregar una librer\u00eda que nos permita hacerlo.<\/p>\n<pre>$ npm i react-redux<\/pre>\n<p>&nbsp;<\/p>\n<p>Ahora en el archivo <em>App.js<\/em> vamos a importar <em>connect <\/em>y\u00a0tambi\u00e9n las funciones del postReducer.js.<\/p>\n<div>\n<pre><span style=\"color: #993366;\">import<\/span> { connect } <span style=\"color: #993366;\">from<\/span> <span style=\"color: #ff9900;\">'react-redux'<\/span>;\r\n<span style=\"color: #993366;\">import<\/span> { fetchGetPost, fetchAddPost, fetchUpdatePost, fetchDeletePost } <span style=\"color: #993366;\">from\r\n<\/span> <span style=\"color: #ff9900;\">'.\/reducers\/postsReducer'<\/span>;<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Eliminamos el arreglo <em>posts<\/em> y modificamos el <em>export default<\/em> de <em>app.js<\/em> para hacer uso de <em>connect<\/em>, vamos a agregar dos par\u00e1metros a <em>connect<\/em>, el primero ser\u00e1 una funci\u00f3n que mapear\u00e1 las propiedades del <em>state<\/em>\u00a0de <em>redux<\/em> a las cuales queremos tener acceso y las insertaremos como propiedades para el componente y en el segundo par\u00e1metro haremos un mapeo de las funciones que har\u00e1n modificaciones al <em>state<\/em>.<\/p>\n<div>\n<pre><span style=\"color: #993366;\">export<\/span> <span style=\"color: #993366;\">default<\/span> <span style=\"color: #99cc00;\">connect<\/span>(\r\n<span style=\"color: #999999;\">\/\/funci\u00f3n que mapea propiedades del state con propiedades del componente<\/span>\r\n(<span style=\"color: #3366ff;\">state<\/span>) =&gt; ({<span style=\"color: #3366ff;\">posts:state<\/span>.<span style=\"color: #3366ff;\">posts<\/span>.<span style=\"color: #3366ff;\">posts<\/span>,}),\r\n<span style=\"color: #999999;\">\/\/mapeo de funciones<\/span>\r\n{<span style=\"color: #3366ff;\">fetchGetPost<\/span>, <span style=\"color: #3366ff;\">fetchAddPost<\/span>, <span style=\"color: #3366ff;\">fetchUpdatePost<\/span>, <span style=\"color: #3366ff;\">fetchDeletePost<\/span>})\r\n(<span style=\"color: #3366ff;\">App<\/span>);\r\n\r\n<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>El patr\u00f3n que se sigue en la funci\u00f3n donde mapeamos las propiedades del <em>state<\/em>\u00a0es el siguiente<\/p>\n<pre><span style=\"color: #999999;\">(<span style=\"color: #3366ff;\">state<\/span>) =&gt; ({<span style=\"color: #3366ff;\">nombre_propiedad<\/span>: <span style=\"color: #3366ff;\">state<\/span>.<span style=\"color: #3366ff;\">nombre_reducer<\/span>.<span style=\"color: #3366ff;\">propiedad<\/span>})<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p>Para hacer uso de la propiedad <em>posts<\/em> vamos agregar una variable en el render de App justo antes de comenzar el <em>return<\/em><\/p>\n<div>\n<pre><span style=\"color: #3366ff;\">const<\/span> <span style=\"color: #00ccff;\">posts<\/span> = <span style=\"color: #3366ff;\">this<\/span>.<span style=\"color: #00ccff;\">props<\/span>.<span style=\"color: #00ccff;\">posts<\/span>;<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>El \u00faltimo paso para poder correr nuestra aplicaci\u00f3n es hacer la consulta de <em>posts<\/em>, para ello agregaremos el m\u00e9todo <em>componentDidMount<\/em> y desde ah\u00ed haremos la consulta.<\/p>\n<pre><span style=\"color: #99cc00;\">componentDidMount<\/span>(){<span style=\"color: #3366ff;\">this<\/span>.<span style=\"color: #00ccff;\">props<\/span>.<span style=\"color: #99cc00;\">fetchGetPost<\/span>();}<\/pre>\n<p>&nbsp;<\/p>\n<p>Ahora correremos nuestra aplicaci\u00f3n con<\/p>\n<pre>$ npm run start<\/pre>\n<p>&nbsp;<\/p>\n<p>Y ya estamos consumiendo una api !<\/p>\n<p>Bien ahora solo nos faltan tres interacciones, continuemos con editar alg\u00fan post existente para ello vamos a mandar una propiedad en el componente <em>&lt;Post\u00a0 \/&gt;,\u00a0<\/em>llamaremos a la propiedad\u00a0 <em>update<\/em> y le asignaremos como valor la funci\u00f3n del reducer para hacer un <em>update<\/em>, quedando de la siguiente manera<\/p>\n<div>\n<pre>&lt;<span style=\"color: #99cc00;\">Post<\/span> {...<span style=\"color: #3366ff;\">post<\/span>} update={<span style=\"color: #3366ff;\">this<\/span>.<span style=\"color: #3366ff;\">props<\/span>.<span style=\"color: #99cc00;\">fetchUpdatePost<\/span>} \/&gt;<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Ahora modificaremos el archivo post.js, en el metodo <em>handleSave <\/em>cambiaremos su funcionalidad, haremos desde ah\u00ed la actualizaci\u00f3n, haciendo uso de la propiedad <em>update. <\/em>El m\u00e9todo<em> handleSave <\/em>nos queda de la siguiente manera<\/p>\n<div>\n<pre><span style=\"color: #99cc00;\">handleSave<\/span>() {\r\n  <span style=\"color: #3366ff;\">this<\/span>.<span style=\"color: #00ccff;\">props<\/span>.<span style=\"color: #99cc00;\">update<\/span>(<span style=\"color: #3366ff;\">this<\/span>.<span style=\"color: #00ccff;\">props<\/span>.<span style=\"color: #00ccff;\">id<\/span>,       \r\n  {\r\n     <span style=\"color: #00ccff;\">title<\/span>: <span style=\"color: #3366ff;\">this<\/span>.<span style=\"color: #00ccff;\">state<\/span>.<span style=\"color: #00ccff;\">title<\/span>,\r\n     <span style=\"color: #00ccff;\">body<\/span>: <span style=\"color: #3366ff;\">this<\/span>.<span style=\"color: #00ccff;\">state<\/span>.<span style=\"color: #00ccff;\">body<\/span>\r\n  })\r\n  <span style=\"color: #3366ff;\">this<\/span>.<span style=\"color: #99cc00;\">setState<\/span>({ <span style=\"color: #00ccff;\">editing<\/span>: <span style=\"color: #3366ff;\">false<\/span> })\r\n}<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Y con esto ahora podemos editar posts en la api.<\/p>\n<p>Ahora vamos a eliminar post, haremos algo similar, agregaremos una propiedad <em>delete<\/em> en el elemento <em>&lt;Post \/&gt;\u00a0<\/em>y le asignamos<em> fetchDeletePost, <\/em>y nos queda de esta manera<\/p>\n<div>\n<pre>&lt;<span style=\"color: #339966;\">Post <\/span>{...post} \r\n<span style=\"color: #000000;\">update<\/span>={<span style=\"color: #3366ff;\">this<\/span>.<span style=\"color: #3366ff;\">props<\/span>.<span style=\"color: #99cc00;\">fetchUpdatePost<\/span>} \r\n<span style=\"color: #000000;\">delete<\/span>={<span style=\"color: #3366ff;\">this<\/span>.<span style=\"color: #3366ff;\">props<\/span>.<span style=\"color: #99cc00;\">fetchDeletePost<\/span>} \/&gt;<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Regresamos a post.js y eliminaremos la propiedad delete del state para no agregar la clase <em>hide\u00a0\u00a0<\/em>a los post eliminados, en su lugar los eliminaremos desde la api, y nos quedaria de esta manera<\/p>\n<div>\n<pre>&lt;<span style=\"color: #3366ff;\">div<\/span> <span style=\"color: #00ccff;\">className<\/span>={<span style=\"color: #ff9900;\">\"col-xs-12 post \"<\/span> + (<span style=\"color: #3366ff;\">this<\/span>.<span style=\"color: #00ccff;\">state<\/span>.<span style=\"color: #00ccff;\">deleted<\/span> ? <span style=\"color: #ff9900;\">\" hide\"<\/span> : <span style=\"color: #ff9900;\">\"\"<\/span>)}&gt;\r\n&lt;<span style=\"color: #3366ff;\">div<\/span> <span style=\"color: #00ccff;\">className<\/span>=<span style=\"color: #ff9900;\">\"col-xs-12 post\"<\/span>&gt;<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Modificamos ahora <em>handleDelete\u00a0<\/em><\/p>\n<div>\n<pre><span style=\"color: #99cc00;\">handleDelete<\/span>() {<span style=\"color: #3366ff;\">this<\/span>.props.<span style=\"color: #99cc00;\">delete<\/span>(<span style=\"color: #3366ff;\">this<\/span>.props.id);}\r\n\r\n<\/pre>\n<\/div>\n<p>Y es as\u00ed como ahora se est\u00e1n eliminando nuestros posts al hacer click en el bot\u00f3n de eliminar, recuerda que esta es una aplicaci\u00f3n de ejemplo jsonPlaceHolder no elimina o modifica en su servidor los posts realmente por lo tanto si haces un refresh a la p\u00e1gina los posts que eliminaste o modificaste volver\u00e1n a su estado original.<\/p>\n<p>Ya casi terminamos, ahora solo nos falta poder agregar posts nuevos y no tenemos una interfaz donde agregarlos as\u00ed que vamos a agregar el siguiente formulario en App.js antes del listado de posts<\/p>\n<div>\n<pre><span style=\"color: #999999;\">&lt;div className=\"App-intro\"&gt;\r\n<\/span>\r\n\r\n&lt;<span style=\"color: #3366ff;\">div<\/span> className=<span style=\"color: #ff6600;\">\"col-xs-12\"<\/span>&gt;\r\n  &lt;<span style=\"color: #3366ff;\">h2<\/span>&gt;Agregar Post&lt;\/<span style=\"color: #3366ff;\">h2<\/span>&gt;\r\n  &lt;<span style=\"color: #3366ff;\">form<\/span> onSubmit={<span style=\"color: #3366ff;\">this<\/span>.handleAdd.bind(<span style=\"color: #3366ff;\">this<\/span>)}&gt;\r\n\r\n    &lt;<span style=\"color: #3366ff;\">input<\/span> name=<span style=\"color: #ff6600;\">\"title\"<\/span> placeholder=<span style=\"color: #ff6600;\">\"T\u00edtulo\"<\/span> className=<span style=\"color: #ff6600;\">\"form-control\"<\/span> \r\n      value={<span style=\"color: #3366ff;\">this<\/span>.state.title} onChange={<span style=\"color: #3366ff;\">this<\/span>.hanldeChange.bind(<span style=\"color: #3366ff;\">this<\/span>)}\/&gt;\r\n\r\n    &lt;<span style=\"color: #3366ff;\">textarea<\/span> name=<span style=\"color: #ff6600;\">\"body\"<\/span> placeholder=<span style=\"color: #ff6600;\">\"Contenido\"<\/span> className=<span style=\"color: #ff6600;\">\"form-control\"<\/span>\r\n      onChange={<span style=\"color: #3366ff;\">this<\/span>.hanldeChange.bind(<span style=\"color: #3366ff;\">this<\/span>)} value={<span style=\"color: #3366ff;\">this<\/span>.state.body} \/&gt;\r\n\r\n     &lt;<span style=\"color: #3366ff;\">div<\/span> className=<span style=\"color: #ff6600;\">\"col-xs-12 button tar\"<\/span>&gt;\r\n        &lt;<span style=\"color: #3366ff;\">button<\/span> className=<span style=\"color: #ff6600;\">\"btn btn-success\"<\/span> type=<span style=\"color: #ff6600;\">\"submit\"<\/span>&gt;Agregar&lt;\/<span style=\"color: #3366ff;\">button<\/span>&gt;\r\n     &lt;\/<span style=\"color: #3366ff;\">div<\/span>&gt;\r\n  &lt;\/<span style=\"color: #3366ff;\">form<\/span>&gt;\r\n&lt;\/<span style=\"color: #3366ff;\">div<\/span>&gt;\r\n\r\n\r\n<span style=\"color: #999999;\">&lt;h2&gt;Posts&lt;\/h2&gt;\r\n\r\n<\/span><\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Necesitamos agregar al componente App un <em>state<\/em> para agregar el <em>title<\/em> y el <em>body<\/em>, adem\u00e1s de un <em>handleChange<\/em> para manejar estas propiedades.<\/p>\n<div>\n<pre><span style=\"color: #3366ff;\">constructor<\/span>(props) {\r\n<span style=\"color: #3366ff;\">  super<\/span>(props);\r\n  <span style=\"color: #3366ff;\">this<\/span>.state= {title:<span style=\"color: #ff6600;\">''<\/span>,body:<span style=\"color: #ff6600;\">''<\/span>}\r\n}\r\n\r\n<span style=\"color: #99cc00;\">hanldeChange<\/span>(event) {\r\n<span style=\"color: #3366ff;\">  let<\/span> name=event.target.name;\r\n<span style=\"color: #3366ff;\">  let<\/span> value=event.target.value;\r\n<span style=\"color: #3366ff;\">  this<\/span>.setState({ [<span style=\"color: #ff6600;\">`<\/span><span style=\"color: #3366ff;\">${<\/span>name<span style=\"color: #3366ff;\">}<\/span><span style=\"color: #ff6600;\">`<\/span>]:value });\r\n}\r\n\r\n<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>Adem\u00e1s\u00a0 en el form agregamos una propiedad <em>onSubmit<\/em> que ejecuta la funci\u00f3n <em>handleAdd<\/em>, as\u00ed que hay que definirla.<\/p>\n<div>\n<pre><span style=\"color: #99cc00;\">handleAdd<\/span>(event){\r\n event.<span style=\"color: #99cc00;\">preventDefault<\/span>();\r\n <span style=\"color: #3366ff;\">this<\/span>.props.<span style=\"color: #99cc00;\">fetchAddPost<\/span>({\r\n    title: <span style=\"color: #3366ff;\">this<\/span>.state.title,\r\n    body: <span style=\"color: #3366ff;\">this<\/span>.state.body,\r\n    userId: 1});\r\n  this.<span style=\"color: #99cc00;\">setState<\/span>({ title:<span style=\"color: #ff6600;\">''<\/span>, body:<span style=\"color: #ff6600;\">''<\/span> });\r\n};\r\n\r\n<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p>De esta manera ya podemos agregar posts en nuestra aplicaci\u00f3n y estos se agregaran al inicio de la lista.<\/p>\n<p>\u00a1Eureka! Hemos terminado.<\/p>\n<hr \/>\n<p>Si quieres ver el c\u00f3digo completo puedes verlo en la rama <em>solution <\/em><\/p>\n<pre>$ git checkout solution<\/pre>\n<p>&nbsp;<\/p>\n<p>Si quieres aprender m\u00e1s sobre <em>redux<\/em>, <em>fetch<\/em> o <em>connect<\/em> te dejo los siguientes links:<\/p>\n<ul>\n<li><span style=\"color: #808080;\"><em><a style=\"color: #808080;\" href=\"https:\/\/developer.mozilla.org\/es\/docs\/Web\/API\/Fetch_API\">fetch<\/a><\/em><\/span><\/li>\n<li><a href=\"https:\/\/es.redux.js.org\/\"><span style=\"color: #808080;\"><em>Redux<\/em><\/span><\/a><\/li>\n<li><span style=\"color: #808080;\"><em><a style=\"color: #808080;\" href=\"https:\/\/github.com\/reduxjs\/redux-thunk\">Redux-tunk<\/a><\/em><\/span><\/li>\n<li><span style=\"color: #808080;\"><em><a style=\"color: #808080;\" href=\"https:\/\/www.sohamkamani.com\/blog\/2017\/03\/31\/react-redux-connect-explained\/\">React-redux &#8220;connect&#8221; explained<\/a><\/em><\/span><\/li>\n<li><span style=\"color: #808080;\"><em><a style=\"color: #808080;\" href=\"https:\/\/github.com\/typicode\/jsonplaceholder\">jsonPlaceholder<\/a><\/em><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este tutorial aprenderemos a consumir una restfull\u00a0api en un proyecto con React y Redux.\u00a0 Crearemos una aplicaci\u00f3n para mostrar un listado de posts, ademas de poder agregar, modificar y eliminar posts. \u00bfQu\u00e9 necesitamos para comenzar? Conocer y saber utilizar ES6 Conocimientos b\u00e1sicos de React Conocimiento b\u00e1sico de redux Node.js &gt;=v6 en tu computadora Partiremos [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":175,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,34],"tags":[],"class_list":["post-160","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollo-de-software-a-la-medida","category-software"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Consumir API con React + Redux &#8212; Desarrollo de software &#8212; Developers<\/title>\n<meta name=\"description\" content=\"Expertos en Desarrollo de Software, Aplicaci\u00f3nes M\u00f3viles, Sistemas Web, SEO, Marketing y Dise\u00f1o Web. Consumir API con React + Redux\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Consumir API con React + Redux &#8212; Desarrollo de software &#8212; Developers\" \/>\n<meta property=\"og:description\" content=\"Expertos en Desarrollo de Software, Aplicaci\u00f3nes M\u00f3viles, Sistemas Web, SEO, Marketing y Dise\u00f1o Web. Consumir API con React + Redux\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/\" \/>\n<meta property=\"og:site_name\" content=\"Desarrollo de software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/rosolutionsmx\/\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-19T23:07:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-10-09T19:20:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/07\/react-redux.png\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"402\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Claudia Andrade\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ROSolutionsmx\" \/>\n<meta name=\"twitter:site\" content=\"@ROSolutionsmx\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Claudia Andrade\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/\"},\"author\":{\"name\":\"Claudia Andrade\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/person\/8e86e8eb7b36db154ca8510a591ce149\"},\"headline\":\"Consumir API con React + Redux\",\"datePublished\":\"2018-07-19T23:07:33+00:00\",\"dateModified\":\"2018-10-09T19:20:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/\"},\"wordCount\":1480,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/07\/react-redux.png\",\"articleSection\":[\"Programaci\u00f3n\",\"Software\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/\",\"url\":\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/\",\"name\":\"Consumir API con React + Redux &#8212; Desarrollo de software &#8212; Developers\",\"isPartOf\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/07\/react-redux.png\",\"datePublished\":\"2018-07-19T23:07:33+00:00\",\"dateModified\":\"2018-10-09T19:20:48+00:00\",\"description\":\"Expertos en Desarrollo de Software, Aplicaci\u00f3nes M\u00f3viles, Sistemas Web, SEO, Marketing y Dise\u00f1o Web. Consumir API con React + Redux\",\"breadcrumb\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#primaryimage\",\"url\":\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/07\/react-redux.png\",\"contentUrl\":\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/07\/react-redux.png\",\"width\":800,\"height\":402,\"caption\":\"logo de redux y react\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\/\/rosolutions.com.mx\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Consumir API con React + Redux\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#website\",\"url\":\"https:\/\/rosolutions.com.mx\/blog\/\",\"name\":\"Desarrollo de software\",\"description\":\"Blog de RO Solutions\",\"publisher\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/rosolutions.com.mx\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#organization\",\"name\":\"RO Solutions\",\"url\":\"https:\/\/rosolutions.com.mx\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/03\/icono-01-2.png\",\"contentUrl\":\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/03\/icono-01-2.png\",\"width\":350,\"height\":346,\"caption\":\"RO Solutions\"},\"image\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/rosolutionsmx\/\",\"https:\/\/x.com\/ROSolutionsmx\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/person\/8e86e8eb7b36db154ca8510a591ce149\",\"name\":\"Claudia Andrade\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/f70dcaf70e268482bb8b6603dec6b3210a6934ff1ab771273c60a00d7559860d?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f70dcaf70e268482bb8b6603dec6b3210a6934ff1ab771273c60a00d7559860d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f70dcaf70e268482bb8b6603dec6b3210a6934ff1ab771273c60a00d7559860d?s=96&d=mm&r=g\",\"caption\":\"Claudia Andrade\"},\"sameAs\":[\"http:\/\/rosolutions.com.mx\"],\"url\":\"https:\/\/rosolutions.com.mx\/blog\/author\/8aclau\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Consumir API con React + Redux &#8212; Desarrollo de software &#8212; Developers","description":"Expertos en Desarrollo de Software, Aplicaci\u00f3nes M\u00f3viles, Sistemas Web, SEO, Marketing y Dise\u00f1o Web. Consumir API con React + Redux","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/","og_locale":"es_MX","og_type":"article","og_title":"Consumir API con React + Redux &#8212; Desarrollo de software &#8212; Developers","og_description":"Expertos en Desarrollo de Software, Aplicaci\u00f3nes M\u00f3viles, Sistemas Web, SEO, Marketing y Dise\u00f1o Web. Consumir API con React + Redux","og_url":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/","og_site_name":"Desarrollo de software","article_publisher":"https:\/\/www.facebook.com\/rosolutionsmx\/","article_published_time":"2018-07-19T23:07:33+00:00","article_modified_time":"2018-10-09T19:20:48+00:00","og_image":[{"width":800,"height":402,"url":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/07\/react-redux.png","type":"image\/png"}],"author":"Claudia Andrade","twitter_card":"summary_large_image","twitter_creator":"@ROSolutionsmx","twitter_site":"@ROSolutionsmx","twitter_misc":{"Escrito por":"Claudia Andrade","Tiempo de lectura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#article","isPartOf":{"@id":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/"},"author":{"name":"Claudia Andrade","@id":"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/person\/8e86e8eb7b36db154ca8510a591ce149"},"headline":"Consumir API con React + Redux","datePublished":"2018-07-19T23:07:33+00:00","dateModified":"2018-10-09T19:20:48+00:00","mainEntityOfPage":{"@id":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/"},"wordCount":1480,"commentCount":3,"publisher":{"@id":"https:\/\/rosolutions.com.mx\/blog\/#organization"},"image":{"@id":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#primaryimage"},"thumbnailUrl":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/07\/react-redux.png","articleSection":["Programaci\u00f3n","Software"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/","url":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/","name":"Consumir API con React + Redux &#8212; Desarrollo de software &#8212; Developers","isPartOf":{"@id":"https:\/\/rosolutions.com.mx\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#primaryimage"},"image":{"@id":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#primaryimage"},"thumbnailUrl":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/07\/react-redux.png","datePublished":"2018-07-19T23:07:33+00:00","dateModified":"2018-10-09T19:20:48+00:00","description":"Expertos en Desarrollo de Software, Aplicaci\u00f3nes M\u00f3viles, Sistemas Web, SEO, Marketing y Dise\u00f1o Web. Consumir API con React + Redux","breadcrumb":{"@id":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#primaryimage","url":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/07\/react-redux.png","contentUrl":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/07\/react-redux.png","width":800,"height":402,"caption":"logo de redux y react"},{"@type":"BreadcrumbList","@id":"https:\/\/rosolutions.com.mx\/blog\/consumir-api-con-react-redux\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Inicio","item":"https:\/\/rosolutions.com.mx\/blog\/"},{"@type":"ListItem","position":2,"name":"Consumir API con React + Redux"}]},{"@type":"WebSite","@id":"https:\/\/rosolutions.com.mx\/blog\/#website","url":"https:\/\/rosolutions.com.mx\/blog\/","name":"Desarrollo de software","description":"Blog de RO Solutions","publisher":{"@id":"https:\/\/rosolutions.com.mx\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rosolutions.com.mx\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/rosolutions.com.mx\/blog\/#organization","name":"RO Solutions","url":"https:\/\/rosolutions.com.mx\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/03\/icono-01-2.png","contentUrl":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/03\/icono-01-2.png","width":350,"height":346,"caption":"RO Solutions"},"image":{"@id":"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/rosolutionsmx\/","https:\/\/x.com\/ROSolutionsmx"]},{"@type":"Person","@id":"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/person\/8e86e8eb7b36db154ca8510a591ce149","name":"Claudia Andrade","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/f70dcaf70e268482bb8b6603dec6b3210a6934ff1ab771273c60a00d7559860d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f70dcaf70e268482bb8b6603dec6b3210a6934ff1ab771273c60a00d7559860d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f70dcaf70e268482bb8b6603dec6b3210a6934ff1ab771273c60a00d7559860d?s=96&d=mm&r=g","caption":"Claudia Andrade"},"sameAs":["http:\/\/rosolutions.com.mx"],"url":"https:\/\/rosolutions.com.mx\/blog\/author\/8aclau\/"}]}},"_links":{"self":[{"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/posts\/160","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=160"}],"version-history":[{"count":14,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/posts\/160\/revisions"}],"predecessor-version":[{"id":176,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/posts\/160\/revisions\/176"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/media\/175"}],"wp:attachment":[{"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}