ReactJS'de iç içe geçmiş bir nesnenin PropTyp'lerini nasıl doğrularsınız?


191

ReactJS bir bileşen için benim sahne olarak bir veri nesnesi kullanıyorum.

<Field data={data} />

PropTypes nesnesinin kendisini doğrulamanın kolay olduğunu biliyorum:

propTypes: {
  data: React.PropTypes.object
}

Ama içindeki değerleri doğrulamak istersem ne olur? yani. data.id, data.title?

props[propName]: React.PropTypes.number.required // etc...

Yanıtlar:


360

React.PropTypes.shapeÖzellikleri doğrulamak için kullanabilirsiniz :

propTypes: {
    data: React.PropTypes.shape({
      id: React.PropTypes.number.isRequired,
      title: React.PropTypes.string
    })
}

Güncelleme

@Chris'in yorumlarda belirttiği gibi, React 15.5.0 sürümünden itibaren React.PropTypespakete taşındı prop-types.

import PropTypes from 'prop-types';    

propTypes: {
    data: PropTypes.shape({
      id: PropTypes.number.isRequired,
      title: PropTypes.string
    })
}

Daha fazla bilgi


1
Kesin cevap @ nilgun. React'ın propTypes belgelerini bulabilirsiniz: facebook.github.io/react/docs/reusable-components.html
wle8300

React.PropTypesartık kullanımdan kaldırıldı. Kullanın PropTypesdan prop-typesyerine paketin. Daha fazlası
Chris

13

İstediğiniz React.PropTypes.shapetip kontrol seviyesini sağlamazsanız, tcomb-tepki'ye bir göz atın .

Bu bir sağlar toPropTypes()size tanımlanmış bir şema doğrulamak sağlayan işlevi tcomb tanımlamak için verdiği desteği Tepki yararlanarak kütüphaneden özel propTypesdoğrulayıcılarını kullanarak doğrulamaları çalışan tcomb-doğrulama .

Dokümanlarından temel örnek :

// define the component props
var MyProps = struct({
  foo: Num,
  bar: subtype(Str, function (s) { return s.length <= 3; }, 'Bar')
});

// a simple component
var MyComponent = React.createClass({

  propTypes: toPropTypes(MyProps), // <--- !

  render: function () {
    return (
      <div>
        <div>Foo is: {this.props.foo}</div>
        <div>Bar is: {this.props.bar}</div>
      </div>
    );
  }    
});

4

Yuvalamanın bir derinliğin ötesinde çalıştığını belirtmek istedim. URL parametrelerini doğrularken bu benim için yararlı oldu:

propTypes = {
  match: PropTypes.shape({
    params: PropTypes.shape({
      id: PropTypes.string.isRequired
    })
  })
};

Bu id, yalnızca bir match.paramsnesne varsa gerekli olur veya isRequiredbasamaklanır mı, yani matchprop olan bir paramsnesneyle isRequired id? yani, eğer herhangi bir parametre verilmemişse hala geçerli olur mu?
S. ..

Bu, " matcholması gereken paramsve paramsolması gereken id" olarak okunabilir .
datchung

Hi @datchung aslında ben o zamandan beri nasıl okuduğunu (ve test) öğrendim ve o Varsa matchve matchiçerirse paramso zaman gerekli paramsbir dize içerir id.
S. ..

-7
user: React.PropTypes.shap({
    age: (props, propName) => {
       if (!props[propName] > 0 && props[propName] > 100) {
          return new Error(`${propName} must be betwen 1 and 99`)
       }
       return null
    },
})

10
Açıkçası bu cevaba açık bir şekilde çaba sarf ettiği gibi, sadece kod ise kavramak zor olabilir. Çözümü birkaç cümle ile yorumlamak normaldir. Lütfen cevabınızı düzenleyin ve biraz açıklama ekleyin.
Mika Sundland
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.