Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用React在映射的API数据中获取列表项的值很困难_Javascript_Reactjs - Fatal编程技术网

Javascript 使用React在映射的API数据中获取列表项的值很困难

Javascript 使用React在映射的API数据中获取列表项的值很困难,javascript,reactjs,Javascript,Reactjs,我在从列表项中获取特定数据时遇到了一些困难,这些数据来自使用React映射的API 在我的渲染中,我映射了一个艺术家列表,在此基础上,它将渲染艺术家名称、歌曲标题和乐谱的URL: render(){ return( <div className="songContainerOuter"> {this.props.artist.map((artist, i) => { return (

我在从列表项中获取特定数据时遇到了一些困难,这些数据来自使用React映射的API

在我的渲染中,我映射了一个艺术家列表,在此基础上,它将渲染艺术家名称、歌曲标题和乐谱的URL:

render(){
    return(
        <div className="songContainerOuter">
            {this.props.artist.map((artist, i) => {
                return (
                    <div className="songContainerInner" key={i}>
                        <ul>
                            <div className="leftSide">
                                <li ref={ref => this.artistName = ref}>{artist}</li>
                            </div>
                            <div className="rightSide">
                                <div className="topRight">
                                    <li ref={ref => this.songTitle = ref}>{this.props.title[i]}</li>
                                </div>
                                <div className="bottomRight">
                                    <li ref={ref => this.songUrl = ref}><a href={`${this.props.link[i]}`}><i className="fas fa-link"></i></a></li>
                                    <li onClick={this.addFavourite}><i className="fas fa-plus"></i></li>
                                </div>
                            </div>
                        </ul>
                    </div>
                )
            })}
        </div>
    )
}

是否有其他方法在li标记中存储值,并且仅在每个映射的div中存储唯一的值

@anbhd,您能做以下更改并测试它吗: 将以下部分添加到构造函数部分:

并更改onClick函数,如下所示:

<li onClick={this.addFavourite(artist)}><i className="fas fa-plus"></i></li>

问题是您正试图在setState之后获取数据。setState是异步操作,因此您将获得旧数据。尝试将日志放入setState回调中

    addFavourite(e){
        e.preventDefault();
        const favs ={
            artist: this.artistName.textContent,
            title: this.songTitle.textContent,
            url: this.songUrl.textContent.outerHTML,
        };
        const newFavs = Array.from(this.state.favourites);
        newFavs.push(favs);
        this.setState({
            favourites: newFavs
        },()=>{
       console.log(this.state.favourites)//inside setState callback
})
       }

请尝试以下方法。如果您想检查您的状态是否已正确更新,请参阅@Ved answer

addFavourite(artist, songIndex){
    const fav = {
        artist,
        title: this.props.title[songIndex],
        url: this.props.link[songIndex]
    };

    const newFavs = Array.from(this.state.favourites);
    newFavs.push(favs);

    this.setState({
        favourites: newFavs
    });
}

render(){
    return (
        <div className="songContainerOuter">
            {this.props.artist.map((artist, i) => {

                const { link, title } = this.props;

                return (
                    <div className="songContainerInner" key={i}>
                        <ul>
                            <div className="leftSide">
                                <li>{artist}</li>
                            </div>
                            <div className="rightSide">
                                <div className="topRight">
                                    <li>{title[i]}</li>
                                </div>
                                <div className="bottomRight">
                                    <li><a href={`${link[i]}`}><i className="fas fa-link"></i></a></li>
                                    <li onClick={event => this.addFavourite(artist, i)}><i className="fas fa-plus"></i></li>
                                </div>
                            </div>
                        </ul>
                    </div>
                )
            })}
        </div>
    )
}

请发一封道歉信,我已经用这种方式设置了构造器。如果我将li onClick更改为您建议的,我将无法获取任何数据,因此这不起作用。请您将其更改为onClick={this.addFavoriteArtist},并将您的函数更改为`addFavoriteArtist{console.logartist}``谢谢!它起作用了!昨晚我有一个不同的解决方案,我只是点击document.getElementById,但我不确定这是否不像你的解决方案那么优雅。我将更深入地了解这一点。
    addFavourite(e){
        e.preventDefault();
        const favs ={
            artist: this.artistName.textContent,
            title: this.songTitle.textContent,
            url: this.songUrl.textContent.outerHTML,
        };
        const newFavs = Array.from(this.state.favourites);
        newFavs.push(favs);
        this.setState({
            favourites: newFavs
        },()=>{
       console.log(this.state.favourites)//inside setState callback
})
       }
addFavourite(artist, songIndex){
    const fav = {
        artist,
        title: this.props.title[songIndex],
        url: this.props.link[songIndex]
    };

    const newFavs = Array.from(this.state.favourites);
    newFavs.push(favs);

    this.setState({
        favourites: newFavs
    });
}

render(){
    return (
        <div className="songContainerOuter">
            {this.props.artist.map((artist, i) => {

                const { link, title } = this.props;

                return (
                    <div className="songContainerInner" key={i}>
                        <ul>
                            <div className="leftSide">
                                <li>{artist}</li>
                            </div>
                            <div className="rightSide">
                                <div className="topRight">
                                    <li>{title[i]}</li>
                                </div>
                                <div className="bottomRight">
                                    <li><a href={`${link[i]}`}><i className="fas fa-link"></i></a></li>
                                    <li onClick={event => this.addFavourite(artist, i)}><i className="fas fa-plus"></i></li>
                                </div>
                            </div>
                        </ul>
                    </div>
                )
            })}
        </div>
    )
}