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.