2016-10-13 6 views
7

現在、レンダリングメソッドは単一の要素/コンポーネントのみを返すことができます。参照:hereReactにHTMLコメントを表示するには?

を議論においてそのチケットの下でラッピングコンポーネントがブラウザによって無視されるように、いくつかは、例えば、HTMLのコメントで反応コンポーネントから返された複数の要素をラップすることをお勧め:

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

レンダリングうto:

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

実際にHTMLコメントだけを表示するコンポーネントを実際に作成するにはどうすればよいですか?言い換えれば、上記の例の 'fragment'コンポーネントのレンダリング機能はどのように見えるのでしょうか?

+1

このコメントを投稿した人は、Reactの仕組みを理解していませんでした。それを提案した人は誰も働かないことに注意してください。 1つは、コアの問題に対処していないことです。その結果、1つのノードではなく、4つのノード(コメントノード、2つの要素ノード、およびコメントノード)が生成されます。 –

+0

私の理解では、フラグメントのレンダリング関数は、2つの子コンポーネント 'c'と 'd'を持つフラグメントコンポーネントのみを返します。したがって、2番目のコメントの終了タグ '/ fragment'。また、コミットdcc972c414のmwiencek/react forkにフラグメント・コンポーネントを実装する技術が使われていたようですが、間違いかもしれません。 – Amiramix

答えて

8

これは私が私の最近のプロジェクトのひとつになってしまったものです:

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; 

だから、あなたはこのようにそれを使用することができます:あなたはこのウォンを行うことを計画している

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

ありがとうございますが、このコードを理解する限り、私の質問には答えません。私の目的は、Reactにコメントを表示するのではなく、2つのコメントをその子の上と下にレンダリングする単一の要素をレンダリング関数から返すことです。言い換えれば、私は ''のように使うことができるはずです。私の質問の例のように、2つのコメントを1つ上と下に表示する必要があります。 – Amiramix

0

方法プレーンなバニラ反応液で作業する。ただし、HTMLコメントに変換してReactラッパーから返すカスタムWebコンポーネントを定義できます。コンポーネントの例はhereで実装されています。 Reactでの使用については、this urlを参照してください。

更新19/01/2017

だから、これは未テスト理論であるが、Webコンポーネントのようなものすることができます -

`` `

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

` ``

内部の子は、Reactではなく、プレーンhtmlであることに注意してください。ただし、コードをsupport React Componentsに拡張して試すこともできます。

+0

こんにちは、私が見ることができる限り、コメントコンポーネントは、コメントの中に子をレンダリングするのではなく、2つのコメントを1つ上に、もう1つ下に渡して子供に渡す必要があるため動作しません。 – Amiramix

+0

私はこの質問からあなたの要件を理解していますが、技術的にはHTMLコメントはコンテナ要素ではありません。あなたがここにあるのは、2つの異なるコメントです。あなたの例は ''タグと ''タグを含んでいますが、結果のマークアップは依然として 'C'と' D'コンポーネントを含む4つの独立したHTML要素です。そのため、2つのコメントを異なるオープンタグとクローズタグで1つの仮想要素として見ようとする代わりに、それらをCとDの兄弟として見ることができます。XHTMLはコンテナタグではっきりしています。/' – hazardous

+0

私の要件を理解しているとは思わない。私の意図は、HTMLコメントを表示するのではなく、Reactの子要素の周りにラッパーコンポーネントを作成することです.1はレンダリング関数から1つの要素として返され、2はHTMLの2つのコメントとしてレンダリングされます。レンダリングされた子の後に1つ。 – Amiramix

4

javascriptコメント/* */を使用できるように、中括弧を使用します。

<a> 
    <b></b> 
    {/*<fragment data-reactid="">*/} 
     <c></c> 
     <d></d> 
    {/*</fragment>*/} 
    <e></e> 
</a> 
関連する問題