【发布时间】:2021-04-03 20:42:36
【问题描述】:
我创建了一个 express mongoose api。我想从我的 React 应用程序中使用该 api。
我想创建一个服务来管理这些 api 请求。但是我是 react-native 的新手,我不能使用该服务。我尝试创建一个静态类,但无法使其正常工作。这是一个例子:
// apiService.js
class ApiService {
static fetchUsers = () => {
return fetch('XXX/users')
.then((response) => {
return response.json()
.then((data) => {
return data;
})
})
.catch((error) => {
console.error(error);
});
}
}
export default ApiService;
还有我的屏幕
// UserScreen.js
import ApiService from '../services/apiService';
export default class UserScreen extends Component {
constructor(props) {
super(props);
this.state = {
users: [],
isLoading: true,
}
}
componentDidMount = () => {
let users = ApiService.fetchUsers();
this.setState({data: users});
this.setState({isLoading: false});
}
render() {
if (this.state.isLoading) {
return (
<View style={styles.container}>
<ActivityIndicator/>
</View>
)
} else {
return (
<View style={{ flex: 1, marginTop: 100 }}>
{
this.state.data.map((val, key) => {
return <TouchableOpacity
style={styles.homeButton}
key={key}
onPress={() => this.redirectHandler(val)}>
</TouchableOpacity>
})
}
</View>
)
}
}
}
我尝试使用异步并等待,但找不到检索数据的方法。数据可以在 apiService 中很好地检索,但我无法与 UserScreen 共享它们。
如何在 react-native 中使用(静态或非静态)类/函数并从屏幕获取数据
更新 这是我尝试使用异步的方法
class ApiService {
static fetchUsers = async () => {
try {
let response = await fetch('XXXXX/users/');
let json = await response.json();
return json;
} catch (error) {
console.error(error);
}
}
}
export default ApiService;
在我的用户屏幕中
componentDidMount = async () => {
try {
let users = await ApiService.fetchUsers();
this.setState({isLoading: false});
this.setState({data: users});
} catch (error) {
console.log(error);
}
}
【问题讨论】:
-
这与类或静态方法无关。只是您的
fetchUsers函数返回了一个承诺。请向我们展示您如何尝试使用 async/await。 -
@Bergi 我已经更新了我的答案。我对这一切都很陌生,我不明白如何使用 Promise 并检索它的值
-
您不必两次设置状态。只需将两个键合并到一个 setState 中
-
这种方法应该有效(除了重复的错误处理)。发生了什么,你遇到了什么问题?
-
@Hearner 这是因为您的第一个
this.setState({ isLoading: false })在您的第二个实际提供数据之前导致重新渲染。因此,在render()中,您在设置data之前采用了else分支。
标签: javascript react-native fetch