2016-02-09 13 views
6

Tôi chỉ đang học React và tôi đang viết các thành phần sử dụng cú pháp ES7. Ý tưởng của tôi là tạo ra một thành phần cơ bản sẽ chứa một số phương thức mà tôi muốn tất cả các thành phần có nguồn gốc có. Ví dụ, tôi muốn thực hiện valueLink without the mixin, cho ràng buộc hai chiều trong tất cả các thành phần của tôi. Đây là ý tưởng của tôi:Có thực hành tốt để tạo các thành phần cơ sở và sau đó mở rộng chúng trong React không?

class MyComponent extends React.Component { 

    bindTwoWay(name) { 
     return { 
      value: this.state[name], 
      requestChange: (value) => { 
       this.setState({[name]: value}) 
      } 
     } 
    }; 
} 

 

class TextBox extends MyComponent { 
    state = { 
     val: '' 
    }; 

    render() { 
     return (<div> 
      <input valueLink={this.bindTwoWay('val')}/> 
      <div>You typed: {this.state.val}</div> 
     </div>) 
    } 
} 

Và nó hoạt động tốt. Tuy nhiên, tôi không thể tìm thấy nhiều thông tin về phương pháp này. Nó không phải về valueLink, đó chỉ là một ví dụ. Ý tưởng là có một số phương thức trong một thành phần cơ sở và sau đó mở rộng thành phần đó để các thành phần có nguồn gốc có tất cả các phương thức đó, giống như cách OOP thông thường. Vì vậy, tôi chỉ muốn biết nếu điều này là hoàn toàn tốt đẹp hoặc có một số sai sót mà tôi không biết. Cảm ơn.

+1

Hầu hết mọi người sẽ nói "không". Ưu tiên thành phần trên thừa kế. Tuy nhiên, điều đó không phải lúc nào cũng hiệu quả, bạn có thể là một trong những trường hợp này. * "hoặc có một số sai sót" * Sự khác biệt lớn nhất giữa thừa kế và mixin là một lớp có thể sử dụng nhiều mixin, nhưng nó chỉ có thể có một phụ huynh. Điều đó làm cho thừa kế kém linh hoạt hơn nhiều. –

+1

+1 đến @FelixKling, thành phần trên thừa kế nếu có thể. Tôi muốn nhìn thấy một thành phần đã làm một cái gì đó như 'const bindTwoWay = require ('../ mixins/bindTwoWay')' rõ ràng hơn so với theo đuổi một cái gì đó trong một hệ thống phân cấp lồng nhau. –

+0

@FelixKling tôi thấy quan điểm của bạn, nhưng vẫn còn, thậm chí nếu lớp có thể có một phụ huynh, và nếu tôi thực sự chỉ cần một phụ huynh, đây vẫn sẽ là điều hoàn toàn tốt đẹp để làm, phải không? Vì chúng ta không thể sử dụng mixins với cú pháp ES6 ... – tuks

Trả lời

3

này là hoàn toàn tốt, nó chỉ là thừa kế cơ bản. Thông báo trước về việc sử dụng thừa kế để thay thế mixin là không có nhiều thừa kế, vì vậy bạn không thể cung cấp cho các tính năng TextBox của nhiều lớp cơ sở như khi bạn cung cấp cho nó nhiều mixin. Để giải quyết vấn đề này, bạn có thể sử dụng component composition. Trong trường hợp thành phần của bạn sẽ không làm việc trực tiếp như bạn đã xác định trong ví dụ nhưng có một giải pháp cho việc này.

Trước tiên, bạn cần phải xác định một thành phần sáng tác

export default (ComposedComponent) => { 
    class MyComponent extends React.Component { 
    constructor(props, state) { 
     super(props, state); 
     this.state = { 
     val: '' 
     }; 
    } 
    bindTwoWay(name) { 
     return { 
     value: this.state[name], 
     requestChange: (value) => { 
      this.setState({[name]: value}) 
     } 
     }; 
    } 

    render() { 
     return (
     <ComposedComponent 
      {...this.props} 
      {...this.state} 
      bindTwoWay={this.bindTwoWay.bind(this)} 
     /> 
     } 
    } 
    } 

    return MyComponent 
} 

Và sau đó bạn xác định thành phần của bạn, nơi bạn cần một số đặc điểm chung

import compose from 'path-to-composer'; 

class TextBox extends React.Component { 
    render() { 
    return (
     <div> 
     <input valueLink={this.props.bindTwoWay('val')}/> 
     <div>You typed: {this.props.val}</div> 
     </div> 
    ) 
    } 
} 

export default compose(TextBox) 

tôi đã không kiểm tra này, nhưng nó cũng làm việc.

+1

Ths sẽ không hoạt động. Nó phải là '{this.props.val}' thay vì '{this.state.val}'. Và bạn nên thực hiện khởi tạo trong thành phần thứ tự cao hơn. – fl0cke

+3

@ fl0cke Bạn đúng, sửa các ví dụ. –

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