Ich habe Schwierigkeiten, Server-Side-Rendering (SSR) mit redux-api
zu arbeiten. Die App funktioniert nur mit clientseitigem Rendering (CSR).So erhalten Sie Next.js und Redux-API zur Arbeit (mit Next-Redux-Wrapper)
Für SSR zu arbeiten, ich brauche die Daten in Next.js’ getInitialProps
Funktion zur Verfügung stehen. Ich versuche, next-redux-wrapper
zu verwenden, um es zusammen zu binden.
Aktuelle Status:
class ShowLessonPage extends React.Component {
static async getInitialProps ({store, isServer, pathname, query}) {
console.log(`getInitialProps`, {store, isServer, pathname, query});
const { dispatch } = store;
const lessonSlug = query.lessonSlug;
// Get one Lesson
dispatch(reduxApi.actions.oneLesson({ id: `slug=${lessonSlug}` }));
}
render() {
console.log('render', this.props.oneLesson);
const lesson = this.props.oneLesson.data;
//...
}
//.....
}
const createStoreWithThunkMiddleware = applyMiddleware(thunk)(createStore);
const reducer = combineReducers(myReduxApi.reducers); // redux-api
const makeStore = function (state, enhancer) {
return createStoreWithThunkMiddleware(reducer, state);
}
const mapStateToProps = function (state) {
return { oneLesson: state.oneLesson };
};
// withRedux = next-redux-wrapper
const ShowLessonPageConnected = withRedux({ createStore: makeStore, mapStateToProps: mapStateToProps })(ShowLessonPage)
export default ShowLessonPageConnected;
ich zumindest bekommen store
in getInitialProps
jetzt, aber ich erhalte eine seltsame Error: only absolute urls are supported
Botschaft, die ich nicht in meinem CSR habe (Vor- withRedux
) Version der App. Und this.props.oneLesson.data
ist natürlich leer.
makeStore
bekommt einen state
= undefined
auf den Server generierte Anrufe, vielleicht ist das ein Hinweis.
Ich bin auch offen redux-api
mit etwas anderes zu ersetzen, die in ähnlicher Weise funktioniert.
AKTUALISIEREN 1: Indem alle URLs voll sind, trifft Redux jetzt meinen API-Endpunkt. Doch für 1 Seite neu laden nennt es makeStore
nicht weniger als 3 mal, und nur der erste Aufruf enthält die richtige Schnecke, siehe Konsolenausgabe:
makeStore { state: undefined, reqParams: { lessonSlug: 'tyrannosaurus-rex' } }
getInitialProps { query: { lessonSlug: 'tyrannosaurus-rex' } }
API: GET request: { _id: 'slug=tyrannosaurus-rex' }
makeStore { state: undefined, reqParams: { lessonSlug: 'undefined' } }
getInitialProps { query: { lessonSlug: 'undefined' } }
API: GET request: { _id: 'slug=undefined' }
makeStore { state: undefined, reqParams: { lessonSlug: 'undefined' } }
getInitialProps { query: { lessonSlug: 'undefined' } }
API: GET request: { _id: 'slug=undefined' }
UPDATE 2: Ein Durchbruch: ein Versprechen von getInitialProps
macht Rückkehr SSR-Arbeit. Jetzt ist das clientseitige Rendering ziemlich lustig.