2016-01-12 5 views
9

Alle:Wie Komponente exportieren für Server-Seite in Rendering Reagieren

ich ziemlich neu bin jetzt zu reagieren, ich versuche, wie Server-Seite Rendering zu tun, verwende ich Express.js wie mein Server, so dass der Code wie ist:

//server.js 
var express = require("express"); 

var ReactDOMServer = require("react-dom/server"); 
var MyCom = require("./components"); 
var domstring = ReactDOMServer.renderToString(MyCom); 

var app = express(); 
app.get("/", function(req, res){ 
    res.json({ 
     name: "new com", 
     dom: domstring 
    }); 
}); 

Und

// components.js 
var React = require("react"); 

var MyCom = React.createClass({ 
    render: function(){ 
     return (<h1>Hello, server side react</h1>); 
    } 
}); 

module.exports = MyCom; 

ich babel verwenden, um die JSX transpile, aber wenn ich Server zu starten, ich weiß nicht, warum ich wie immer Fehler halten:

Invariante Verletzung: renderToString(): Sie müssen ein gültiges ReactElement übergeben.

Kann jemand einen Hinweis geben, warum das nicht funktioniert?

Dank

Antwort

6

Ihr Modul exportiert ein ReactComponent und renderToString akzeptiert eine ReactElement (das heißt ein instanziiert ReactComponent).

Um es zu machen, wollen Sie es wie so instanziiert:

ReactDOMServer.renderToString(<MyCom />); 
+0

danke für die antwort. Wenn ich zur FB API zurückkehre, merke ich, dass es auch ein JSX-Stilelement sein muss. – Kuan

+1

Sie können auch Folgendes tun: 'reactDOM.renderToString (react.createFactory (componentFile)(), {});' Und es sollte funktionieren, wenn Ihre Komponente in einer separaten jsx-Datei lebt – danielrvt

2

eine Fabrik ermöglicht es Ihnen, alle Komponenten in separaten Dateien zu haben und sie instanziiert ohne jsx Syntax in Ihrem Server. Sehr nützlich für die Hauptverpackung Komponente.

require('babel-core/register')({ 
    presets: ['react'] 
}); 

var express = require('express'); 
var reactDOM = require('react-dom/server'); 
var react = require('react'); 
var app = express(); 

app.get('/', function (req, res) { 
    var mainFile = require('./app.jsx'); 
    var output = reactDOM.renderToString(react.createFactory(mainFile)({ 
    data: yourInitialData 
    })); 
    res.send(output); 
}); 
Verwandte Themen