#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. Это будет проблема, которую я зарегистрировал в консоли, и я не обновляю состояние. Я исправлю это, но что касается этого, то он работает так, как вы предложили в этом вопросе. Спасибо! @Дакре Денни