如何在React中呈现HTML评论?

目前渲染方法只能返回一个元素/组件。 看这里

在该票证下的讨论中,有人建议在HTML注释中包装从React组件返回的多个元素,以便浏览器忽略包装组件,例如:

<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注释的组件? 换句话说,上面例子中'fragment'组件的渲染函数是怎么样的?


这是我最近在其中一个项目中结束的事情:

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>

编辑:对于那些认为这个答案有用的人,请结束这个答案!

发布的问题不是在React中要求评论风格!


使用大括号,以便您可以使用javascript注释/* */

<a>
    <b></b>
    {/*<fragment data-reactid="">*/}
        <c></c>
        <d></d>
    {/*</fragment>*/}
    <e></e>
</a>

您计划执行此操作的方式不适用于普通的vanilla React解决方案。 但是,您可以定义一个自定义Web组件,将其转换为HTML注释并从React包装器中返回。 这里实现了一个示例组件。 要在React中使用,请参阅此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 });

```

请注意,内部孩子是纯html,而不是React。 但是,您可以尝试增强代码以支持React组件。

链接地址: http://www.djcxy.com/p/52051.html

上一篇: How to render a HTML comment in React?

下一篇: Loop in react