2016-10-13 17 views
7

Hiện tại, phương thức hiển thị chỉ có thể trả về một phần tử/thành phần. Xem: hereLàm cách nào để hiển thị nhận xét HTML trong React?

Trong các cuộc thảo luận dưới vé là một số gợi ý để quấn nhiều yếu tố trở về từ một thành phần Phản ứng trong một chú thích HTML để các thành phần gói bị bỏ qua bởi trình duyệt, ví dụ:

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

sẽ làm cho đến:

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

Nhưng làm cách nào để tạo thành phần chỉ hiển thị nhận xét HTML? Nói cách khác, hàm render của thành phần 'fragment' trong ví dụ trên có thể trông như thế nào?

+1

Người đăng nhận xét đó không hiểu cách React hoạt động. Lưu ý rằng không ai trong số những người đề xuất nó sẽ hoạt động. Đối với một điều, nó không giải quyết vấn đề cốt lõi; kết quả là bốn nút (nút nhận xét, hai nút phần tử, và sau đó là nút nhận xét), không phải là một nút duy nhất. –

+0

Sự hiểu biết của tôi là hàm render của Fragment sẽ chỉ trả về thành phần Fragment với hai thành phần con 'c' và 'd'. Vì vậy, thẻ đóng '/ fragment' trong bình luận thứ hai. Ngoài ra, có vẻ như kỹ thuật đã được sử dụng để thực hiện một thành phần mảnh trong mwiencek/fork fork trong cam kết dcc972c414, nhưng tôi có thể sai. – Amiramix

Trả lời

8

Đây là những gì tôi đã kết thúc với một trong các dự án gần đây của tôi:

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; 

Vì vậy, bạn có thể sử dụng nó như thế này:

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

Cảm ơn, nhưng theo như tôi hiểu mã này nó không trả lời câu hỏi của tôi. Mục đích của tôi không phải là trả lời bình luận trong React mà để trả về từ hàm render một phần tử duy nhất, làm cho hai bình luận, một ở trên và một bên dưới các con của nó. Nói cách khác, tôi sẽ có thể sử dụng nó như thế này: '' và nó sẽ hiển thị cho trẻ có hai ý kiến, một ở trên và bên dưới, như trong ví dụ trong câu hỏi của tôi. – Amiramix

0

Cách bạn đang có kế hoạch để làm won này 't làm việc với một giải pháp phản ứng vani đơn giản. Tuy nhiên, bạn có thể xác định thành phần web tùy chỉnh chuyển đổi thành nhận xét HTML và trả về từ trong trình bao bọc React. Một thành phần ví dụ được thực hiện here. Để sử dụng trong React, hãy tham khảo this url.

Cập nhật 19/01/2017

Vì vậy, đây là lý thuyết chưa được kiểm tra, nhưng các thành phần web có thể là một cái gì đó giống như -

`` `

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

` ``

Lưu ý rằng các con bên trong là html thuần túy, không phải React. Tuy nhiên, bạn cũng có thể thử nghiệm với việc tăng cường mã lên support React Components.

+0

Xin chào, tôi có thể thấy điều này sẽ không hoạt động vì thành phần nhận xét sẽ cần hiển thị hai nhận xét, một ở trên và một bên dưới các con được chuyển đến nó thay vì hiển thị các con của nó bên trong nhận xét. – Amiramix

+0

Tôi hiểu yêu cầu của bạn từ câu hỏi, nhưng về mặt kỹ thuật, nhận xét html không phải là phần tử vùng chứa. Những gì bạn có ở đây là hai bình luận khác nhau. Mặc dù ví dụ của bạn có thẻ '' và '' được đính kèm trong chúng, đánh dấu kết quả vẫn là bốn phần tử HTML độc lập, bao gồm các thành phần 'C' và' D'. Vì vậy, thay vì cố gắng xem xét hai bình luận là một phần tử ảo với các thẻ mở và đóng khác nhau, xem chúng như anh chị em của C và D. XHTML rất rõ ràng trên các thẻ chứa, thẻ phải giống nhau, ngoại trừ thẻ đóng chứa '/'. – hazardous

+0

Tôi không nghĩ rằng bạn hiểu yêu cầu của tôi. Mục đích của tôi không phải là đưa ra một nhận xét HTML nhưng để tạo ra một thành phần bao bọc xung quanh các React children 1. có thể được trả về như một phần tử từ hàm render và 2. được trả về dưới dạng hai chú thích trong HTML, một cái trước các em kết xuất và một một sau khi trẻ em kết xuất. – Amiramix

4

Sử dụng dấu ngoặc nhọn, sao cho bạn có thể sử dụng nhận xét javascript /* */.

<a> 
    <b></b> 
    {/*<fragment data-reactid="">*/} 
     <c></c> 
     <d></d> 
    {/*</fragment>*/} 
    <e></e> 
</a> 
Các vấn đề liên quan