2015-04-28 16 views
5

Her sınıf için tüm prop türleriimi açıkça belirtmeyi seviyorum.ReactJS: Nesneler için daha fazla modüler pervane çeşitleri ve şekilleri nasıl kullanabilirim?

React.createClass({ 
    propTypes: { 
    optionalArray: React.PropTypes.array, 
    optionalBool: React.PropTypes.bool, 
... 

Bu yeniden kullanılabilir bileşenler okumaktan geçerli: https://facebook.github.io/react/docs/reusable-components.html

Ancak, ne ben birçok sınıflarında kullanmak çok yaygın bir nesne varsa? Örneğin: Burada

var MemoryForm = React.createClass({ 
    propTypes: { 
    memory: React.PropTypes.shape({ 
     memoryID: React.PropTypes.number, 
     content: React.PropTypes.string, 
     date: React.PropTypes.object, 
     dateStr: React.PropTypes.string, 
     note: React.PropTypes.string 
    }).isRequired, 
    ... 

var MemoriesArea = React.createClass({ 
    propTypes: { 
    // The initial memory to fill the memory form with. 
    formMemory: React.PropTypes.shape({ // <== shape used again 
     memoryID: React.PropTypes.number, 
     content: React.PropTypes.string, 
     date: React.PropTypes.object, 
     dateStr: React.PropTypes.string, 
     note: React.PropTypes.string 
    }).isRequired, 
    // ... 



var Playground = React.createClass({ 
    getInitialState: function() { 
    var initVars = { 
     // The initial memory to fill the memory form with. 
     formMemory: { // <== shape is used again. 
     memoryID: 0, 
     content: "", 
     date: null, 
     dateStr: "", 
     note: "" 
     } 
    }; 
    return initVars; 
    } 
    //... 

, ben yanı sıra bazı başlatımlar olmak üzere çeşitli sınıflar için prop tiplerinde çok sık 'hafıza' şeklini kullanacak. Bunu nasıl daha fazla DRY yapabiliriz - yani daha az kod çoğaltma, bu nedenle bu nesne şeklindeki bir değişiklik gelecekte daha sürdürülebilir olacak mı?

cevap

2

Bu işlevselliği açığa çıkaran küçük bir modül yapıyorum. Bu bir CommonJS dünyada böyle bir şey görünecektir: Ben de aynı sorun vardı

let memoryUtils = require('./memory-utils'); 

let MyComponent = React.createClass({ 
    getInitialState() { 
    return memoryUtils.initialValues(); 
    }, 
    render() { 
    ... 
    } 
}); 
14

:

let memoryUtils = require('./memory-utils'); 

let MyComponent = React.createClass({ 
    propTypes: memoryUtils.propTypes(), 
    render() { 
    ... 
    } 
}); 

Ve:

let React = require('react'); 

module.exports = { 
    propTypes() { 
    return React.PropTypes.shape({ 
     memoryID: React.PropTypes.number, 
     content: React.PropTypes.string, 
     date: React.PropTypes.object, 
     dateStr: React.PropTypes.string, 
     note: React.PropTypes.string 
    }).isRequired; 
    }, 
    initialValues() { 
    return { 
     memoryID: 0, 
     content: "", 
     date: null, 
     dateStr: "", 
     note: "" 
    }; 
    } 
} 

Sonra böyle bileşenleri kullanan ediyorum ve değerleri ayrı bir ES6 modülüne taşıdım. müşteri kodunuza Sonra

// File lib/PropTypeValues.js 
import { PropTypes } from 'react'; 

export let MemoryPropTypes = PropTypes.shape({ 
    memoryID: PropTypes.number, 
    content: PropTypes.string, 
    date: PropTypes.object, 
    dateStr: PropTypes.string, 
    note: PropTypes.string 
}).isRequired 

: Bu yardımcı olur

// MemoryForm.jsx 
import { MemoryPropTypes } from './lib/PropTypeValues' 
import React from 'react'; 

class MemoryForm extends React.Component { 
    static propTypes: { 
    memory: MemoryPropTypes, 
    // ... 
    }; 
} 

Hope sizin örnekte.

+0

Bu oldukça kaygan. Yine de ekleme/kaldırma işlemlerini nasıl kontrol ediyorsunuz? –

+0

Benim endişem, eslint-plugin-react bir hata - https://github.com/yannickcr/eslint-plugin-react/issues/1389 gibi görünüyor. 'MemoryPropTypes.isRequired' öğesini ekleyebilir ancak eslint'i kapatmanız gerekir (en azından şimdilik). Bir önceki satırın üzerine '// eslint-disable-next-line react/no-typos 'bu yorumu ekleyin. Eğer 'memoryID' veya iç içe geçmiş herhangi bir PropType'ın istenmesini istiyorsanız 'lib/PropTypeValues.js' dosyasında yepyeni bir PropType oluşturmanız gerekiyor sanırım, değil mi? –