React传递数组props时触发prop-types校验length缺失报错
报错根因
这个报错本质是两个写法问题导致的:
- 你给传入的数组属性起名为
props,和React组件默认接收的顶层props对象重名,ESLint的prop-types校验规则会把props.length识别为「访问props下名为length的属性」,而不是你传入的数组自带的length属性。 - PropTypes和defaultProps类型不匹配:你声明传入的
props是字符串数组,默认值却给了空字符串'',类型校验本身就不通过。
修复方案
优先推荐第一种写法,从根源上避免命名混淆:
方案1:修改传入属性名(推荐)
不要用props作为自定义传参的属性名,改成语义化的名称,比如emailList:
- 修改组件调用代码:
const eusers = ['Euser1@gmail.com', 'Euser2@yahoo.com'] <EnableUser emailList={eusers} />
- 修改组件定义和校验规则:
import PropTypes from 'prop-types'; import { useState } from 'react'; export default function EnableUser({ emailList }) { // 此时访问数组length不会触发ESLint报错 const [emailCount, setEmailCount] = useState(emailList.length); // 其余组件逻辑 } EnableUser.propTypes = { emailList: PropTypes.arrayOf(PropTypes.string), } EnableUser.defaultProps = { emailList: [], // 数组类型的默认值给空数组,和声明类型匹配 }
方案2:保留props作为属性名(不推荐)
如果一定要用props作为传入的属性名,修正PropTypes和默认值即可:
import PropTypes from 'prop-types'; import { useState } from 'react'; export default function EnableUser({ props }) { const [emailCount, setEmailCount] = useState(props.length); // 其余组件逻辑 } EnableUser.propTypes = { props: PropTypes.arrayOf(PropTypes.string), } EnableUser.defaultProps = { props: [], // 替换原来的空字符串默认值 }
这种写法非常容易和React组件自带的顶层props对象混淆,后续维护很容易出问题,非必要不要用。
如果改完代码还是报错,直接重启编辑器的ESLint服务即可,ESLint不会实时加载PropTypes的修改,重启后校验规则就会正常生效。
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

