How to render a HTML comment in React?

前端 未结 4 1433
有刺的猬
有刺的猬 2020-12-09 15:27

Currently the render method can only return a single element/component. See: here

In the discussion under that ticket some suggest to wrap multiple elements returned

相关标签:
4条回答
  • 2020-12-09 15:58

    Here's another novel approach if you need this to work with SSR.

    Here's a MaxWidth component I am using with my react-based email tool called Myza.

    import ReactDOMServer from 'react-dom/server'
    
    export const MaxWidth = ({ maxWidth = 0, className, children }: IMaxWidthProps) => {
      const renderedChildren = ReactDOMServer.renderToStaticMarkup(
        <div className={className} style={{ maxWidth: `${maxWidth}px`, margin: '0 auto' }}>
          {children}
        </div>
      )
    
      return <div dangerouslySetInnerHTML={{
        __html: `
        <!--[if mso]><center><table><tr><td width="${maxWidth}"><![endif]-->
        ${renderedChildren}
        <!--[if mso]> </td></tr></table></center><![endif]-->
      ` }}
      />
    }
    
    0 讨论(0)
  • 2020-12-09 16:00

    This is what I have ended up with in one of my recent projects:

    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;
    

    So you can use it like this:

    <A>
        <B></B>
        <ReactComment text="<fragment>" />
            <C></C>
            <D></D>
         <ReactComment text="</fragment>" />
        <E></E>
    </A>
    
    0 讨论(0)
  • 2020-12-09 16:00

    Assuming you are on React 16.8+ you may use a small functional component which lets you provide a text property and render an html comment.

    import React, {useEffect, useRef} from 'react';
    
    const ReactComment = ( props ) => {
        const el = useRef();
        useEffect( () => {
            el.current.outerHTML = `<!-- ${props.text} -->`;
        }, [] );
        return (
            <div ref={el}/>
        );
    };
    
    export default ReactComment;
    

    You may then use it like so

    <A>
        <B></B>
        <ReactComment text="<fragment>" />
            <C></C>
            <D></D>
         <ReactComment text="</fragment>" />
        <E></E>
    </A>
    
    0 讨论(0)
  • 2020-12-09 16:06

    Edit: For those who found this answer useful, checkout this answer instead!

    The posted problem is not asking for comment style in React!


    Use curly brackets, such that you can use javascript comment /* */.

    <a>
        <b></b>
        {/*<fragment data-reactid="">*/}
            <c></c>
            <d></d>
        {/*</fragment>*/}
        <e></e>
    </a>
    
    0 讨论(0)
提交回复
热议问题