Как я могу использовать состояние в url для создания get с использованием axios в reactjs

#javascript #reactjs #axios

#javascript #reactjs #axios

Вопрос:

Я использую axios в react для получения информации из серверной части django, я получаю пользовательские данные и сохраняю их в состоянии в компоненте, но я хочу использовать один из атрибутов в состоянии user_data в URL другого get, чтобы получить дополнительную информацию из серверной части, я не могу использовать данные пользователя в состоянии.не знаю, правильно ли я это объяснил, но вот код :

 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);
         }
      ) 
  }
  

Я не знаю, как изменить объект состояния на то, что axios может понять и использовать в URL

Комментарии:

1. есть ли какая-либо ошибка, с которой вы столкнулись?

2. Вы должны передать второй вызов для получения сведений о классе в качестве обратного вызова первому setState.

Ответ №1:

На этом этапе, когда вы извлекаете данные, связанные с пользователем, вам не нужно зависеть от состояния. Вы можете передать второй вызов в качестве обратного вызова первому setState, чтобы он мог обновить его, когда обещание будет выполнено и состояние будет обновлено.

 
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);
                    }
                )
        }
    )
  

Комментарии:

1. Это сработало, но не совсем так, как вы сказали, я собираюсь поместить код в качестве ответа, если кому-то в будущем это понадобится

Ответ №2:

Вам не нужно устанавливать состояние, а затем извлекать из состояния, чтобы использовать этот параметр в вашем URL. Вы можете использовать обещания и псевдосинхронный код async / await, и это должно помочь.

  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
  });
}  

Ответ №3:

Это код, который работал со мной

 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
                });
              }
            )
        } 
      )
  

Ответ №4:

Я также сталкиваюсь с аналогичной проблемой, и я сделал именно так, как вы показали, но я не вижу результатов.

  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)
                    })
                })  

В строке, где я console.log(this.state.assignedProjectName), я даже не получаю возврата, пожалуйста, посоветуйте.