2016-03-26 14 views
10

मैं react.js का उपयोग करना सीख रहा हूं और ईवेंट हैंडलर का उपयोग करने के लिए कुछ समस्याएं हैं। अंतिम सवाल यह होगा: क्या सर्वर साइड प्रतिपादन का उपयोग करना संभव है और ईवेंट हैंडलर को क्लाइंट को स्वचालित रूप से भेजना संभव है? मैं एक index.jsx जो मैं सर्वर साइड प्रस्तुत करना और ग्राहकReact.js सर्वरसाइड प्रतिपादन और ईवेंट हैंडलर

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> 
     ) 
    } 
}); 

लेकिन "बटन की तरह" किसी भी बातचीत नहीं है करने के लिए भेजने के लिए :

यहाँ मेरी उदाहरण है। इसे क्लिक करने के लिए कुछ करने के लिए मुझे यह कोड क्लाइंट पक्ष जोड़ना होगा।

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') 
); 

मैंने केवल प्रतिक्रिया.जेएस के साथ शुरुआत की और शायद मैं यहां कुछ प्रमुख अवधारणा खो रहा हूं। लेकिन पेज सर्वर पक्ष को प्रस्तुत करते समय प्रतिक्रिया.जेएस सिर्फ कोड (जिसे अब मुझे क्लाइंट में मैन्युअल रूप से जोड़ना है) क्यों नहीं बनाते? इस तरह, मेरे पास अनावश्यक कोड है और ऐसा लगता है कि यह बड़े अनुप्रयोगों में एक गड़बड़ होगी। कम से कम react.js दो LikeButtons को आकर्षित करने के लिए पर्याप्त स्मार्ट नहीं है बल्कि क्लाइंट साइड घटक में बनाए गए सर्वर पक्ष को "बाध्य" करने के लिए पर्याप्त है।

+0

यह आपके प्रश्न से असंबंधित है, लेकिन मेरा मानना ​​है कि आपको ऑनक्लिक पर इसे पार करने से पहले हैंडलक्लिक फ़ंक्शन को बांधना है या अन्यथा इसका सही संदर्भ नहीं है। (लेकिन मुझे यकीन नहीं है कि जब आप बटन पर क्लिक करते हैं तो आपको त्रुटि क्यों नहीं मिलेगी क्योंकि इसे कॉल करते समय त्रुटि को फेंकना चाहिए .setState) –

+2

@actruong बाइंडिंग React.createClass का उपयोग करते समय आवश्यक नहीं है। यह ऑटो बांधता है। –

+1

@ jeffpc1993 ओह धन्यवाद यह इंगित करने के लिए धन्यवाद! –

उत्तर

12

क्लाइंट साइड इंटरैक्टिव रिएक्ट ऐप के लिए, आपको ऐप क्लाइंट पक्ष भी प्रस्तुत करना होगा। आम तौर पर यह कोड सर्वर पर चलने वाले कोड के समान होता है, इसलिए कोई अनावश्यक कोड नहीं है। यह सिर्फ वही कोड है। आप खुद से पूछ सकते हैं कि क्लाइंट और सर्वर दोनों पर प्रतिपादन अधिक हो सकता है, लेकिन एक प्रदर्शन और एसईओ बिंदु से यह सही समझ में आता है।

ReactDOMServer.renderToString(<MyApp foo={bar} />) मूल रूप से केवल मार्कअप के साथ एक स्ट्रिंग प्रस्तुत करता है। वहां कोई जावास्क्रिप्ट या कोई जादू नहीं है। बस सादा पुराना एचटीएमएल। हालांकि, प्रस्तुत मार्कअप में बहुत से प्रतिक्रिया आईडी विशेषताएँ हैं जिन्हें बाद में क्लाइंट पर प्रारंभिक वर्चुअल डॉम उत्पन्न करने और ईवेंट संलग्न करने के लिए उपयोग किया जाता है।

जब आप क्लाइंट पर फिर से अपना आवेदन प्रस्तुत करते हैं, उसी डीओएम तत्व पर जिसमें सर्वर पर आपके सर्वर पक्ष को मार्क इंजेक्शन दिया गया था, प्रतिक्रिया को पूरे एप्लिकेशन को फिर से निकालने की आवश्यकता नहीं है। यह सिर्फ एक नया वर्चुअल डोम पेड़ बनाता है, इसे प्रारंभिक वर्चुअल डोम पेड़ के साथ अलग करता है, और यदि आवश्यक हो तो आवश्यक डीओएम ऑपरेशंस करता है। आभासी डीओएम की यह अवधारणा पहले स्थान पर इतनी तेजी से प्रतिक्रिया देती है। उसी प्रक्रिया में, आपके आवेदन में परिभाषित किए गए किसी भी ईवेंट श्रोताओं को पहले से ही प्रस्तुत किए गए मार्कअप से जोड़ा जाएगा।

यह सब वास्तव में तेज़ होता है। और आपके पास सर्वर साइड रेंडर पेज का लाभ है (जिसे सर्वर पर कैश किया जा सकता है, वार्निश या कुछ इसी तरह का उपयोग करके) कि खोज इंजन क्रॉल हो जाएंगे, उपयोगकर्ताओं को प्रारंभिक रेंडर देखने के लिए कुछ भी इंतजार करने की आवश्यकता नहीं है, और पृष्ठ मूल रूप से उन उपयोगकर्ताओं के लिए काम करता है जिन्होंने जावास्क्रिप्ट को अक्षम कर दिया है।

+0

आपके उत्तर के लिए धन्यवाद। क्या आपको वार्निश के साथ प्रतिक्रिया का उपयोग करने के लिए अच्छा लेख पता है? –

21

यह व्यवहार वास्तव में सर्वर पक्ष प्रतिपादन के कारण है। सबसे पहले आपको क्लाइंट साइड और सर्वर दोनों तरफ एक ही कोड को चलाने होंगे। यह एक आइसोमोर्फिक एप्लिकेशन कहा जाता है। एक जो सर्वर और क्लाइंट दोनों पर चलता है।
तो, ReactDOM.renderToString(<Component>) पर केवल HTML को स्ट्रिंग के रूप में प्रस्तुत किया जाता है। आपके घटक की रेंडर विधि का मूल्यांकन किया जाता है और आरंभिक प्रतिपादन के लिए आवश्यक HTML उत्पन्न होता है।
जब क्लाइंट पर एक ही कोड चलाया जाता है, प्रतिक्रिया एचटीएमएल प्रस्तुत करता है और आवश्यक स्थानों पर जेएस को जोड़ता है। प्रतिक्रिया इस तरह से स्मार्ट है, यह क्लाइंट साइड पर फिर से सब कुछ फिर से प्रस्तुत नहीं करता है। बस कोड का मूल्यांकन करता है और यह पहचानता है कि सभी डीओएम तत्व दिए जाने पर react-id के आधार पर कोड को संलग्न करने के लिए कहां दिया जाता है। (यदि आप तत्व को किसी भी प्रतिक्रिया ऐप का निरीक्षण करते हैं तो आप प्रतिक्रिया-आईडी करेंगे)

अब कोई पूछ सकता है कि एक ही चीज़ को दो बार प्रस्तुत करने का क्या फायदा है?
और उत्तर उपयोगकर्ता द्वारा perceived loading time है। और जेएस को अक्षम करने वाले उपयोगकर्ताओं के लिए कुछ न्यूनतम देखने भी।

ग्राहक प्रदान की गई आवेदन
यह कैसे एक पूरी तरह से ग्राहक प्रदान की गई आवेदन काम करता है। (प्रदान की गई क्लाइंट अनुप्रयोग भी प्रतिक्रिया)

client rendered app

उपयोगकर्ता केवल सभी कंकाल एचटीएमएल के बाद सामग्री नहीं देख पाएंगे, जे एस बंडलों (जो अक्सर बहुत बड़ी हैं), और डेटा प्राप्त किए गए और मूल्यांकन किया जाता है। जिसका मतलब है कि उपयोगकर्ता को कुछ समय तक स्पिनर या लोडिंग स्क्रीन पर थोड़ी देर तक देखना होगा जब तक कि सब कुछ लोड न हो जाए।

isomorphic आवेदन (क्लाइंट और सर्वर पर दोनों चलाता है)
कैसे एक isomorphic आवेदन काम करता है,
server rendered app
इस मामले में सर्वर आपके घटक के मूल्यांकन से पूर्ण एचटीएमएल उत्पन्न करता है। और जैसे ही HTML डाउनलोड हो जाता है, उपयोगकर्ता तुरंत सामग्री देखेगा। हालांकि जेएस बंडलों को डाउनलोड और मूल्यांकन करने के बाद ऐप केवल पूरी तरह से कार्य करेगा और का मूल्यांकन करेगा। इसलिए जेएस को दोनों तरफ
पर चलाना है, इस प्रकार उपयोगकर्ता पहले से कहीं अधिक तेज़ी से सामग्री देखता है। इसलिए कथित लोडिंग समय में भारी कमी।

+7

मैंने @dannyjolie उत्तर को सही के रूप में चिह्नित किया क्योंकि यह मेरे प्रश्न का उत्तर देता है और पहले पोस्ट किया गया था। लेकिन अभी भी मेरे प्रश्न का उत्तर देने के आपके प्रयास के लिए धन्यवाद। इससे मुझे प्रतिक्रिया मिली कि कैसे प्रतिक्रिया.जेएस काम करता है और यह किस अवधारणा का पालन करता है, इसकी बेहतर समझ प्राप्त करने में मुझे बहुत मदद मिली! – Jodo

संबंधित मुद्दे