2016-02-09 21 views
6

Sadece öğreniyorum React ve ben ES7 sözdizimini kullanarak bileşenler yazıyorum. Benim fikrim, tüm türetilmiş bileşenlerin sahip olmasını istediğim bazı yöntemleri içerecek bir temel bileşen oluşturmaktır. Örneğin, tüm bileşenlerimde iki yönlü bağlantı için valueLink without the mixin'u uygulamak istiyorum. İşte benim fikirdir:Temel bileşenler oluşturmak ve daha sonra bunları React içinde genişletmek iyi bir uygulamadır mı?

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>) 
    } 
} 

Ve sadece iyi çalışır. Ancak, bu yöntem hakkında fazla bilgi bulamadık. Bu değerLinkle ilgili değil, bu sadece bir örnek. Buradaki fikir, bir temel bileşende bazı yöntemlere sahip olmak ve daha sonra bu bileşeni genişletmek, böylece türetilen bileşenlerin olağan OOP yolu gibi tüm bu yöntemlere sahip olması. Bu yüzden, bunun gayet iyi olup olmadığını veya farkında olmadığım bazı kusurlar olduğunu bilmek isterim. Teşekkürler.

+1

Çoğu insan "hayır" derdi. Kalıtım üzerinde bileşimi tercih edin. Ancak, bu her zaman işe yaramıyor, sizinkilerden biri sizinkilerden biri olabilir. * "ya da bazı kusurlar var" * Kalıtım ve karışmalar arasındaki en büyük fark, bir sınıfın birçok karışımı kullanabilmesidir, ancak sadece bir ebeveyni olabilir. Bu, kalıtımı çok daha az esnek kılar. –

+1

+1. @FelixKling, mümkün olan yerlerde kalıtım üzerinden kompozisyon. Const bindTwoWay = require ('../ mixins/bindTwoWay') 'gibi bir şeyi yapan bir bileşeni, yuvalanmış bir hiyerarşi içinde bir şeyi kovalamaktan açıkça açıkça görmeyi tercih ederim. –

+0

@FelixKling Sizin noktanızı görüyorum, ama yine de, eğer sınıfın bir ebeveyni olsa bile, ve eğer sadece bir ebeveyne ihtiyacım varsa, bu yine de yapılacak çok iyi bir şey olur, değil mi? Karışımları ES6 sözdizimi ile kullanamadığımız için ... – tuks

cevap

3

Bu tamamen iyi, sadece temel miras. Miksleri değiştirmek için miras kullanma konusundaki ihtar, birden fazla kalıtımın olmamasıdır, bu yüzden birden fazla karıĢım verdiğinizde, TextBox özelliklerinizi çoklu temel sınıflarına veremezsiniz. Bunu aşmak için component composition'u kullanabilirsiniz. Durumunuzda, örnekte tanımladığınız gibi doğrudan çalışmaz, ancak bunun için bir geçici çözüm vardır.

Önce bir beste bileşenini

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 
} 

tanımlamanız gerekir Ve sonra ben bunu test edemedim

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) 

bazı ortak özelliklere gereken yere size bileşeni tanımlamak ama çalışması gerekir.

+1

Ths çalışmayacak. Bu {this.state.val} 'yerine {this.props.val} olmalıdır. Ve başlatmayı yüksek sipariş bileşeninde yapmalısınız. – fl0cke

+3

@ fl0cke Doğru, örnekleri düzeltin. –

İlgili konular