React Native: использовать состояние компонента для запроса на выборку

#javascript #react-native

#javascript #react-native

Вопрос:

В настоящее время я использую fetch() для отправки HTTP-запроса следующий код:

   getAuthToken = () => {
    fetch('https://example.com/api/auth/login', {
      method: 'POST',
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        username: 'userstring',
        password: 'passstring',
      }),
    }
  )
  .then((res) => res.json())
  .then((responseJson) => {
    return responseJson.token;
  });
  }
  

Я хотел бы передать состояние из компонента в качестве body данных для запроса. Я использую JSON.stringify() для форматирования строки JSON для запроса body , но я не знаю, как получить доступ к компоненту state на данный момент:

   body: JSON.stringify({
    username: 'userstring',
    password: 'passstring',
  }),
  

Одна из попыток, которую я предпринял, заключалась в том, чтобы сделать это:

   body: JSON.stringify({
    username: {this.state.username},
    password: {this.state.password},
  }),
  

Приведенный выше код выдал ошибку. Я также пытался использовать {{this.state.username}} , но это также дало ту же синтаксическую ошибку.

Могу ли я достичь того, чего я хочу? Я передаю динамические поля ввода, и я хотел бы, чтобы это поле было значением состояния. Есть идеи?

Ответ №1:

Если getAuthToken() определено в вашем классе компонентов, то вы должны иметь возможность обращаться к объекту состояния напрямую, без { .. } синтаксиса. Один из подходов может быть следующим:

 class YourComponent extends React.Component {

    // If getAuthToken defined as class field then it can access this.state
    getAuthToken = () => {

        // If state not initialized, early exit
        if(!this.state) {
            return
        }

        // Extract username and password from state
        const { username, password } = this.state

        fetch('https://example.com/api/auth/login', {
            method: 'POST',
            headers: {
            Accept: 'application/json',
            'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                // Use authentication data from form in request
                username,
                password,
            })
        })
        .then((res) => res.json())
        .then((responseJson) => responseJson.token)
        .then((token) => {
            console.log(`token:${token}`)
        });
    }
}
  

В зависимости от реализации вашего компонента, возможно, стоит проверить state вашего компонента, прежде чем пытаться извлечь из него данные аутентификации и опубликовать их, как показано выше с помощью:

 if(!this.state) {
    return
}
  

Надеюсь, это поможет

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

1. Это очень помогает. Я получаю неопределенный токен thou. Я пробовал это: имя пользователя, пароль и username: имя пользователя, пароль: пароль. @Дакре Денни

2. Добро пожаловать! Возможно, ответ вашего сервера отличается от того, что вы ожидаете. Что произойдет, если вы удалите последний .then() (с помощью console.log) и обновите .then() (с помощью responseJson ) до этого? .then((responseJson) => alert(JSON.stringify(responseJson))) . Что выводит диалоговое окно alert()?

3. Когда я вручную ввожу имя пользователя и пароль следующим образом: username: ‘myemail@gmail.com ‘, пароль: ‘mypasword’, @Dacre Denny это работает.

4. Хорошо, что произойдет, если вы добавите alert(username ',' password) непосредственно перед fetch() ? Отображается ли в приглашении ожидаемые данные из вашей формы?

5. Это будет проблема, которую я зарегистрировал в консоли, и я не обновляю состояние. Я исправлю это, но что касается этого, то он работает так, как вы предложили в этом вопросе. Спасибо! @Дакре Денни