#react-native #state #asyncstorage
#react-native #состояние #asyncstorage
Вопрос:
Я пытаюсь сохранить некоторую базовую информацию о пользователе (имя, адрес, номер телефона и т.д.) с помощью AsyncStorage.
Я хочу сохранить эту информацию в объекте следующим образом:
user: {
complete: '',
fname: '',
lname: '',
email: '',
phone: '',
street: '',
city: '',
state: '',
zip: '',
phone: ''
}
У меня есть простая страница с текстовым полем и кнопкой, чтобы проверить это. текстовое поле будет предназначено для ввода значения «fname» моего пользовательского объекта, а кнопка просто отправляет его в AsyncStorage:
export default class UserInfo extends React.Component {
static navigationOptions = {
title: "Coming soon!"
};
state = {
user: {
complete: '',
fname: '',
lname: '',
email: '',
phone: '',
street: '',
city: '',
state: '',
zip: '',
phone: ''
},
isLoading: true
}
componentDidMount = () => AsyncStorage.getItem('user').then((value) => this.setState({ 'user': value, isLoading: false}))
setUser = (value) => {
AsyncStorage.setItem('user', value);
}
render() {
if(this.state.isLoading) {
return (<ActivityIndicator/>)
}
return (
<View>
<TextInput
style={{height: 40, borderColor: 'gray', borderWidth: 1}}
onChangeText={(text) => this.state.user.fname}/>
<Button title="submit" onPress = {() => {this.setUser(this.state.user)}}/>
</View>
);
}
}
К сожалению, я, кажется, зацепился за эту строку:
onChangeText={(text) => this.state.user.fname}/>
Я получаю следующую ошибку:
null is not an object (evaluating '_this2.state.user.fname')
Я не уверен, где я ошибаюсь, у меня не было проблем с хранением простых строк в AsyncStorage, но попытка записи в объект в состоянии вызывает у меня проблемы.
Может кто-нибудь указать мне правильное направление здесь?
Спасибо.
Комментарии:
1. Вам нужно изменить на strign, прежде чем устанавливать их в AsyncStorage. Используйте это для установки
AsyncStorage.setItem('user', JSON.stringify(this.state.user))
, а это для полученияconst user = await AsyncStorage.getItem('user')
, а затемthis.setState({ user: JSON.parse(user) })
2. @sinan это имеет смысл, однако внесение этого изменения не влияет на ошибку. Я думаю, это потому, что фактическое назначение this.state.user внутри моего текстового поля onChange()
Ответ №1:
Используйте его как:
export default class UserInfo extends React.Component {
static navigationOptions = {
title: "Coming soon!"
};
state = {
user: {
complete: '',
fname: '',
lname: '',
email: '',
phone: '',
street: '',
city: '',
state: '',
zip: '',
phone: ''
},
isLoading: true
}
componentDidMount = () => AsyncStorage.getItem('user').then((value) => this.setState({ 'user': value, isLoading: false}))
setUser = () => {
this.setState({user:this.state.user},()=>{
AsyncStorage.setItem('user', this.state.user);
})
}
render() {
if(this.state.isLoading) {
return (<ActivityIndicator/>)
}
return (
<View>
<TextInput
style={{height: 40, borderColor: 'gray', borderWidth: 1}}
onChangeText={(text) => this.state.user.fname}/>
<Button title="submit" onPress = {() => {this.setUser()}}/>
</View>
);
}
}
Комментарии:
1. Я попробовал это решение, и у меня возникла точно такая же проблема. Я думаю, что проблема кроется где-то еще, кроме функции setUser(), тем более, что моя ошибка указывает не на это
Ответ №2:
Вы не можете напрямую обновлять состояние по мере написания кода. Вам нужно извлечь объект из состояния, затем обновить его значение, а затем снова сохранить объект в состояние. Ниже приведен правильный ответ:
onChangeText={(text) => {
let user = this.state.user
user.fname = text
this.setState({
user
})
}}/>
Комментарии:
1. Это то, что я пробовал ранее, и я получаю тот же результат. Я получаю нулевой указатель на «user.fname = text». Не уверен, почему