Я бы сделал это, установив значение загрузки в состоянии, а затем запросив данные в ComponentDidMount()
.После загрузки установите для this.state.loaded
значение true
и выполните рендеринг хранилища с данными, возвращенными из API.В этом нет необходимости, но это обеспечит хороший UX для клиента и предотвратит ненужный повторный рендеринг RouterComponent
дважды.
Независимо от того, решили ли вы установить значения error
и loaded
, идея состоит в том, чтобы получить данные в методе ComponentDidMount
и обновить App.state
новыми данными - это приведет ккомпонент для повторного рендеринга и применения ваших данных к новому Store
.
import React, { Component } from 'react';
import { View } from 'react-native';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import ReduxThunk from 'redux-thunk';
import reducers from './reducers';
import RouterComponent from './Router';
class App extends Component {
constructor(props) {
super(props);
this.state = {
initialState: {},
loaded: false,
error: false
}
}
componentDidMount() {
// Perform your API call, using which ever library or method you choose, i prefer axios so will demonstrate with this:
axios.get('path/to/api')
.then(res => {
// Send the response to state, which will cause the component to re-render and create the store with the new initialState
this.setState({
initialState: res.data,
loaded: true
});
})
.catch(err => {
console.error('Error initiating application. Failed to retrieve data from API')
this.setState({error: true});
});
}
render() {
// This would be completely optional, but I would show some form of loading icon or text whilst you wait for the API to fetch the data.
if(!this.state.loaded) {
return "Loading";
}
// If there was an error getting the data, tell the client
else if(this.state.error) {
return "Error loading data from API. Please reload the application or try again.";
}
// If all is well, the component should render the store with the correct initialState
else {
return (
<Provider store={createStore(reducers, this.state.initialState, applyMiddleware(ReduxThunk))}>
<View style={{ flex: 1 }}>
<RouterComponent />
</View>
</Provider>
);
}
}
}
export default App;
Надеюсь, это поможет.