【发布时间】:2020-04-22 05:04:57
【问题描述】:
我正在尝试使用从父组件中的获取请求接收到的数据来设置状态。我收到一组对象,每个对象都有以下键:“name”、“artist”、“url”、“cover”、“lrc”和“theme”。我正在使用 Object.keys() 映射对象数据,但我想知道如何以这种方式设置状态,以便将具有这六个键的多个对象存储在状态中,因此我的状态将如下所示:
this.state = { data: [{ {...}, {...}, {...}, etc... }] }
一个大问题是我的数据 - 来自父级中的提取请求 - 没有在这个 tempComp 组件中呈现。我将数据作为道具(this.props.playlist)传递。为什么父级中获取的数据没有在 tempComp 组件中呈现,以及如何设置多个对象的状态,正如我在下面尝试使用 Object.keys() 时所做的那样?非常感谢任何建议。
import React, { Component } from 'react'
class tempComp extends Component {
constructor(props) {
super(props);
this.state = {
data: [],
audio: [{
name: '',
artist: '',
url: '',
cover: '',
lrc: '',
theme: ''
}]
}
}
async componentDidMount() {
console.log('playlist in componentDidMount()', this.props.playlist) //<--- AudioPlayer data should be coming in here
var json = this.props.playlist;
var arr = [];
Object.keys(json).forEach(function (key) {
arr.push(json[key]);
});
arr.map(item => {
this.setState({
audio: [{
name: item.name,
artist: item.artist,
url: item.url,
cover: item.cover,
lrc: item.lrc,
theme: item.theme
}]
})
})
console.log(this.state.audio);
}
render() {
return (
<div>
</div>
)
}
}
export default tempComp
这里是父组件,为了澄清:
export default class PostContent extends Component {
constructor(props) {
super(props);
this.state = {
id: '',
episodeData: [],
}
}
async componentDidMount(){
const { id } = this.props.match.params;
const response = await fetch(`http://localhost:5000/episode/${id}/playlist`);
const jsonData = await response.json();
this.setState({
episodeData: jsonData, //this is working!...
id: id
});
console.log(this.state.episodeData) //...see?
}
render() {
return (
<Fragment>
<TempComp playlist={this.state.episodeData} />
<AudioPlayer playlist={this.state.episodeData} />
<Link id='home-link' to='/' activeClassName='active'>Homepage</Link>
{this.state.episodeData.map((item, i) => (
<div key={i} className="word-content">
<h2 className="show-title">{item.post_title}</h2>
<div className="episode-post-content">{item.post_content}</div>
</div>
))}
<Table data={this.state.data} />
<div className="bottom-link">
<Link id='home-link' to='/' activeClassName='active'>Homepage</Link>
</div>
</Fragment>
)
}
}
【问题讨论】:
-
你被骗了。您不能在地图中设置状态,因为它是一种异步方法。你可以做一些技巧,但首先检查一下:stackoverflow.com/questions/47735600/…
-
你为什么还要使用地图功能,你不能只是:- this.setState({ audio: arr });使用这个有什么问题吗?
标签: javascript reactjs