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.