Saya mengalami kesulitan dalam mencari cara terbaik agar server merender komponen reaksi saya hanya setelah permintaan http diselesaikan.
Misalnya:
komponen A ‹- komponen B ‹- komponen C (C memicu tindakan yang membuat panggilan ke API dan mengembalikan data untuk dirender, sementara itu hanya merender 'memuat').
Saat memeriksa kode sumber saya, saya hanya melihat 'memuat' dan ingin, untuk tujuan SEO, server menunggu hingga panggilan komponen C diselesaikan dan dirender.
Secara teori, hal ini terdengar mudah karena server harus memanggil tindakan itu sendiri dan menunggu hingga tindakan tersebut selesai, lalu memanggil react.renderToString()
, seperti ini:
server.get('/', function (req, res, next) {
showMessages({}, function showMessagesCallback() { //add a callback
var html = React.renderToString(ChatComponent());
res.send(html);
});
});
Namun bagaimana jika beberapa komponen melakukan panggilan tindakan dan saya harus menunggu beberapa tindakan diselesaikan lalu memanggil renderToString
Sebaliknya, permintaan diambil di sisi klien. File server saya:
/**
* This leverages Express to create and run the http server.
* A Fluxible context is created and executes the navigateAction
* based on the URL. Once completed, the store state is dehydrated
* and the application is rendered via React.
*/
import express from 'express';
import path from 'path';
import serialize from 'serialize-javascript';
import {navigateAction} from 'fluxible-router';
import debugLib from 'debug';
import React from 'react';
import app from './app';
import HtmlComponent from 'components/Html';
const htmlComponent = React.createFactory(HtmlComponent);
const debug = debugLib('quran-com');
const server = express();
server.set('state namespace', 'App');
server.use('/public', express.static(path.join(__dirname, '/build')));
server.use('/images', express.static(path.join(__dirname, '/client/images')));
server.use('/fonts', express.static(path.join(__dirname, '/client/styles/fonts')));
server.use((req, res, next) => {
let context = app.createContext();
debug('Executing navigate action');
context.getActionContext().executeAction(navigateAction, {
url: req.url
}, (err) => {
if (err) {
if (err.status && err.status === 404) {
next();
} else {
next(err);
}
return;
}
debug('Exposing context state');
const exposed = 'window.App=' + serialize(app.dehydrate(context)) + ';';
debug('Rendering Application component into html');
const html = React.renderToStaticMarkup(htmlComponent({
context: context.getComponentContext(),
state: exposed,
markup: React.renderToString(context.createElement())
}));
debug('Sending markup');
res.type('html');
res.write('<!DOCTYPE html>' + html);
res.end();
});
});
const port = process.env.PORT || 8000;
server.listen(port);
console.log('Listening on port ' + port);
export default server;
apa cara terbaik untuk melakukan ini?