2016-03-26 18 views
10

Sto imparando a utilizzare react.js e ho alcuni problemi per utilizzare i gestori di eventi. La domanda finale sarebbe: è possibile utilizzare il rendering lato server e inviare automaticamente i gestori di eventi al client?React.js Server di rendering e gestori di eventi

Ecco il mio esempio: Ho un index.jsx che io rendo lato server e inviare al client

var React = require("react"); 
var DefaultLayout = require("./layout/default"); 

var LikeButton = React.createClass({ 
    getInitialState: function() { 
    return {liked: false}; 
    }, 
    handleClick: function(event) { 
    this.setState({liked: !this.state.liked}); 
    }, 
    render: function() { 
    var text = this.state.liked ? 'like' : 'haven\'t liked'; 
    return (
     <p onClick={this.handleClick}> 
     You {text} this. Click to toggle. 
     </p> 
    ); 
    } 
}); 

var IndexComponent = React.createClass({ 
    render: function(){ 
     return (
      <DefaultLayout title={this.props.name}> 
       <div> 
         <h1>React Test</h1> 
       </div> 

       <div id="testButton"> 
        <LikeButton/> 
       </div> 

       <script type="text/babel" src="/js/react.js"></script> 
      </DefaultLayout> 
     ) 
    } 
}); 

Ma il "Like Button" non ha alcuna interazione. Per farlo fare qualcosa al clic devo aggiungere questo lato client del codice.

var LikeButton = React.createClass({ 
    getInitialState: function() { 
    return {liked: false}; 
    }, 
    handleClick: function(event) { 
    this.setState({liked: !this.state.liked}); 
    }, 
    render: function() { 
    var text = this.state.liked ? 'like' : 'haven\'t liked'; 
    return (
     <p onClick={this.handleClick}> 
     You {text} this. Click to toggle. 
     </p> 
    ); 
    } 
}); 

ReactDOM.render(
    <LikeButton />, 
    document.getElementById('testButton') 
); 

Ho iniziato solo con react.js e forse mi manca solo qualche concetto importante qui. Ma perché react.js non solo crea il codice (che ora devo aggiungere manualmente al client) durante il rendering del lato server di pagine? In questo modo, ho un codice ridondante e mi sembra che questo sarà un disastro in applicazioni più grandi. Almeno react.js è abbastanza intelligente da non disegnare due LikeButtons ma per "legare" il lato server creato al componente lato client.

+0

Questo non è correlato alla tua domanda, ma credo che si debba associare la funzione handleClick prima di passarla sul onClick altrimenti non ha il contesto corretto di ciò. (Ma non sono sicuro del motivo per cui non si otterrebbe un errore quando si fa clic sul pulsante perché dovrebbe generare un errore quando si chiama this.setState) –

+2

l'associazione @ktruong non è richiesta quando si utilizza React.createClass. si lega automaticamente. –

+1

@ jeffpc1993 Ohh grazie per avermelo fatto notare! –

risposta

12

Per un'applicazione React interattiva lato client, è necessario eseguire il rendering anche del lato client dell'app. Di solito questo codice è identico al codice eseguito sul server, quindi non esiste il codice ridondante. È solo lo stesso codice. Potresti chiederti se il rendering su client e server potrebbe essere eccessivo, ma dal punto di vista delle prestazioni e del SEO ha perfettamente senso.

ReactDOMServer.renderToString(<MyApp foo={bar} />) fondamentalmente mostra solo una stringa con markup. Non c'è javascript o nessuna magia in corso lì. Semplicemente vecchio HTML. Tuttavia, il markup renderizzato ha molti attributi React ID che vengono successivamente utilizzati sul client per generare il Virtual DOM iniziale e allegare eventi.

Quando si esegue nuovamente il rendering dell'applicazione sul client, sullo stesso elemento DOM in cui è stato iniettato il markup reso lato server sul server, React non ha bisogno di ridisegnare l'intera applicazione. Crea semplicemente un nuovo albero DOM virtuale, lo diffrange con l'albero Virtual DOM iniziale e esegue le eventuali operazioni DOM necessarie. Questo concetto del DOM virtuale è ciò che rende React così veloce in primo luogo. Nello stesso processo, tutti gli ascoltatori di eventi che hai definito nella tua applicazione saranno allegati al markup già visualizzato.

Tutto questo accade molto velocemente. E hai il vantaggio di una pagina di rendering lato server (che può essere memorizzata nella cache sul server, usando Varnish o qualcosa di simile) che i motori di ricerca eseguiranno la ricerca per indicizzazione, gli utenti non dovranno aspettare nulla per vedere il rendering iniziale e la pagina funziona fondamentalmente per gli utenti che hanno disabilitato javascript.

+0

Grazie per la risposta. Conosci un buon articolo per usare Reagire con la vernice? –

21

Questo comportamento è dovuto a ciò che è esattamente il rendering del lato server. Prima di tutto dovrai eseguire lo stesso identico codice sia lato client che lato server. Questa è la cosiddetta applicazione isomorfica. Uno che funziona sia su server che su client.
Quindi, nel fare ReactDOM.renderToString(<Component>) solo il codice HTML viene visualizzato come una stringa. Viene valutato il metodo di rendering del componente e viene generato l'HTML richiesto per il rendering iniziale.
Quando lo stesso codice viene eseguito sul client, reagisce cerca l'HTML visualizzato e allega JS nelle posizioni richieste. React è intelligente in questo modo, non ri-renderizza tutto di nuovo al lato client. Basta valutare il codice e identifica dove tutto per collegare il codice basato su react-id ogni elemento DOM è dato. (Riattiverai l'id se controlli l'elemento qualsiasi app di reazione)

Ora ci si potrebbe chiedere qual è il vantaggio di rendere la stessa cosa due volte?
e la risposta è perceived loading time dall'utente. E anche alcune visualizzazioni minime per gli utenti che hanno disabilitato JS.

client applicazione reso
Questo è come un solo client reso funzionamento dell'applicazione. (Client reso Reagire applicazione troppo)

client rendered app

L'utente vedrà solo i contenuti HTML dopo tutto lo scheletro, fasci JS (che sono spesso abbastanza grande) e dati vengono recuperati e valutati. Il che significa che l'utente dovrà spesso fissare uno spinner o una schermata di caricamento per un po 'finché tutto non si carica.

applicazione Isomorphic (funziona sia su client e server)
Come funziona un applicazione isomorfi,
server rendered app
In questo caso il server genera il piena HTML valutando il componente. E l'utente vedrà il contenuto immediatamente non appena viene scaricato l'HTML. Anche se l'applicazione funzionerà completamente solo dopo che i pacchetti JS sono stati scaricati e valutati. Quindi il JS deve girare su entrambi i lati
Così l'utente vede il contenuto molto più velocemente di prima. Da qui l'enorme diminuzione del tempo di caricamento percepito.

+7

Ho contrassegnato la risposta @dannyjolie come corretta in quanto risponde alla mia domanda ed è stata pubblicata in precedenza. Ma ancora un grande grazie per il tuo sforzo di rispondere alla mia domanda. Mi ha aiutato molto anche a capire meglio come funziona reac.js e quale concetto segue! – Jodo

Problemi correlati