2016-10-13 13 views
7

वर्तमान में रेंडर विधि केवल एक तत्व/घटक लौटा सकती है। देखें: hereप्रतिक्रिया में एक HTML टिप्पणी कैसे प्रस्तुत करें?

चर्चा में है कि टिकट के तहत कुछ जैसे एक HTML टिप्पणी में एक प्रतिक्रिया घटक से लौटे एक से अधिक तत्वों रैप करने के लिए सुझाव है ताकि रैपिंग घटक ब्राउज़र द्वारा नजरअंदाज कर दिया है,:

<A> 
    <B></B> 
    <Fragment> 
     <C></C> 
     <D></D> 
    </Fragment> 
    <E></E> 
</A> 

प्रस्तुत करना होगा करने के लिए:

<a> 
    <b></b> 
    <!--<fragment data-reactid="">--> 
     <c></c> 
     <d></d> 
    <!--</fragment>--> 
    <e></e> 
</a> 

लेकिन वास्तव में एक घटक कैसे बनाएं जो केवल HTML टिप्पणी प्रस्तुत करता हो? दूसरे शब्दों में, ऊपर दिए गए उदाहरण में 'खंड' घटक का कार्य कैसे प्रस्तुत किया जा सकता है?

import React, {Component, PropTypes} from 'react'; 
import ReactDOM from 'react-dom'; 

class ReactComment extends Component { 
    static propTypes = { 
     text: PropTypes.string, 
     trim: PropTypes.bool 
    }; 

    static defaultProps = { 
     trim: true 
    }; 

    componentDidMount() { 
     let el = ReactDOM.findDOMNode(this); 
     ReactDOM.unmountComponentAtNode(el); 
     el.outerHTML = this.createComment(); 
    } 

    createComment() { 
     let text = this.props.text; 

     if (this.props.trim) { 
      text = text.trim(); 
     } 

     return `<!-- ${text} -->`; 
    } 

    render() { 
     return <div />; 
    } 
} 

export default ReactComment; 

तो आप इसे इस प्रकार उपयोग कर सकते हैं:

+1

उस टिप्पणी को पोस्ट करने वाले व्यक्ति को यह समझ में नहीं आया कि प्रतिक्रिया कैसे काम करती है। ध्यान दें कि जो भी सुझाव दिया है वह काम नहीं करेगा। एक बात के लिए, यह मूल मुद्दे को संबोधित नहीं करता है; नतीजा चार नोड्स (एक टिप्पणी नोड, दो तत्व नोड्स, और फिर एक टिप्पणी नोड) है, न कि एक नोड। –

+0

मेरे समझ गया था कि टुकड़ा के समारोह प्रस्तुत करना केवल दो बच्चों घटकों 'सी' और 'डी' के साथ टुकड़ा घटक लौट आते हैं। इसलिए दूसरी टिप्पणी में समापन टैग '/ खंड'। साथ ही, ऐसा लगता है कि तकनीक का उपयोग dw972c414 में mwiencek/प्रतिक्रिया कांटा में एक खंड घटक को लागू करने के लिए किया गया है, लेकिन मैं गलत हो सकता हूं। – Amiramix

उत्तर

8

यह है कि मैं क्या मेरी हाल ही में परियोजनाओं में से एक के साथ समाप्त हो गया है

<A> 
    <B></B> 
    <ReactComment text="<fragment>" /> 
     <C></C> 
     <D></D> 
    <ReactComment text="</fragment>" /> 
    <E></E> 
</A> 
+0

धन्यवाद, लेकिन जहां तक ​​मैं इस कोड को समझता हूं, यह मेरे प्रश्न का उत्तर नहीं देता है। मेरा लक्ष्य प्रतिक्रिया में एक टिप्पणी प्रस्तुत नहीं करना है, लेकिन एक रेंडर फ़ंक्शन से एक तत्व को वापस करने के लिए, जो दो टिप्पणियों को प्रस्तुत करता है, एक ऊपर और उसके बच्चों के नीचे एक। और '' यह दो टिप्पणी, ऊपर एक और नीचे एक, मेरे सवाल में उदाहरण के रूप में के साथ बच्चों प्रस्तुत करना चाहिए: दूसरे शब्दों में, मैं इस तरह इसका इस्तेमाल करने में सक्षम होना चाहिए। – Amiramix

0

जिस तरह से आप यह जीता करने के लिए योजना बना रहे हैं एक सादा वेनिला प्रतिक्रिया समाधान के साथ काम नहीं करते हैं। हालांकि, आप एक कस्टम वेब घटक को परिभाषित कर सकते हैं जो HTML टिप्पणियों में परिवर्तित हो जाता है और इसे एक रिएक्ट रैपर के भीतर से वापस कर देता है। एक उदाहरण घटक here लागू किया गया है। प्रतिक्रिया में उपयोग के लिए, this url देखें।

अद्यतन 19/01/2017

तो यह अपरीक्षित सिद्धांत है, लेकिन वेब घटक की तरह कुछ हो सकता है -

`` `

/** 
* <react-comment-sentinel> Web Component 
* 
* @usage 
* <react-comment-sentinel sentinel="fragment"><div>Hello there!</div></react-comment-sentinel> 

* @result 
* <!-- <fragment> --><div>Hello there!</div><!-- </fragment> --> 
*/ 
var proto = Object.create(HTMLElement.prototype, { 
name: { get: function() { return 'React HTML Comment'; } }, 
createdCallback: { value: function() { 

    /** 
    * Firefox fix, is="null" prevents attachedCallback 
    * @link https://github.com/WebReflection/document-register-element/issues/22 
    */ 
    this.is = ''; 
    this.removeAttribute('is'); 
} }, 
attachedCallback: { value: function() { 
    var tag = this.attributes("sentinel"); 
    this.outerHTML = '<!-- <' + tag + '> -->' + this.innerHtml + '<!-- </' + tag + '> -->'; 
} } 
}); 
document.registerElement('react-comment-sentinel', { prototype: proto }); 

` ``

ध्यान दें कि आंतरिक बच्चे सादे एचटीएमएल हैं, प्रतिक्रिया नहीं। हालांकि, आप कोड को support React Components पर बढ़ाने के साथ भी प्रयोग कर सकते हैं।

+0

हाय, जहाँ तक मैं देख सकता हूँ यह या तो काम नहीं करेगा क्योंकि टिप्पणी घटक दो टिप्पणी, ऊपर एक और बच्चों के बजाय टिप्पणी के अंदर अपने बच्चों प्रतिपादन की तुलना में यह करने के लिए पारित किया नीचे एक रेंडर करने के लिए की आवश्यकता होगी। – Amiramix

+0

मैं प्रश्न से आपकी आवश्यकता को समझता हूं, लेकिन तकनीकी रूप से एक HTML टिप्पणी कंटेनर तत्व नहीं है। आपके पास यहां दो अलग-अलग टिप्पणियां हैं। यद्यपि आपके उदाहरण में ' 'टैग और'' टैग संलग्न है, परिणामी मार्कअप अभी भी चार स्वतंत्र HTML तत्व हैं, जिनमें 'सी' और' डी' घटक शामिल हैं। तो अलग-अलग खुले और करीबी टैग वाले एक वर्चुअल तत्व के रूप में दो टिप्पणियों को देखने की कोशिश करने के बजाय, उन्हें सी और डी एक्सएचटीएमएल के भाई बहन के रूप में देखें कंटेनर टैग पर बहुत स्पष्ट है, टैग को बंद टैग के अलावा '/'। – hazardous

+0

मुझे नहीं लगता कि आप मेरी आवश्यकताओं को समझते हैं। मेरा इरादा एचटीएमएल टिप्पणी प्रस्तुत नहीं करना है, लेकिन रिएक्ट बच्चों के चारों ओर एक रैपर घटक बनाने के लिए 1. रेंडर फ़ंक्शन से एक तत्व के रूप में वापस किया जा सकता है और 2. एचटीएमएल में दो टिप्पणियों के रूप में प्रस्तुत किया जाता है, एक से पहले प्रस्तुत बच्चों और दूसरे प्रस्तुत बच्चों के बाद एक। – Amiramix

4

उपयोग कर्ली कोष्ठक, इस तरह है कि आप जावास्क्रिप्ट टिप्पणी /* */ उपयोग कर सकते हैं।

<a> 
    <b></b> 
    {/*<fragment data-reactid="">*/} 
     <c></c> 
     <d></d> 
    {/*</fragment>*/} 
    <e></e> 
</a> 
संबंधित मुद्दे