J'utilise axios en réaction pour obtenir des informations d'un backend django, j'obtiens les données utilisateur et je les stocke dans un état dans le composant mais je souhaite utiliser l'un des attributs de l'état user_data dans l'url d'un autre get pour obtenir plus d'informations du backend, je ne sais pas si je l'ai bien expliqué mais voici le code:
state = { user_data: [], classes: [] } componentDidMount() { const config = { headers: { 'Content-Type': 'application/json', 'Authorization': `JWT ${localStorage.getItem('access')}`, 'Accept': 'application/json' } }; axios.get(`${process.env.REACT_APP_API_URL}/auth/users/me/`, config) .then( res => { this.setState({ user_data: res.data }); } ) const myString = this.state.user_data.SectionNumber axios.get(`${process.env.REACT_APP_API_URL}/Elearning/Classes/${myString}`, config) .then( res => { this.setState({ classes: res.data }); console.log(res.data); } ) }
Je ne sais pas comment changer l'objet d'état en quelque chose que axios peut comprendre et utiliser dans l'url
4 Réponses :
À ce stade, lorsque vous récupérez les données relatives à l'utilisateur, vous n'avez pas besoin de dépendre de l'état. Vous pouvez passer le deuxième appel en tant que rappel au premier setState afin qu'il puisse le mettre à jour lorsque la promesse se résout et que l'état a été mis à jour.
axios.get(`${process.env.REACT_APP_API_URL}/auth/users/me/`, config) .then( res => { this.setState({ user_data: res.data }); }, () => { const myString = this.state.user_data.SectionNumber axios.get(`${process.env.REACT_APP_API_URL}/Elearning/Classes/${myString}`, config) .then( res => { this.setState({ classes: res.data }); console.log(res.data); } ) } )
Cela a fonctionné mais pas exactement comme vous l'avez dit, je vais mettre le code comme réponse si quelqu'un en a besoin à l'avenir
Vous n'avez pas besoin de définir l'état, puis de prendre l'état pour utiliser ce paramètre dans votre URL. Vous pouvez utiliser des promesses et du code pseudo-synchrone async / await et cela devrait vous aider.
async componentDidMount() { const config = { headers: { 'Content-Type': 'application/json', 'Authorization': `JWT ${localStorage.getItem('access')}`, 'Accept': 'application/json' } }; const userDataResponse = await axios.get(`${process.env.REACT_APP_API_URL}/auth/users/me/`, config) const myString = userDataResponse.data.SectionNumber; const classesResponse = await axios.get(`${process.env.REACT_APP_API_URL}/Elearning/Classes/${myString}`, config) this.setState({ user_data: userDataResponse.data, classes: classesResponse.data }); }
C'est le code qui a fonctionné avec moi
axios.get(`${process.env.REACT_APP_API_URL}/auth/users/me/`, config) .then( res => { this.setState({ user_data: res.data }); const SectionNumber = this.state.user_data.SectionNumber axios.get(`${process.env.REACT_APP_API_URL}/Elearning/Classes/${SectionNumber}`, config) .then( res => { this.setState({ classes: res.data }); } ) } )
Je suis également confronté à un problème similaire et j'ai fait exactement comme vous l'avez montré mais je ne vois pas les résultats.
axiosInstance.get('/user/profile/' + this.state.adminCard).then(response => { axiosInstance.defaults.headers['Authorization'] = "JWT " + response.data.access; this.setState({ fullName: response.data.lastName + ", " + response.data.firstName, diploma: response.data.diploma, projectSlug: response.data.project }) }, () => { const slug = this.state.projectSlug; axiosInstance.get('/user/project/' + slug).then(response => { axiosInstance.defaults.headers['Authorization'] = "JWT " + response.data.access; this.setState({ assignedProjectName: response.data.projectName, assignedProjectDesc: response.data.projectDesc, assignedProjectSupervisor: response.data.projectSupervisor }) console.log(this.state.assignedProjectName) }) })
Sur la ligne où je console.log (this.state.assignedProjectName), je ne reçois même pas de retour, merci de nous conseiller.
y a-t-il une erreur à laquelle vous faites face?
Vous devez passer le deuxième appel pour récupérer les détails de la classe en tant que rappel au premier setState.