Jak sprawdzasz poprawność PropTypes zagnieżdżonego obiektu w ReactJS?

191

Używam obiektu danych jako moich rekwizytów dla komponentu ReactJS.

<Field data={data} />

Wiem, że łatwo jest zweryfikować sam obiekt PropTypes:

propTypes: {
  data: React.PropTypes.object
}

Ale co jeśli chcę zweryfikować wartości w środku? to znaczy. data.id, data.title?

props[propName]: React.PropTypes.number.required // etc...
Adam
źródło

Odpowiedzi:

360

Możesz użyć React.PropTypes.shapedo sprawdzania poprawności właściwości:

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

Aktualizacja

Jak zauważył @Chris w komentarzach, od wersji React wersja 15.5.0 React.PropTypeszostała przeniesiona do pakietu prop-types.

import PropTypes from 'prop-types';    

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

Więcej informacji

nilgun
źródło
1
Dokładna odpowiedź @nilgun. Dokumentację dotyczącą propTypes Reacta można znaleźć: facebook.github.io/react/docs/reusable-components.html
wle8300
React.PropTypesjest teraz przestarzałe Zamiast tego skorzystaj PropTypesz prop-typespakietu. Więcej tutaj
Chris
13

Jeśli React.PropTypes.shapenie daje Ci odpowiedniego poziomu sprawdzania typu, spójrz na tcomb-reaguj .

Zapewnia toPropTypes()funkcję, która pozwala sprawdzić poprawność schematu zdefiniowanego za pomocą biblioteki tcomb, wykorzystując wsparcie React do definiowania niestandardowych propTypeswalidatorów , uruchamiając sprawdzanie poprawności za pomocą sprawdzania poprawności tcomb .

Podstawowy przykład z jego dokumentów :

// 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
źródło
4

Chciałem zauważyć, że zagnieżdżanie działa poza głębokością jednego poziomu. Przydało mi się to podczas sprawdzania poprawności parametrów adresu URL:

propTypes = {
  match: PropTypes.shape({
    params: PropTypes.shape({
      id: PropTypes.string.isRequired
    })
  })
};
datchung
źródło
Czy to znaczy, że idjest wymagane tylko wtedy, gdy znajduje się match.paramsobiekt lub robi isRequiredkaskadę, oznaczający matchisrequired z paramsobiektów z idrekwizytem? tzn. jeśli nie podano parametrów, czy nadal byłby ważny?
S ..
Można to odczytać jako „ matchmusi mieć paramsi paramsmusi mieć id”.
datchung
Cześć @datchung właściwie, ponieważ okazało się, (i sprawdzone) jak to brzmi i jest to, że jeśli matchjest obecny i Jeśli matchzawiera paramsto jest wymagane paramszawiera ciąg 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
źródło
10
Ponieważ włożono wiele wysiłku w tę odpowiedź, może być trudno ją zrozumieć, jeśli jest to tylko kod. Zazwyczaj komentuje się rozwiązanie kilkoma zdaniami. Edytuj swoją odpowiedź i dodaj wyjaśnienie.
Mika Sundland,