Bagaimana Anda memvalidasi PropTip objek bersarang di ReactJS?


191

Saya menggunakan objek data sebagai alat peraga saya untuk komponen di ReactJS.

<Field data={data} />

Saya tahu itu mudah untuk memvalidasi objek PropTypes itu sendiri:

propTypes: {
  data: React.PropTypes.object
}

Tetapi bagaimana jika saya ingin memvalidasi nilai-nilai di dalamnya? yaitu. data.id, data.title?

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

Jawaban:


360

Anda dapat menggunakan React.PropTypes.shapeuntuk memvalidasi properti:

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

Memperbarui

Seperti @Chris tunjukkan dalam komentar, pada React versi 15.5.0 React.PropTypestelah pindah ke paket prop-types.

import PropTypes from 'prop-types';    

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

Info lebih lanjut


1
Jawaban tepat @nilgun. Anda dapat menemukan dokumentasi untuk propTypes React: facebook.github.io/react/docs/reusable-components.html
wle8300

React.PropTypessekarang sudah ditinggalkan. Silakan gunakan PropTypesdari prop-typespaket sebagai gantinya. Lebih lanjut di sini
Chris

13

Jika React.PropTypes.shapetidak memberi Anda tingkat pemeriksaan tipe yang Anda inginkan, lihat tcomb-react .

Ini menyediakan toPropTypes()fungsi yang memungkinkan Anda memvalidasi skema yang ditentukan dengan pustaka tcomb dengan memanfaatkan dukungan React untuk mendefinisikan validator kustompropTypes , menjalankan validasi menggunakan tcomb-validation .

Contoh dasar dari dokumennya :

// 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

Ingin dicatat bahwa pekerjaan bersarang melampaui kedalaman satu tingkat. Ini berguna bagi saya ketika memvalidasi params URL:

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

Apakah itu berarti idhanya diperlukan jika ada match.paramsobjek atau isRequiredkaskade, artinya matchDiperlukan dengan paramsobjek dengan idpenyangga? yaitu, jika tidak ada params yang disediakan, apakah masih valid?
S ..

Ini dapat dibaca sebagai " matchharus memiliki paramsdan paramsperlu memiliki id".
datchung

Hi @ datchung sebenarnya saya sejak menemukan (dan menguji) cara membaca dan itu adalah jika matchada dan jika matchberisi paramsmaka diperlukan paramsberisi string 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
Karena banyak upaya yang sudah jelas dalam jawaban ini, mungkin sulit untuk memahami apakah itu hanya kode. Biasanya mengomentari solusi dengan beberapa kalimat. Harap edit jawaban Anda dan tambahkan beberapa penjelasan.
Mika Sundland
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.