javascript - 渲染后如何根据状态切换子组件?
问题描述
Index.tsx、Profile.tsx、Login.tsx 共有三个屏幕。我尝试登录以设置 AsyncStorage,然后返回到 Profile,使用从 AsyncStorage 获取的 this.state.member 来切换 Profile 内的组件。但是现在我只能返回索引然后配置文件,这样我可以更改配置文件中的子组件
我之前通过使用 react-navigation createSwitchNavigator() 完成了这样的操作。但是现在我尝试使用 this.setState({member: (result from AsyncStorage.getItem("member") ) ? AsyncStorage.getItem("member") : undefined }) in componentDidMount() 在 Profile 中重新渲染
这是案例的代码,https://gist.github.com/sanhuang/4526dbd00051695c80b7b36dd7230ef8
export default class ProfileSreen extends Component {
constructor(props) {
super(props)
this.state = {
isLoading: true,
isSignIn: false,
member: undefined
}
this._getMemberStorage = this._getMemberStorage.bind(this);
}
componentDidMount() {
this._getMemberStorage();
}
async _getMemberStorage(): Promise<void> {
try{
// let member = null;
let member = await ExStorage.getItem("member");
// console.log(member);
if ( member !== null ){
await this.setState({
member,
isSignIn: true
});
}else{
await this.promisedSetState({
member: null,
isSignIn: false
});
}
await this.promisedSetState({
isLoading: false
});
return true;
}catch(e) {
console.error(e);
}
}
promisedSetState = (newState) => {
return new Promise((resolve) => {
this.setState(newState, () => {
resolve()
});
});
}
protected _renderLogin() {
return (
<ListItem>
<Button small rounded
onPress={() => {
this.props.navigation.navigate('Profile_Login');
}}
>
<Text>Login</Text>
</Button>
</ListItem>
)
}
protected _renderMember() {
return (
<ListItem>
<Body>
<H2>{this.state.member.cmt} {this.state.member.unit}{this.state.member.name},您好</H2>
<Text note>xxx</Text>
</Body>
</ListItem>
)
}
protected render() {
let infocoms = null;
if (this.state.isLoading ) {
return (
<L.PageLoading />
)
}else{
if (this.state.isSignIn) {
infocoms = this._renderMember();
} else {
infocoms = this._renderLogin();
}
return (
<Root>
<Container>
<Content>
<List>
{infocoms}
</List>
<Settings />
</Content>
{<L.IFooter />}
</Container>
</Root>
);
}
}
}
即使我登录,结果也总是呈现 _renderLogin()
解决方案
您是否确实看到您member
从登录请求中获得了有效值?
此外,您不需要在 a 之前放置 await setState
:
await this.setState({
member,
isSignIn: true
});
我猜这可能会导致意想不到的事情。
推荐阅读
- windows - 为什么我的 Web 服务在使用 Windows 身份验证时返回错误 401?
- c++ - 我有一个数组联合。从一个数组中读取一些元素并从另一个数组中读取其他元素是否可以?
- angular - 未使用 formControl 检查 Mat-checkbox
- php - 在尝试运行查询时,我得到了这个“错误:调用字符串上的成员函数查询()”并且似乎找不到修复
- python - 使用python创建用于创建文件夹的循环
- sql - 日期时间字符串必须匹配 ISO 8601 格式 - 在 azure 数据工厂管道 - 随机出错
- nativescript - How do I import the javascript for a custom theme?
- apache-spark - Spark AR Studio how to move object after 3 seconds patch editor
- php - php Page didn't send JSON response
- php - 调用文件,如果网络服务这样取消调用