2015-10-23 20 views
8

ES7'deki ES7 sınıflarındaki statik özelliklerini geçersiz kıl/genişlet, ESözelliği ve yöntem tanımları kavramını tanıtır. Bir ES7 özellikli transpiler ile birlikte, bu can be used in React şöyle, props için doğrulayıcılarını ve varsayılan belirtmek için:React.js

export default class ComponentOne extends React.Component { 
    static propTypes = { 
     foo: React.PropTypes.string 
    } 
    static defaultProps = { 
     foo: 'bar' 
    } 
    // ... 
} 

Bu süper kullanışlı olmakla alt sınıflar da eklenince zor alır. Örneğin, aşağıdaki modül yukarıdaki ComponentOne aynı kod tabanına eklenir ki:

export default class ComponentTwo extends ComponentOne { 
    static propTypes = { 
     baz: React.PropTypes.number 
    } 
    static defaultProps = { 
     baz: 42 
    } 
    // ... 
} 

ben onun süper, ComponentOne mülkiyet doğrulayıcılarını ve varsayılan "miras" için ComponentTwo istiyorum. Bunun yerine, ve adresindeki defaultProps, ComponentOne numaralı belgede bulunanları gölgeleyin ve React, ComponentOne'da tanımlananları dışarı fırlatır. super yana

akım sınıfının prototip için bir referans ve static değerleri prototip kapalı doğrudan asılı başvurmak gerekiyordu, ben bu işe düşündüm:

import _ from 'lodash'; 
export default class ComponentTwo extends ComponentOne { 
    static propTypes = _.merge(super.propTypes, { 
     baz: React.PropTypes.number 
    }); 
} 

Ancak bundan muhtemelen bir hata oluşturur Babil: Parsing error: 'super' outside of function or class.

Bu çalışır, ancak çok taşınabilir:

export default class ComponentTwo extends ComponentOne { 
    static propTypes = Object.assign({ 
     baz: React.PropTypes.number 
    }, ComponentOne.propTypes); 
} 

reusably/daha temiz bunu yapmak için başka yolları var mı?

+0

uyarılar dikkat ediniz Desteklenen ancak daha eski tarayıcılarda sorun yaşayabilirsiniz.NOT: '__proto__' IE'de desteklenmiyor <= 10, böylece statik özellikler devralınmayacak." kaynak: https://babeljs.io/docs/advanced/caveats/ – Raspo

+0

Kurucuda 'super.propTypes' birleştirmeyi denediniz mi? –

+0

@Mat Henüz yapmadım, ama "props" 'un zaten ayarlanmış olan varsayılan ayarlara gelmesiyle, bunun çok geç olacağını hayal ediyorum. – ericsoco

cevap

0

super kullanarak meraklı, statik yöntemler için çalışır. Statik özellikler için de çalışması gerektiğini düşünüyorum. Bana göre, o zaman, doğrudan süper sınıf adını kullanmak daha uygun geliyorsa:

export default class ComponentTwo extends ComponentOne { 
    static propTypes = _.merge({}, ComponentOne.propTypes, { 
    baz: React.PropTypes.number 
    }); 
} 

Ama özelliğini başlatmak için statik bir yöntem kullanılarak olduğunu düşünebilirsiniz super, bir geçici çözümü kullanmak maalesef olurdu hangi elle çağrılacak: o zaman statik özellikler __proto__` `aracılığı devralınmıştır bir sınıftan miras ediyorsanız ", bu yaygın geçerli: statik özelliklere sahip sınıflar miras zaman

class ComponentTwo extends ComponentOne { 
    static _init() { 
    this.propTypes = _.merge({}, super.propTypes, { 
     baz: React.PropTypes.number 
    }); 
    } 
} 
ComponentTwo._init(); 
+0

Bu, yazımın sonundaki önerinin sadece bir refakatçisi değil midir? Object.assign' yerine 'lodash' kullanılıyor mu? Bununla ilgili benim problemim, "süper" sınıfa başvurmak yerine "ComponentOne" 'a açıkça atıfta bulunmaktır. Büyük bir anlaşma değil çünkü 'extends' ifadesinde başvurmak zorunda, ama ideal değil. – ericsoco

+0

Evet, tam olarak bu, ama _merge_ kullanma doğru yolu ile. –

+0

Ayrıca bence daha kötü bir alternatif daha ekledi. –