javascript - 如何从 fetch REACT.js 显示 map 函数

标签 javascript reactjs react-native

这是我第一次使用这个网站,所以请耐心等待...... 我正在尝试使用 youtube api 从播放列表中显示 10 个 youtube 视频的数组。到目前为止,我能够通过 api console.log json 数据。尽管当我尝试使用 map 函数在我的 React 应用程序中显示 json 数据时,问题就出现了。

这是我的所有代码:

import React, { Component } from "react";
import './Videos.css';
import VideosCP from '../Pages/VideosPage/VideosSearch'
import youtubeSearch from "../../api/youtubeSearchApi";
import VideosList from "../Pages/VideosPage/VideoList";

const YOUTUBE_PLAYLIST_ITEMS_API = 'https://www.googleapis.com/youtube/v3/playlistItems';

let url = `${YOUTUBE_PLAYLIST_ITEMS_API}?part=snippet&playlistId=myPlaylistId&maxResults=10&key=myYoutubekey`

function Demo() {
    
}

class Videos extends Component{

    state = {
        videoMetaInfo:[],
        selectedVideoId: null
    }

    onVideoSelected = videoId => {
        this.setState({
            selectedVideoId:videoId
        })
    }

    onSearch = async keyword => {
        const response = await youtubeSearch.get("/search",{
            params:{
                q:keyword
            }
        })
        console.log(this.state);

        this.setState({
            videoMetaInfo: response.data.items,
            selectedVideoId: 'Nl3DoewG3Co'
        })
    }

    playlistRender = async () => {
        const data =  await fetch(url);
        let commits = await data.json();
        console.log('data', commits)

    }

    render(){

        const Data = ({data}) => {
            data = this.playlistRender()
            const results = data.items.map((item)=>{
                const {id, snippet = {}} = item
                const title = snippet
                return(
                    <li key={id}>
                        <h3>{title}</h3>
                    </li>
                )
            });
            return results
        }

        return(

            <div className="wrapper">
                <div className="wrapper-inner scroll">
                    <VideosCP onSearch={this.onSearch}/>
                    <VideosList onVideoSelected={this.onVideoSelected}
                    data={this.state.videoMetaInfo}/>
                    <ul>
                       <Data/>
                    </ul>
                </div>
            </div>
        );
    }
}

export default Videos

代码在终端中编译得很好,但一旦进入浏览器,它就会发出错误:“无法读取未定义的属性‘map’”。

因此,错误是由以下行引起的:data.items.map((item)=>{

更奇怪的是,浏览器中的控制台识别出数组中有一个“items”。为什么浏览器向我抛出此错误?不能映射项目吗?如果是这样为什么不呢?这个错误如何修复?

到目前为止,我已经尝试了所有方法,这是我得到的最接近的结果,但还没有结果。

请帮助我,堆栈溢出是我唯一的希望...

最佳答案

您从 API 加载的数据是有状态的,因此您需要在加载后将其设置为有状态。然后,一旦存在状态信息,您就可以对其进行映射。

我还添加了 componentDidMount 方法调用,以确保我们在组件安装后调用 API。

class Videos extends Component{

    state = {
        videoMetaInfo:[],
        selectedVideoId: null,
        commits: []
    }

    onVideoSelected = videoId => {
        this.setState({
            selectedVideoId:videoId
        })
    }

    onSearch = async keyword => {
        const response = await youtubeSearch.get("/search",{
            params:{
                q:keyword
            }
        })
        console.log(this.state);

        this.setState({
            videoMetaInfo: response.data.items,
            selectedVideoId: 'Nl3DoewG3Co'
        })
    }

    playlistRender = async () => {
        const data =  await fetch(url);
        let commits = await data.json();
        this.setState({ commits });
    }

    componentDidMount() {
        this.playlistRender();
    }

    render(){
        return(
            <div className="wrapper">
                <div className="wrapper-inner scroll">
                    <VideosCP onSearch={this.onSearch}/>
                    <VideosList onVideoSelected={this.onVideoSelected}
                    data={this.state.videoMetaInfo}/>
                    <ul>
                        {this.state.commits.map((item) => {
                            const {id, snippet = {}} = item
                            const title = snippet
                            return (
                                <li key={id}>
                                    <h3>{title}</h3>
                                </li>
                            )
                        })}
                    </ul>
                </div>
            </div>
        );
    }
}

export default Videos

关于javascript - 如何从 fetch REACT.js 显示 map 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65376123/

相关文章:

reactjs - 单击时如何切换 Material UI 图标

react-native - Expo/React Native TabView 在状态改变时重新渲染组件/标签

javascript - 为什么我会收到无效值错误?

javascript - angular js - 选择条件 "comprehension expression"

javascript - 如何防止 Node.js 对关键变量进行垃圾收集 (GC)

javascript - React 使用 ReactDOM.render 和注入(inject)组件的不良做法?

javascript - 使用受控输入 react contentEditable div

javascript - 在 JavaScript 中有没有像 `bit` 这样的东西?

javascript - 如何通过css更改进度条填充颜色

android - 包 com.reactnativenavigation 不存在