Ich erstelle eine Website, um einige Telefone anzuzeigen, und habe eine API eingerichtet, um die neuesten Telefone aus meiner Datenbank zurück zu geben. In meiner Komponente innerhalb der KomponenteWillMount gebe ich eine Aktion aus, die dann die API-Ergebnisse abruft und meinen Speicher auffüllt. Die Komponente rendert dann, was im Geschäft ist.Redux setzen Anfangszustand als API-Antwort
Dies scheint alles in Ordnung zu sein, aber es bedeutet, dass es etwas Zeit gibt, wenn nichts angezeigt wird, während der API-Aufruf erfolgt.
Ich frage mich, ob es eine Möglichkeit gibt, entweder die Aktion auf dem Server zu versenden und die initialState als API-Antwort oder eine andere Möglichkeit, die API-Antwort vom Server an den Client zu übergeben, so dass die Daten sind da schon wenn die Komponente rendert?
Das ist, was ich bisher haben ...
Reducers
export function latestPhonesHasErrored(state = false, action) {
switch (action.type) {
case 'LATEST_PHONES_HAS_ERRORED':
return action.latestPhonesHasErrored;
default:
return state;
}
}
export function latestPhonesIsLoading(state = false, action) {
switch (action.type) {
case 'LATEST_PHONES_IS_LOADING':
return action.latestPhonesIsLoading;
default:
return state;
}
}
export function latestPhones(state = [], action) {
switch (action.type) {
case 'LATEST_PHONES_FETCH_DATA_SUCCESS':
return action.latestPhones;
default:
return state;
}
}
Aktion
export function latestPhonesFetchData() {
return (dispatch) => {
dispatch(latestPhonesIsLoading(true));
fetch('/api/latest-phones/')
.then((response) => {
if (!response.ok) {
throw Error(response.statusText);
}
dispatch(latestPhonesIsLoading(false));
return response;
})
.then((response) => response.json())
.then((results) =>
dispatch(latestPhonesFetchDataSuccess(results)))
.catch(() => dispatch(latestPhonesHasErrored(true)))
}
}
Server.js
Komponente
import {latestPhonesFetchData} from '../../../actions/results-actions';
const mapStateToProps = (state) => {
return {
latestPhones: state.latestPhones
}
};
class Home extends Component {
componentWillMount(){
this.props.latestPhonesFetchData();
}
render(){
/* all component render here*/
}
}
export default connect(mapStateToProps, {latestPhonesFetchData})(Home);
Jede Hilfe ist sehr zu schätzen!
Da es asynchron ist, gibt es keine Garantie, dass Sie die Daten dort haben können, bevor die Komponente geladen wird, Sie sind besser dran, nur einen Ladebildschirm zu haben und den Ladebildschirm zu aktualisieren, wenn die Daten geladen werden. –
Ja, ich habe dies an anderen Stellen auf meiner Website gemacht, wo ich API-Anfragen habe, aber ich hatte gehofft, dass ich in diesem Fall den richtigen Anfangszustand erreichen könnte, wo keine Benutzerinteraktion erforderlich ist, damit Google das auch tun könnte crawlen Sie den Inhalt für SEO-Zwecke – Phil