React propTypes: objectOf vs shape?


77

Яка різниця між PropTypes.objectOfта PropTypes.shape? У документах :

// An object with property values of a certain type
optionalObjectOf: PropTypes.objectOf(PropTypes.number)

проти

// An object taking on a particular shape
optionalObjectWithShape: PropTypes.shape({
  color: PropTypes.string,
  fontSize: PropTypes.number
})

Коли я повинен використовувати objectOfі коли я повинен використовувати shape?

Відповіді:


142

PropTypes.objectOf використовується при описі об’єкта, властивості якого однакові.

const objectOfProp = {
  latitude: 37.331706,
  longitude: -122.030783
}

// PropTypes.objectOf(PropTypes.number)

PropTypes.shape використовується при описі об’єкта, ключі якого відомі заздалегідь, і можуть представляти різні типи.

const shapeProp = {
  name: 'Jane',
  age: 25
}

// PropTypes.shape({ name: PropTypes.string, age: PropTypes.number })

1
хм ... добре розумію. Я думаю, що моя плутанина пов’язана з відсутністю фантазії. Чи можете ви навести приклад хорошого реального випадку використання PropTypes.objectOf?
DMac the Destroyer

Варіантом використання буде об’єкт, якому ви не знаєте назви ключів заздалегідь. Поки ви знаєте, якого типу будуть значення, ви можете використовувати PropTypes.objectOfдля перевірки.
djfdev

1
Ну, objectOfце для об’єкта словника з однаковим типом для всіх значень.
Tr1et

49

Просто хотів навести приклад, враховуючи наступний об’єкт:

{
    petStore: {
        animals: {
           '23': { name: 'Snuffles', type: 'dog', age 13 }
           '29': { name: 'Mittens', type: 'cat', age: 7 }
        }
    }
}

ObjectOf і Shape

Використовується, коли об’єкт може мати різні імена властивостей, але послідовний набір властивостей для кожного:

const animalItemShape = {
    name: PropTypes.string,
    type: PropTypes.string,
    age: PropTypes.number
}

const petStoreShape = {
    animals: PropTypes.objectOf(PropTypes.shape(animalItemShape))
}

Як бачите, animalsце об’єкт, що складається з безлічі властивостей, кожна відповідає animalItemShapeтипу.

Сподіваюся, це допоможе!


Я використовував, PropTypes.objectOf(PropTypes.shape({...}))і це не спрацьовувало - отримав неправильне попередження про те, що я передавав об’єкт, але очікував рядок, коли передавав рядок. У документації сказано, що objectOfце стосується типу "Об'єкт зі значеннями властивостей певного типу" PropTypes.number. Я думаю, вам просто потрібно PropTypes.shape({...})без того objectOf, що працювало на мене.
Альберт Віла Кальво

@AlbertVilaCalvo Якби мені довелося здогадуватися, я б уявив, що ви, можливо, випадково передали об’єкт як одне із властивостей, яке ви встановили для PropTypes.stringтипу. Як виглядав ваш об’єкт?
Леві Фуллер

2
Я щойно спробував ще раз: використання PropTypes.objectOf(PropTypes.shape({...}))призводить до помилки червоної помилки "Недійсний опис ...", тоді як PropTypes.shape({...})працює ідеально (помилка не відображається). Знову ж таки, у документах сказано, що його objectOfслід використовувати як PropTypes.objectOf(PropTypes.number)і для "Об'єкта зі значеннями властивостей певного типу". Мені здається , що упаковка PropTypes.shape({...})з objectOfне потрібно - просто використовувати PropTypes.shape({...})безпосередньо.
Альберт Віла Кальво,

Я стикаюся з проблемою, коли я використовую фігуру з об’єктом або без нього, я отримую рядок замість об’єкта field: "{↵ type: 'text',↵ hintText: '',↵ required: false,}", не знаю, що робить неправильно
Hanzla Habib
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.