Recientemente me mudé de Angular a ReactJs. Estoy usando jQuery para llamadas API. Tengo una API que devuelve una lista de usuarios aleatorios que se imprimirá en una lista.
No estoy seguro de cómo escribir mis llamadas a la API. ¿Cuál es la mejor práctica para esto?
Intenté lo siguiente pero no obtengo ningún resultado. Estoy abierto a implementar bibliotecas API alternativas si es necesario.
Debajo está mi código:
import React from 'react';
export default class UserList extends React.Component {
constructor(props) {
super(props);
this.state = {
person: []
};
}
UserList(){
return $.getJSON('https://randomuser.me/api/')
.then(function(data) {
return data.results;
});
}
render() {
this.UserList().then(function(res){
this.state = {person: res};
});
return (
<div id="layout-content" className="layout-content-wrapper">
<div className="panel-list">
{this.state.person.map((item, i) =>{
return(
<h1>{item.name.first}</h1>
<span>{item.cell}, {item.email}</span>
)
})}
<div>
</div>
)
}
}
javascript
jquery
reactjs
Raj Rj
fuente
fuente
componentDidMount
devolución de llamada.fetch()
jQuery en lugar de jQuery si solo usa jQuery para hacer solicitudes de Ajax.useEffect
es probablemente el lugar para poner llamadas api ahora. Ver btholt.github.io/complete-intro-to-react-v5/effectsRespuestas:
En este caso, puede hacer una llamada ajax dentro
componentDidMount
y luego actualizarstate
fuente
Es posible que desee consultar la arquitectura de flujo . También recomiendo revisar la implementación de React-Redux . Pon tus llamadas de API en tus acciones. Es mucho más limpio que ponerlo todo en el componente.
Las acciones son una especie de métodos auxiliares a los que puede llamar para cambiar el estado de su aplicación o hacer llamadas API.
fuente
Use el
fetch
método internocomponentDidMount
para actualizar el estado:fuente
Esta discusión ha sido durante un tiempo y la respuesta de @Alexander T. proporcionó una buena guía a seguir para los nuevos de React como yo. Y voy a compartir algunos conocimientos adicionales sobre cómo llamar a la misma API varias veces para actualizar el componente, creo que probablemente sea un problema común que los novatos pueden enfrentar al principio.
componentWillReceiveProps(nextProps)
, de la documentación oficial :Podríamos concluir que aquí es donde manejamos los accesorios del componente principal, tenemos llamadas de API y actualizamos el estado.
Base en el ejemplo de @Alexander T.:
Actualizar
componentWillReceiveProps()
Sería obsoleto.Aquí hay solo algunos métodos (todos en Doc ) en el ciclo de vida que creo que estarían relacionados con la implementación de API en general:
Al referirse al diagrama anterior:
Implementar API en
componentDidMount()
El escenario adecuado para tener una llamada a la API aquí es que el contenido (de la respuesta de la API) de este componente será estático,
componentDidMount()
solo se disparará una vez mientras el componente se está montando, incluso se pasan nuevos accesorios del componente principal o tienen acciones para liderarre-rendering
.El componente verifica la diferencia para volver a renderizar pero no para volver a montar .
Cita del doc :
static getDerivedStateFromProps(nextProps, prevState)
Debemos notar que hay dos tipos de actualización de componentes ,
setState()
en la componente de corriente que no conduzcan a este método gatillo, pero re-representación o nuevos apoyos de componente de los padres hacemos. Podríamos descubrir que este método también se activa durante el montaje.Este es un lugar adecuado para implementar API si queremos usar el componente actual como una plantilla, y los nuevos parámetros para API son accesorios que provienen del componente principal .
Recibimos una respuesta diferente de API y devolvemos una nueva
state
aquí para cambiar el contenido de este componente.Por ejemplo:
tenemos una lista desplegable para diferentes automóviles en el componente principal, este componente debe mostrar los detalles del seleccionado.
componentDidUpdate(prevProps, prevState)
A diferencia de
static getDerivedStateFromProps()
, este método se invoca inmediatamente después de cada representación, excepto la representación inicial. Podríamos tener llamadas de API y representar la diferencia en un componente.Extienda el ejemplo anterior:
el componente para mostrar los detalles del automóvil puede contener una lista de series de este automóvil, si queremos verificar el de producción de 2013, podemos hacer clic o seleccionar o ... el elemento de la lista para liderar un primero
setState()
para reflejar esto comportamiento (como resaltar el elemento de la lista) en este componente y, a continuacióncomponentDidUpdate()
, enviamos nuestra solicitud con nuevos parámetros (estado). Después de obtener la respuesta,setState()
nuevamente para mostrar el contenido diferente de los detalles del automóvil. Para evitar que lo siguientecomponentDidUpdate()
provoque el bucle infinito, necesitamos comparar el estado utilizandoprevState
al principio de este método para decidir si enviamos la API y representamos el nuevo contenido.Este método realmente podría utilizarse al igual que
static getDerivedStateFromProps()
con los accesorios, pero necesita manejar los cambiosprops
mediante la utilizaciónprevProps
. Y tenemos que cooperarcomponentDidMount()
para manejar la llamada API inicial.Cita del doc :
fuente
Me gustaría que eche un vistazo a redux http://redux.js.org/index.html
Tienen una forma muy bien definida de manejar llamadas asíncronas, es decir, llamadas API, y en lugar de usar jQuery para llamadas API, me gustaría recomendar el uso de fetch o solicitar paquetes npm, fetch es compatible actualmente con los navegadores modernos, pero también hay un shim disponible para lado del servidor.
También existe otro paquete sobresaliente increíble , que tiene muchas opciones al hacer una solicitud de API y es muy fácil de usar.
fuente
La función de renderizado debe ser pura, significa que solo usa estado y accesorios para renderizar, nunca intente modificar el estado en render, esto generalmente causa errores feos y disminuye significativamente el rendimiento. También es un buen punto si separa la búsqueda de datos y las preocupaciones de procesamiento en su aplicación React. Le recomiendo que lea este artículo que explica muy bien esta idea. https://medium.com/@learnreact/container-components-c0e67432e005#.sfydn87nm
fuente
Esta parte de la documentación de React v16 responderá a su pregunta, siga leyendo sobre componentDidMount ():
Como puede ver, componentDidMount se considera el mejor lugar y ciclo para hacer la llamada API , también acceder al nodo, lo que significa que en este momento es seguro hacer la llamada, actualizar la vista o lo que sea que pueda hacer cuando el documento esté listo, si está usando jQuery, debería recordarle de alguna manera la función document.ready (), donde puede asegurarse de que todo esté listo para lo que quiera hacer en su código ...
fuente
1) Puede usar F etch API para obtener datos de Endd Points:
Ejemplo obteniendo todo el
Github
reposo para un usuario2) Otra alternativa es Axios
Ahora puede elegir obtener datos utilizando cualquiera de estas estrategias en
componentDidMount
Mientras tanto, puede mostrar la barra de progreso mientras se cargan los datos
fuente
También puede buscar datos con ganchos en los componentes de su función
ejemplo completo con llamada api: https://codesandbox.io/s/jvvkoo8pq3
segundo ejemplo: https://jsfiddle.net/bradcypert/jhrt40yv/6/
fuente
Como el mejor lugar y práctica para las llamadas API externas es el método React Lifecycle componentDidMount () , donde después de la ejecución de la llamada API debe actualizar el estado local para que se active la nueva llamada al método render () , luego los cambios en el estado local actualizado se aplicará en la vista de componentes.
Como otra opción para la llamada de fuente de datos externa inicial en React se señala el método constructor () de la clase El constructor es el primer método ejecutado en la inicialización de la instancia del objeto componente. Puede ver este enfoque en los ejemplos de documentación para Componentes de orden superior .
El método componentWillMount () y UNSAFE_componentWillMount () no debe usarse para llamadas a API externas, porque están destinadas a ser obsoletas. Aquí puede ver razones comunes por las que este método quedará en desuso.
De todos modos, nunca debe usar el método render () o el método directamente llamado desde render () como un punto para una llamada API externa. Si haces esto, tu aplicación será bloqueada .
fuente
Una forma limpia es hacer una llamada API asíncrona dentro de componentDidMount con la función try / catch .
Cuando llamamos a una API, recibimos una respuesta. Luego aplicamos el método JSON para convertir la respuesta en un objeto JavaScript. Luego tomamos de ese objeto de respuesta solo su objeto hijo llamado "resultados" (data.results).
Al principio definimos "userList" en estado como una matriz vacía. Tan pronto como hacemos la llamada a la API y recibimos datos de esa API, asignamos los "resultados" a userList usando el método setState .
Dentro de la función de procesamiento, decimos que userList vendrá del estado. Dado que userList es una matriz de objetos que mapeamos a través de ella, para mostrar una imagen, un nombre y un número de teléfono de cada objeto "usuario". Para recuperar esta información, usamos la notación de puntos (por ejemplo, user.phone).
NOTA : dependiendo de su API, su respuesta puede verse diferente. Console.log toda la "respuesta" para ver qué variables necesita de ella y luego asignarlas en setState.
UserList.js
fuente
Sería genial usar axios para la solicitud de API que admite cancelaciones, interceptores, etc. Junto con axios, uso react-redux para la gestión del estado y redux-saga / redux-thunk para los efectos secundarios.
fuente