gpt4 book ai didi

javascript - 异步setState在componentDidMount中不起作用,但在其他地方起作用: React Native

转载 作者:行者123 更新时间:2023-11-27 22:56:29 24 4
gpt4 key购买 nike

我的计划是从 http 请求中获取一个字符串数组,并在 header 中包含授权 token ,然后使用该数组来决定要渲染的内容(多个组件意味着用户是管理员,因此他将被发送到listView 等)

我如何存储授权 token :(react-native-router-flux用于导航)

    AsyncStorage.setItem('access_token',token).then((value)=> { Actions.pageTwo()}).done() 
//navigates to second page

在第二页有

var HotelAdminService = require('./services.js');
....
constructor(props) {
super(props);
this.state={
keyLoaded:false,
};
this.tester= HotelAdminService.tester.bind(this);
}

componentDidMount() {
HotelAdminService.tester.bind(this);
}

render() {
console.log(this.state);
if (!(this.state.keyLoaded) ) {
return this.renderLoadingView();
}
return (
<View style={styles.viewContainer} >
<SearchBar onChangeText={(e) => this.clickMovie(e)}> </SearchBar>
<ListView dataSource={this.state.dataSource} renderRow= {this.renderMovie} style={styles.listView}/>
</View>
);
}

服务.js:

exports.tester=function(){
let REQUEST_URL= config.baseUrl + 'api/HotelAdmin/GetKey';


AsyncStorage.getItem('access_token').then((value) => {

fetch(REQUEST_URL, {
method: 'GET',
headers: {
'Authorization': 'Bearer ' + value,
}
}).then((response) => {return response.json()} ).then((responseData) => {

this.setState(
{key: responseData,
keyLoaded: true,
dataSource: this.state.dataSource.cloneWithRows(responseData),
});
}).done();



});



}

现在我知道这个方法是有效的,因为它做了我想要它做的事情,但是只有当我从第二页单击按钮调用它时。然而,我想做的是让 HotelAdmin.tester 在开始时工作,这样当我获取数据时它可以导致重新渲染。正如你所看到的,我的渲染方法给出了一个加载屏幕,直到 keyLoaded 变为 true。也许一种替代方法是测试器方法返回一个字符串而不是更改状态,但是我无法从嵌套的 Promise 调用中返回字符串数组。

在当前情况下,代码停留在加载屏幕中,因为 HotelSystemAdmin.tester 不会运行并更改状态

最佳答案

您仅将函数绑定(bind)到 componentDidMount 中的上下文。您需要调用它:

HotelAdminService.tester.bind(this)();

关于javascript - 异步setState在componentDidMount中不起作用,但在其他地方起作用: React Native,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37569511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com