2015-06-26 17 views
14

Tôi đang cố gắng sử dụng các lớp học ES6 bên trong Phản ứng, và muốn tất cả các thành phần của tôi để kế thừa phương pháp nhất định, tuy nhiên ngay sau khi tôi cố gắng để mở rộng một thành phần mà mở rộng Phản ứng. Lớp thành phần, phương thức componentDidMount không kích hoạt và do đó không có gì được hiển thị. Mã Tôi đang sử dụng:phương pháp componentDidMount không được kích hoạt khi sử dụng ES6 thừa hưởng phản ứng lớp

BaseComponent.jsx

import React from 'react'; 

class BaseComponent extends React.Component { 

    constructor() { 
     super(); 
     console.log('BaseComponent constructor'); 
    } 

    render() { 
     return (
      <div>Hello, Im the base component</div> 
     ); 
    } 
} 

export default BaseComponent; 

ExampleComponent.jsx

import BaseComponent from './BaseComponent'; 

class ExampleComponent extends BaseComponent { 
    constructor(props) { 

     super(props); 
    } 

    componentDidMount() { 
     console.log('exampleComponent mounted'); 
    } 

    render() { 
     return (
      <div>Hello, Im the example component</div> 
     ); 
    } 
} 

export default ExampleComponent; 

App.jsx

import React from 'react'; 
React.render(<ExampleComponent />, document.body); 

Tôi đang sử dụng Phản ứng 0.13.3, và sử dụng babelify 6.1.2 để transpile.

Chuỗi 'exampleComponent gắn' không bao giờ được ghi lại để an ủi, và không có gì là ra. Bất kỳ ý tưởng những gì tôi đang làm sai?

Trả lời

2

Tôi nghĩ, vấn đề là bạn không thể tạo cấu trúc lớp sâu hơn cho các thành phần phản ứng. Ngoài ra, bạn không cần phải có nó. Trên ví dụ của bạn, BaseComponent là vô dụng.

Hãy thử điều này thay vì:

import React from 'react'; 

export default class ExampleComponent extends React.Component { 
    constructor(props) { 
     super(props); 
    } 

    componentDidMount() { 
     console.log('exampleComponent mounted'); 
    } 

    render() { 
     return (
      <div>Hello, Im the example component</div> 
     ); 
    } 
} 

Nếu bạn muốn tạo 'BaseComponents', bạn có thể thực hiện chúng như mixins hoặc đơn giản là 'tiểu thành phần'.

này có thể xem như thế này:

import React from 'react'; 
import BaseComponent from './BaseComponent'; 

export default class ExampleComponent extends React.Component { 
    constructor(props) { 
     super(props); 
    } 

    componentDidMount() { 
     console.log('exampleComponent mounted'); 
    } 

    render() { 
     return (
      <div> 
       <div>Hello, Im the example component</div> 
       <BaseComponent /> 
      </div> 
     ); 
    } 
} 

EDIT: Cũng có thể:

import React from 'react'; 
import BaseComponent from './BaseComponent'; 

export default class ExampleComponent extends React.Component { 
    constructor(props) { 
     super(props); 
    } 

    componentDidMount() { 
     console.log('exampleComponent mounted'); 
    } 

    render() { 
     return (
      <BaseComponent 
       <div>Hello, Im the example component</div> 
      </BaseComponent> 
     ); 
    } 
} 

// BaseComponent.js 
render() { 
    return { 
     <div> 
      <div>Hello, Im the base component</div> 
      {this.props.children} 
     </div> 
    } 
} 

EDIT # 2: Trên đang hoạt động tốt với ES5/jsx cú pháp.

DEMO

+1

Vâng, tôi biết ví dụ này là vô ích, nhưng tôi chỉ làm điều này để làm nổi bật vấn đề. Tôi không biết rằng React không cho phép cấu trúc lớp sâu hơn. Dự án của tôi bao gồm một loạt các mẫu có chức năng chung (và chia sẻ cùng một trạng thái), do đó, nó có ý nghĩa để cố gắng đặt điều này trong một lớp cơ sở. Tôi cũng đã đọc các mix-in đó không có sẵn khi sử dụng các lớp React của ES6 - bạn có biết xung quanh điều này không? –

+0

khi bạn có một số thành phần có cùng trạng thái, bạn có thể sử dụng ví dụ thứ hai của mình. Tạo một thành phần mới với các thuộc tính trạng thái và làm cho phần (s), luôn luôn giống nhau và hiển thị nó trong thành phần cụ thể của bạn như bạn có thể thấy ở trên. – marcel

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