【发布时间】:2018-03-29 23:42:31
【问题描述】:
我正在使用 AsyncStorage 将大学信息存储在 React Native 应用程序中。我正在为我的页面使用带有屏幕的堆栈和选项卡导航器。一旦有人选择了不同的大学,所有页面内容都会成功地以我想要的方式重新呈现。标题没有。我无法告诉它 AsyncStorage 变量已更新并更新状态并重新呈现自身。
一旦有人选择一所新大学,我想简单地刷新整个应用程序。然后变量、状态和道具都将是最新的,即与调出开发菜单并重新加载应用程序相同。我想要在应用程序中调用一个函数并在内部执行此操作的按钮。
编辑:这是我的设置页面中代码的 sn-p。当按下提交按钮时,我需要我的 AsyncStorage 变量的“名称”字段来更改我的索引文件的标题。
saveMSU() {
const object = {
name: 'MONTANA STATE UNIVERSITY',
site: 'http://msubobcats.com/index.aspx',
};
AsyncStorage.setItem('schoolObj', JSON.stringify(object));
}
saveUM() {
const object = {
name: 'UNIVERSITY OF MONTANA',
site: 'http://gogriz.com/',
};
AsyncStorage.setItem('schoolObj', JSON.stringify(object));
}
updateSchool = async () => {
this.props.navigation.dispatch(NavigationActions.reset({
index: 0,
key: null,
actions: [NavigationActions.navigate({ routeName: 'Tabs' })]
}));
}
render() {
return (
<View style={styles.container}>
<Text>CHOOSE YOUR UNIVERSITY</Text>
<TouchableOpacity onPress={this.saveMSU}>
<Text>Montana State University</Text>
</TouchableOpacity>
<TouchableOpacity onPress={this.saveUM}>
<Text>University of Montana</Text>
</TouchableOpacity>
<Button onPress={this.updateSchool}>
SUBMIT
</Button>
</View>
);
}
}
这是我的索引文件的主要部分。在设置中按下“提交”时,我需要更新的是 this.state.school.site 和 this.state.school.name。我喜欢使用 deviceEventEmitter 的想法,但对如何实际实现它有点困惑。
class App extends Component {
state = { school: Object, loaded: false };
componentWillMount() {
this.retrieveItem('schoolObj').then((current) => {
this.setState({ school: current, loaded: true });
}).catch((error) => {
console.log('Unable to retrieve data: ' + error);
});
}
async retrieveItem(key) {
try {
const schoolItem = await AsyncStorage.getItem(key);
const item = JSON.parse(schoolItem);
return item;
} catch (error) {
console.log(error.message);
}
return;
}
render() {
return (
<View style={{ flex: 1 }}>
<Image style={styles.logoStyle} source={require('./media/UAT.png')} />
{ this.state.loaded &&
<TouchableOpacity onPress={() => Linking.openURL(this.state.school.site)}>
<Text style={styles.headingStyle}>
{Object.values(this.state.school.name)}
</Text>
</TouchableOpacity>
}
<Root screenProps={this.state.school} />
</View>
);
}
}
【问题讨论】:
标签: reactjs react-native react-navigation asyncstorage react-props