#javascript #reactjs #react-proptypes
#javascript #reactjs #react-proptypes
Вопрос:
Я создаю PropTypes
для функционального компонента и хочу использовать PropTypes.oneOf
с объектом, импортированным из другого файла:
import { MODES } from '../../../Users';
(...)
ManageUserForm.propTypes = {
mode: PropTypes.oneOf(Object.values(MODES)),
}
В Users.js
, РЕЖИМАХ выглядит так:
export const MODES = {
add: 'add', edit: 'edit', changePassword: 'changePassword',
block: 'block', unblock: 'unblock', delete: 'delete'
};
Но я получаю сообщение об ошибке, указывающее, что MODES является undefined
. На данный момент я решил проблему, просто жестко закодировав значения, но это неэлегантно, и я хочу улучшить его. Что я могу сделать?
РЕДАКТИРОВАТЬ: я воссоздал проблему в изолированной среде:codesandbox.io
Комментарии:
1. Можете ли вы воссоздать в изолированной среде?
2. @DennisVash, я сделал — проверь это
Ответ №1:
У вас есть циклическая зависимость.
- Сначала код импортируется
Users.js
изApp.js
. - Затем
Users.js
импортируетUserCreator.js
. - Затем
UserCreator.js
импортируетManageUserForm.js
. - Затем
ManageUserForm.js
импортируетUsers.js
снова
Все это еще до того, как MODES
определяется переменная. Вы не должны импортировать Users.js
в ManageUserForm.js
, поскольку Users.js
само по себе зависит от ManageUserForm.js
through UserCreator.js
.
Вы можете переместить MODES
определение в ManageUserForm.js
и импортировать его в Users.js
или, что лучше, полностью переместить его в отдельный файл.
Комментарии:
1. Ах, да, действительно — именно в этом и заключалась проблема.
Ответ №2:
Это сработало бы, но я рекомендую сохранить его в том же файле, потому что он не был импортирован, когда он определяет proptypes.
ManageUserForm.propTypes = {
mode: PropTypes.oneOf(Object.values(require('../../../Users'))),
}
Вот пример CodeSandbox
https://codesandbox.io/s/react-example-forked-y1br4?file=/index.js
Комментарии:
1. Извините, я не вижу, где и как MODES используется в ваших примерах — особенно в примере с песочницей
2. Я забыл сохранить свой пример, пожалуйста, проверьте ссылку еще раз
3. спасибо, теперь я знаю, что вы имели в виду, и я применил это, и это работает. Однако, удивительно, поскольку я извлек константу в отдельный файл, мне не нужно использовать что-либо подобное
require
, я просто использую ее так, как хотел в начале:mode: PropTypes.oneOf(Object.values(MODES))