我正在做以下关于Next.js远程获取的练习。我无法理解和适应的是,该练习从http://api.tvmaze.com.
数据如下:
[
{"score":24,"show":{"id":975,"url":"", "name":""}}
,{"score":25,"show":{"id":976,"url":"", "name":""}}
,{"score":26,"show":{"id":977,"url":"", "name":""}}
]
索引页面使用以下映射:
{props.shows.map(({show}) => (
<li key={show.id}>
<Link as={'/p/${show.id}'} href={'/post?id=${show.id}'}>
<a>{show.name}</a>
</Link>
</li>
))}
注意,它具有{"score":"", "show":{}}
结构。因此,props.shows.map
使用变量show
并引用show.id
和show.name
。而且效果很好。我弄不明白它是怎么工作的?因为id
就在里面,对我来说应该是show.show.id
。
此外,我正在尝试获取一个结构略有不同的不同数据源。
[
{"id": 1, "name":"name1"}
,{"id": 2, "name":"name2"}
,{"id": 3, "name":"name3"}
]
相同的代码失败并出现错误:
Unhandled Rejection (TypeError): Cannot read property 'id' of undefined
所以,除了它有明显不同的数据结构。我不明白为什么,如果我的数据结构略有不同,我该如何相应地更改props.shows.map
函数?
您熟悉JS中的对象析构函数吗?https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
在本例中,编写({show})
是编写类似(resp)
和后来的show = resp.show
的简写。因此,在这种情况下,由于析构函数,show
已经是show
对象。因此,id
起作用。
您的数据没有show
属性,因此在进行析构函数时,show
是未定义的。当然,你不能得到undefined
的属性。从{show}
中删除大括号就可以了。