2014-10-05 27 views
5

Vẫn còn các câu hỏi ngu ngốc về ReactJS =) Có cách nào để thêm các hàm công cộng vào các thành phần React không? Tôi đang cố gắng thực hiện một cái gì đó như thế này:Các hàm thành phần ReactJS

var LoginForm = React.createClass({ 
    getInitialState: function() { 
    }, 
    render: function() { 
    }, 
    MyFunc: function() { 
    } 
}) 
... 
var login_form = LoginForm({}); 
React.renderComponent(login_form, document.body); 
... 
login_form.MyFunc(); <-- error 

Bạn có thể giải thích những gì tôi đang làm không?

Trả lời

12

Bạn không được phép sử dụng phương thức của thành phần bên ngoài chính thành phần đó (hoặc bằng cách chuyển nó thành một cuộc gọi lại đến một thành phần con). Bạn nên coi đây là phương pháp riêng tư.

Tuy nhiên, bạn có thể sử dụng tính năng Phản ứng được gọi là statics để cung cấp các chức năng mà có sẵn từ bên ngoài thành phần. Tuy nhiên, chúng nên được coi là các hàm tĩnh của một lớp, và kết quả là chúng không có quyền truy cập vào nội bộ của một cá thể của thành phần của bạn (chẳng hạn như this.props hoặc this.state).

Dưới đây là một ví dụ về một số thiết lập tĩnh cho một thành phần:

var Component = React.createClass({ 
    statics: { 
     // these functions are available outside the component 
     renderToBody: function() { 
      React.renderComponent(
       <Component />, 
       document.body 
      ); 
     } 
    }, 

    // cannot access this function outside the component 
    getHelloWorld: function() { 
     return 'Hello World!'; 
    }, 

    render: function() { 
     return (
      <div>{this.getHelloWorld()}</div> 
     ); 
    } 
}); 

Vì vậy, nếu chúng ta gọi là React.renderComponent(Component({}), elem) sau đó các thành phần sẽ trả cho elem nhưng vì sự tĩnh bạn có thể gọi Component.renderToBody() và nó sẽ làm cho các thành phần trực tiếp thành phần <body>.

IE: Các hàm được xác định bên trong đối tượng statics của thành phần có sẵn trực tiếp dưới dạng hàm tĩnh. Tuy nhiên, bạn phải nhớ rằng chúng là static ở chỗ chúng là không phải là một phần của đối tượng thành phần được tạo ra, chúng chỉ là các hàm bạn có thể gọi trên lớp.

Toàn bộ ý tưởng có phản ứng là các thành phần được tự cung cấp càng tốt. Bạn không bao giờ cần phải truy cập vào một hàm thành phần trực tiếp từ bên ngoài một thành phần như những gì bạn nên làm thay vì chỉ thay đổi các đạo cụ cho thành phần và tái render nó để nó, bên trong, có thể thay đổi.

Dưới đây là một ví dụ về điều đó:

var Component = React.createClass({ 
    propTypes: { 
     // always get in the habbit of using propTypes! 
     message: React.PropTypes.string.isRequired, 

     show:  React.PropTypes.bool 
    }, 
    render: function() { 
     return (
      <div style={{display: this.props.show ? 'block' : 'none'}}> 
       {this.props.message} 
      </div> 
     ); 
    } 
}); 

Trong khi bạn có thể đã tạo ra một phương pháp show() trên thành phần thay vì (để bạn có thể làm component.show(true) hoặc component.show(false) để hiển thị/ẩn - bạn thay vì vượt qua nó như một tài sản cho kết quả tương tự.

Calling React.renderComponent(Component({message: 'foo', show: true}), elem) sẽ làm cho rõ ràng, tái rendering với show: false sẽ giấu nó, vv kết quả tương tự thành phần, nhưng với đạo cụ, mà là cách phản ứng.

+0

Cảm ơn bạn rất nhiều Mike, bạn đã giúp tôi rất nhiều! Tôi có thể hỏi câu hỏi cuối cùng không? Theo tôi hiểu tôi có thể gắn kết nhiều thành phần vào một nút? Vì vậy, tôi có thể giải quyết chúng? Ví dụ: nếu tôi đặt 3 thành phần hợp lý và sau đó muốn ẩn thứ hai. – KaronatoR

+1

Bạn chỉ có thể gắn kết một thành phần trên một phần tử html đã cho. Tuy nhiên, một trong những cách tốt nhất để đối phó với nhiều thành phần là gắn kết một thành phần cha và sau đó chỉ cần thực hiện mọi thứ khác mà bạn cần một đứa con của cha mẹ đó. Nhưng có, bạn có thể lặp và gắn kết nhiều phiên bản của cùng một thành phần. Trong phản ứng, điều này đơn giản như việc lặp và đẩy các thành phần vào một mảng, sau đó kết xuất mảng bên trong hàm 'render' của một thành phần như'

{yourArray}
' –

0

Câu trả lời đơn giản là LoginForm ({}) không trả lại thành phần. Nó trả về một đối tượng mô tả sẽ được React sử dụng để khởi tạo thành phần sau này. Có hai cách để bạn có thể truy cập các thành phần thực tế:

  • như this trong các phương pháp thành phần
  • bằng cách cho các thành phần một prop ref=name; thành phần thực tế sẽ có sẵn trong trình tạo, như this.refs. tên vào thời điểm người sáng tạo thực hiện componentDidMount.

http://facebook.github.io/react/docs/more-about-refs.html

0

Có thể bằng cách sử dụng kết quả của hàm rendering:

var login_form = React.renderComponent(LoginForm({}), document.body); 
login_form.MyFunc(); 
login_form.setProps({loaded: true}); 

Các trường hợp sử dụng cho việc này là bạn có thể gọi setProps trên thành phần gốc (nhưng chỉ trên nguồn gốc).

Các vấn đề liên quan