![](/img/trans.png)
[英]React/Codesandbox, mapping over array results in .map is not a function
[英]Mapping array in React gives .map is not a function
我在尝试 output 我的错误反应时遇到了麻烦。 数据来自外部 API,格式如下;
{
"message": "The given data was invalid.",
"errors": {
"name": [
"The name field is required."
],
"address": [
"The address field is required."
],
"postcode": [
"The postcode field is required."
]
}
}
我的页面返回 API 数据和错误组件看起来像这样;
const ShowData = () => {
const [errorData, setErrorData] = useState([]);
const onSubmit = handleSubmit(async ({ name, address, postcode }) => {
if (errorData) setErrorData([]);
try {
// Call API and process here
} catch (error) {
setErrorData(error.data);
}
});
return (
<div>
{errorData && !Object.keys(errorData).length == 0 &&
<ErrorComponent errorData={errorData} />
}
</div>
)
}
export default ShowData;
class ErrorComponent extends Component {
render() {
const errorData = this.props.errorData;
return (
<div>{errorData.message}</div>
<ul>
{errorData.errors.map(error => {
<li>{error}</li>
})}
</ul>
)
}
}
export default ErrorComponent;
我收到的错误是;
errorData.errors.map is not a function
以下是我想要实现的目标;
<div>The given data was invalid.</div>
<ul>
<li>The name field is required.</li>
<li>The address field is required.</li>
<li>The postcode field is required.</li>
</ul>
您正在尝试在 object 上运行.map()。 .map() 仅可用于可迭代对象。
You might try creating an array from the object using Object.keys, Object.values, Object.entries, or another method that creates an array from an object.
2个问题。
<ul>
{Object.values(errorData.errors).map((e, i) =>
<li key={i}>{e[0]}</li>
)}
</ul>
map
function 缺少return
语句,您可以通过删除如上所示的花括号来隐式包含该语句。 首先,您不能在对象上使用map
,因为map
本身就是Array
的方法。 正如您在文档中看到的,它是Array.prototype.map
。 所以在这里你可以在映射之前将错误转换为数组。 这里我使用Object.entries
因为我还想显示导致错误的字段。
除了迭代errorData之外,还有其他问题:
div
和ul
。 您必须仅将其包装到一个元素中。 你可以使用div
来包装,但我更喜欢使用React.Fragment
undefined
列表,它不会显示任何内容。 此处的解决方案是使用显式return
或简写() => (<yourelement />)
class ErrorComponent extends React.Component {
render() {
const errorData = this.props.errorData;
return (
<React.Fragment>
<div>{errorData.message}</div>
<ul>
{Object.entries(errorData.errors).map(
([errorField, errorMessages]) => (
<li>
{errorField}: {errorMessages[0]}
</li>
)
)}
</ul>
</React.Fragment>
);
}
}
现场演示:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.