2016-03-31 8 views
5

Ich versuche, diese Geige zu kopieren: http://jsfiddle.net/jhudson8/135oo6f8/onClick-Handler nicht Registrierung mit ReactDOMServer.renderToString

(Ich habe auch versucht, dieses Beispiel http://codepen.io/adamaoc/pen/wBGGQv und das gleiche onClick Handler Problem besteht)

und die Geige machen Arbeit für serverseitige Rendering, mit ReactDOMServer.renderToString

ich habe diesen Aufruf:

res.send(ReactDOMServer.renderToString((
      <html> 
      <head> 

       <link href={'/styles/style-accordion.css'} rel={'stylesheet'} type={'text/css'}></link> 

      </head> 

      <body> 


      <Accordion selected='2'> 
       <AccordionSection title='Section 1' id='1'> 
        Section 1 content 
       </AccordionSection> 
       <AccordionSection title='Section 2' id='2'> 
        Section 2 content 
       </AccordionSection> 
       <AccordionSection title='Section 3' id='3'> 
        Section 3 content 
       </AccordionSection> 
      </Accordion> 
      </body> 
      </html> 
     ))); 

das Akkordeon-Element sieht so aus:

const React = require('react'); 

const fs = require('fs'); 
const path = require('path'); 


const Accordion = React.createClass({ 

    getInitialState: function() { 
     // we should also listen for property changes and reset the state 
     // but we aren't for this demo 
     return { 
      // initialize state with the selected section if provided 
      selected: this.props.selected 
     }; 
    }, 

    render: function() { 

     // enhance the section contents so we can track clicks and show sections 
     const children = React.Children.map(this.props.children, this.enhanceSection); 

     return (
      <div className='accordion'> 
       {children} 
      </div> 
     ); 
    }, 

    // return a cloned Section object with click tracking and 'active' awareness 
    enhanceSection: function (child) { 

     const selectedId = this.state.selected; 
     const id = child.props.id; 

     return React.cloneElement(child, { 
      key: id, 
      // private attributes/methods that the Section component works with 
      _selected: id === selectedId, 
      _onSelect: this.onSelect 
     }); 
    }, 

    // when this section is selected, inform the parent Accordion component 
    onSelect: function (id) { 
     this.setState({selected: id}); 
    } 
}); 


module.exports = Accordion; 

und die AccordionSection Komponente sieht so aus:

const React = require('react'); 


const AccordionSection = React.createClass({ 

    render: function() { 

     const className = 'accordion-section' + (this.props._selected ? ' selected' : ''); 

     return (
      <div className={className}> 
       <h3 onClick={this.onSelect}> 
        {this.props.title} 
       </h3> 
       <div className='body'> 
        {this.props.children} 
       </div> 
      </div> 
     ); 
    }, 

    onSelect: function (e) { 
     console.log('event:',e); 
     // tell the parent Accordion component that this section was selected 
     this.props._onSelect(this.props.id); 
    } 
}); 



module.exports = AccordionSection; 

alles funktioniert, und die CSS arbeitet, aber das Problem ist, dass der onClick wird nicht registriert. Ein Klick auf die Akkordeonelemente tut also nichts. Weiß jemand, warum der onClick-Handler in dieser Situation möglicherweise nicht registriert wird?

+0

JS überhaupt funktioniert? ist einer der JS auf Client? –

+0

Ich denke, das fehlende Teil ist, dass auf dem Client, sobald das Markup dort angekommen ist, wir einige React-Aufrufe machen müssen, die tatsächlich die Handler binden –

Antwort

4

Keiner der Hooks wird bei ReactDOMServer.RenderToString registriert. Wenn Sie serverseitige Rendering- und Hook-Funktionen für Ihre reaktive Komponente ausführen möchten, können Sie diese auf dem Client bündeln (webpack, gulp, was auch immer) und dann ReactDOMServer.RenderToString auf dem Server verwenden.

Hier ist ein Blog-Post, die mir dies erreichen geholfen haben: https://www.terlici.com/2015/03/18/fast-react-loading-server-rendering.html

Verwandte Themen