我正在尝试获取每个单独图像的href
,就像这样,我想显示的粗体href
。
{
"collection": {
"href": "https://images-api.nasa.gov/search?q=moon",
"version": "1.0",
"items": [
{
"href": "https://images-assets.nasa.gov/image/PIA12235/collection.json",
"data": [ ... ],
"links": [
{
**"href": "https://images-assets.nasa.gov/image/PIA12235/PIA12235~thumb.jpg",**
"render": "image",
"rel": "preview"
}
]
}
]
}
}
这是我的密码。每当我试图在axios请求数据值中更进一步时,它都表示一切都是undefined
。我很困惑为什么我不能map
输出每个链接。
const { useState, useEffect } = React;
const Api = () => {
const api = "https://images-api.nasa.gov/search?q=moon";
const [list, setList] = useState([null]);
useEffect(() => {
axios.get(api).then((res) => {
setList(res.data.collection.items.map((item) => item.links));
});
}, [api]);
if (list) {
return (
<div>
<p>{console.log(list)}</p>
</div>
);
}
};
const Example = () => {
return <Api />;
};
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Example />);
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/axios@1.1.3/dist/axios.min.js"></script>
我认为可能有两个问题:
setList
调用中map
的结果是数组的数组。如果您想要一个平面阵列,请在其上使用flat
,或者以稍微不同的方式构建它。(此外,我建议不要从[null]
开始,只使用一个空白数组([]
(或null
——考虑到代码后面的if (list)
,null
是有意义的。(- 在
collection.items
中,并非所有元素对象都具有links
属性,因此map
为这些项返回undefined
。我们可以使用filter
在事后过滤掉这些数组,或者提供空数组作为替代
下面是一个使用flat
和过滤器的示例;由于您似乎想要href
,我已经过滤掉了任何不是对象或没有href
属性的元素:
const { useState, useEffect } = React;
const Api = () => {
const api = "https://images-api.nasa.gov/search?q=moon";
const [list, setList] = useState(null);
useEffect(() => {
axios.get(api).then((res) => {
setList(
res.data.collection.items.map((item) => item.links)
.flat()
.filter(e => typeof e === "object" && e.href)
);
});
}, [api]);
if (list) {
return (
<div>
<div>Links ({list.length}):</div>
{list.map(({href}, index) => <div key={href+"::"+index}>{href}</div>)}
</div>
);
}
};
const Example = () => {
return <Api />;
};
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Example />);
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/axios@1.1.3/dist/axios.min.js"></script>
如果你想在前进的过程中过滤掉它们,你可以使用零合并运算符,当item.links
不存在时,提供一个空数组作为它的替代:
useEffect(() => {
axios.get(api).then((res) => {
setList(
res.data.collection.items.map((item) => item.links ?? [])
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^
.flat()
// ...and then no `filter` here...
);
});
}, [api]);
这里有一个例子(使用||
而不是??
,因为SO的Stack Snippets中过时的Babel版本不理解??
——在这种特定情况下无关紧要,我们可以使用||
(:
const { useState, useEffect } = React;
const Api = () => {
const api = "https://images-api.nasa.gov/search?q=moon";
const [list, setList] = useState(null);
useEffect(() => {
axios.get(api).then((res) => {
setList(
res.data.collection.items.map((item) => item.links || [])
.flat()
);
});
}, [api]);
if (list) {
return (
<div>
<div>Links ({list.length}):</div>
{list.map(({href}, index) => <div key={href+"::"+index}>{href}</div>)}
</div>
);
}
};
const Example = () => {
return <Api />;
};
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Example />);
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/axios@1.1.3/dist/axios.min.js"></script>