代码之家  ›  专栏  ›  技术社区  ›  mrKorny

将api数据回迁到组件

  •  1
  • mrKorny  · 技术社区  · 5 年前

    我正在尝试从电影数据库api制作一个应用程序。 我遇到了一个小问题。 我有两个部分。首先,我使用fetch,并使用map()函数来显示来自api的数据。如何正确连接它们?

    https://codesandbox.io/s/p3vxqqz53q

    渲染列表的第一个组件:

    import React, { Component } from 'react';
    import Card from "./Card";
    
    class ListApp extends Component {
        constructor(props){
            super(props);
            this.state = {
                items: [],
                isLoaded: false,
            }
        };
        componentDidMount = () => {
            fetch("https://api.themoviedb.org/3/movie/popular?api_key=xxxxxxxx&page=1")
            .then(resp => resp.json())
            .then(resp => {
                this.setState({
                    isLoaded: true,
                    items: resp.results
                })
                console.log(this.state.items)      
        })};
    
        render() {
            var {isLoaded, items} = this.state;
            return (
                <div>
                    {items.map( () => ( <Card/> ) )};
                </div>
            );
        }
    }
    
    export default ListApp;
    

    第二组件卡:

    import React from 'react';
    
    const Card = (items) => { 
            return (
                <div className="movie-container">
                    <img src="https://image.tmdb.org/t/p/w185/{items.poster_path}" alt="NO PHOTO" className="movie-container__img" />
                    <div className="movie-container__about">
                        <span className="movie-container__percent">{items.vote_average}</span>
                        <h2 className="movie-container__title">{items.original_title}</h2>
                        <p className="movie-container__date">{items.release_date}</p>
                        <p className="movie-container__text">{items.overview}</p>
                        <a href="https://www.themoviedb.org/movie/" className="movie-container__more">MORE</a>
                    </div>
                </div>
                )
    }
    
    export default Card;
    
    2 回复  |  直到 5 年前
        1
  •  2
  •   Aakash Verma    5 年前

    你需要通过考试 item 对象作为卡片组件的道具,如

    {items.map(item => <Card key={item.id} item={item} /> )}
    

    项目 从卡组件内部,如

    const Card = (props) => {
      const {item} = props;
      ...
    
    }
    
        2
  •  0
  •   Aldo    5 年前

    这个代码应该可以工作。

    ListApp中的地图@Aakash建议:

     render() {
        var { isLoaded, items } = this.state;
        return (
          <div>
            {items.map(item => (<Card key={item.id} item={item} />))};
                </div>
        );
      }
    

    // Card.js
    import React from 'react';
    
    const Card = (props) => {
        const { item } = props;
        return (
            <div className="movie-container">
                <img src="https://image.tmdb.org/t/p/w185/{items.poster_path}" alt="NO PHOTO" className="movie-container__img" />
                <div className="movie-container__about">
                    <span className="movie-container__percent">{item.vote_average}</span>
                    <h2 className="movie-container__title">{item.original_title}</h2>
                    <p className="movie-container__date">{item.release_date}</p>
                    <p className="movie-container__text">{item.overview}</p>
                    <a href="https://www.themoviedb.org/movie/" className="movie-container__more">MORE</a>
                </div>
            </div>
        )
    }
    
    export default Card;