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...
Adam
sumber

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

nilgun
sumber
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>
    );
  }    
});
Jonny Buchanan
sumber
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
    })
  })
};
datchung
sumber
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
    },
})
Mostafa Ezz
sumber
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