javascript - React - api 数据已成功传递给组件(每个检查器)但未呈现
问题描述
我的 api 数据已成功从我的 api 调用传递到表组件中,但没有被渲染。
如果在搜索播放列表后我进入并对 table.js 文件进行编辑,则数据将正确呈现。应用程序.js...
const App = (props) => {
const [playlists, setPlaylists] = useState([])
const [searchString, setSearchString] = useState() //use instead of onsubmit
const isFirstRef = useRef(true);
const search = (value) => {
setSearchString(value)
}
useEffect(
() => {
if (isFirstRef.current) {
isFirstRef.current = false;
return;
}
let spotlist = Spotify.playlistsearch(searchString)
let tablelist = []
spotlist.then(val =>{
val.forEach(element =>{
tablelist.push(
{
name: element.description,
track_count: element.tracks.total,
})
}
)})
setPlaylists(tablelist)
}, [searchString] );
return (
<div className="App">
<Searchform search={search}/>
<Table playlists={playlists}/>
</div>
)
};
playlists 道具在 PlayListTable 组件检查器下显示为存在,但未呈现。如果我在看到组件检查器中存在的数据后编辑文件,我就能够获取要呈现的数据。表.js
import React from 'react'
import { Icon, Label, Menu, Table } from 'semantic-ui-react'
const PlayListTable = ({ playlists }) => {
return(
<Table celled>
<Table.Header>
<Table.Row>
<Table.HeaderCell>Playlist</Table.HeaderCell>
<Table.HeaderCell>Track Count</Table.HeaderCell>
</Table.Row>
</Table.Header>
<Table.Body>
{playlists.map( (playlist) => {
return (
<Table.Row>
<Table.Cell>
{playlist.name}
</Table.Cell>
<Table.Cell>
{playlist.track_count}
</Table.Cell>
</Table.Row>
)
}
)
}
</Table.Body>
<Table.Footer>
<Table.Row>
<Table.HeaderCell colSpan='3'>
<Menu floated='right' pagination>
<Menu.Item as='a' icon>
<Icon name='chevron left' />
</Menu.Item>
<Menu.Item as='a'>1</Menu.Item>
<Menu.Item as='a'>2</Menu.Item>
<Menu.Item as='a'>3</Menu.Item>
<Menu.Item as='a'>4</Menu.Item>
<Menu.Item as='a' icon>
<Icon name='chevron right' />
</Menu.Item>
</Menu>
</Table.HeaderCell>
</Table.Row>
</Table.Footer>
</Table>
)
}
export default PlayListTable
解决方案
问题
您可能会收到正确的数据,但您没有在正确的时间更新您的状态。spotlist
返回一个您从中链接的 Promise,但在处理 Promise 链的块之前setPlaylists(tablelist)
调用已入队。回调是 100% 同步代码。then
useEffect
let spotlist = Spotify.playlistsearch(searchString);
let tablelist = [];
spotlist.then(val => { // <-- (1) then callback is placed in the event queue
val.forEach(element => { // <-- (3) callback is processed, tablelist updated
tablelist.push({
name: element.description,
track_count: element.tracks.total,
});
}
)});
setPlaylists(tablelist); // <-- (2) state update enqueued, tablelist = []
解决方案 - 将状态更新放在 Promise 链中
您可以forEach
进入一个临时数组,但将响应数据映射到状态值是更“反应”的处理方式。它也更简洁。
Spotify.playlistsearch(searchString)
.then(val => {
setPlaylists(val.map(element => ({
name: element.description,
track_count: element.tracks.total,
})));
}
)});
推荐阅读
- java - @DataJpaTest 使用存储库保存实体,无法使用 JdbcTemplate 检索数据
- javascript - 如何正确设置元素的高度属性?
- python - 将数据集拆分为训练和测试以在 python 中进行时间序列分析
- javascript - 为什么我的 useEffect 中仍然有陈旧的数据?
- javascript - Angular - 惊人的时间选择器(ATP)TimePicker在选择小时后不会切换到分钟
- youtube-data-api - YouTube V3 LiveBroadcasts:列出服务帐户凭据问题
- arrays - 如何从具有多个对象的嵌套数组中提取信息?(AdminReport.Activity.list)
- amazon-web-services - AWS API 网关配置来自不同区域的 vpc 端点 ID
- javascript - Javascript 正则表达式 - 金额中的第一个数字接受非零
- c++ - 使用一个 cout 命令打印多个字符串,每个字符串放在不同的(文本编辑器)行