#reactjs #redux #eslint #react-proptypes
Вопрос:
У нас есть правило линтинга, которое делает React prop-типами необходимыми.
Поэтому мой файл выглядит следующим образом:
const MyComponent = ({ prop1, prop2 }) => (
<div>
{*/ Do stuff here */}
</div>
)
myComponent.propTypes = {
prop1: PropTypes.any.isRequired,
prop2: PropTypes.any.isRequired,
}
export default MyComponent
И он используется в родительском компоненте, как это:
<MyComponent prop1="Hello" prop2="World" />
Теперь я хочу подключить этот функциональный компонент к Redux, поэтому теперь у меня есть это:
import { connect } from 'react-redux'
...
const mapStateToProps = state => {
return {
prop3: state.area.prop3
}
}
export default connect(mapStateToProps)(MyComponent)
Моя проблема заключается в следующем: когда я пытаюсь добавить prop3
так:
const MyComponent = ({ prop1, prop2, prop3 }) => {...}
Мой линтер жалуется, что:
'prop3' is missing in props validation eslint(react/prop-types)
Хорошо, поэтому я пойду, чтобы добавить его:
myComponent.propTypes = {
prop1: PropTypes.any.isRequired,
prop2: PropTypes.any.isRequired,
prop3: PropTypes.any.isRequired,
}
Но теперь родительский компонент имеет ошибку:
Property 'prop3' is missing in type '{ prop1: any; prop2: any; }' but required in type 'Pick<Pick<Omit<{ prop1: any; prop2: any; prop3: any; }...
Я полагаю, что я мог бы сделать prop3
не обязательным и включить a defaultProps
, но мне это кажется неправильным, так как я всегда буду хватать его из состояния.
Как мне подключиться к состоянию Redux, одновременно решая проблемы, связанные с типами свойств?
Правка: Я бы предпочел не просто отключать линтинг. Похоже на взлом, и должен быть способ заставить это работать.
Комментарии:
1. Если вы можете, просто используйте крючки Redux. Никаких соединений, никаких реквизитов, никаких типов реквизита. react-redux.js.org/api/hooks
2. Мне нужно
connect
, потому что это данные о состоянии, которые я извлекаю и сопоставляюprops
, и мне нужноprop-types
каким-то образом выполнить компоновку, потому что это правило включено для всей нашей кодовой базы.3. @noblerare Вы пробовали что-то вроде того, чтобы вместо этого использовать типы реквизитов
connect(mapStateToProps)(MyComponent)
MyComponent
? Вы можете переместить объект подключения в переменную.4. @noblerare Я не уверен, что понимаю. Вам нужен доступ к этим значениям данных состояния в вашем компоненте. Не должно быть необходимости, чтобы они входили через подпорки. Вы также можете получить их с
useSelector
помощью .connect
к настоящему времени это устаревший api при работе с Redux, и крючки официально рекомендуются для доступа к хранилищу из функциональных компонентов. redux.js.org/style-guide/style-guide/…