Css 实现一个下拉菜单,可以访问具有相同标题的电影。React、Axios、MovieDB API

Css 实现一个下拉菜单,可以访问具有相同标题的电影。React、Axios、MovieDB API,css,reactjs,api,Css,Reactjs,Api,我正在制作一个电影搜索应用程序,现在我可以搜索一部电影,背景、海报图像、标题和人气都会显示在屏幕上。我遇到了一个问题,我无法访问同名的不同电影。例如,当我搜索Joker时,它会显示出现在我代码中的第一个标题 const title = res.data['results'][0]['title']; “[0]”很重要,因为它只访问搜索中的第一部电影,以下是API浏览器搜索的图像,以供参考: 现在也会有不同数量的同名电影,这取决于搜索结果,每一部都会在API下以不同的编号列出。最新和最流行的是

我正在制作一个电影搜索应用程序,现在我可以搜索一部电影,背景、海报图像、标题和人气都会显示在屏幕上。我遇到了一个问题,我无法访问同名的不同电影。例如,当我搜索Joker时,它会显示出现在我代码中的第一个标题

const title = res.data['results'][0]['title'];
“[0]”很重要,因为它只访问搜索中的第一部电影,以下是API浏览器搜索的图像,以供参考:

现在也会有不同数量的同名电影,这取决于搜索结果,每一部都会在API下以不同的编号列出。最新和最流行的是[0],然后是[1],等等。我想我需要一个for循环或forEach来收集结果[number],然后返回所有的['original_title]或['title],然后在搜索时返回每个结果作为下拉菜单,而不是在提交时,这样用户就可以在搜索结果时单击它们以自动完成。这也是我使用React的第一个项目,我不确定是否应该在clickHandler中进行此操作,或者将其放置在其他地方

我的大部分代码都在Movielist.js中,但这里是我的全部3个代码文件,以防万一。我并没有被我的想法所束缚,只要是实现搜索同名电影的最简单方法

Movielist.js

import React from 'react';
import axios from 'axios';
import '../CSS/style.css'

export default class Movielist extends React.Component {
  state = {
    title: "",
    popularity: "",
    poster: "",
    background: "",
  }

    clickHandler = (event) => {
        if (event.keyCode === 13) {
           const query = event.target.value;
           const API_KEY = 'caf02a958f137f43327649b2b8721302';
    axios.get(`https://api.themoviedb.org/3/search/movie?api_key=${API_KEY}&query=${query}`)
      .then(res => {

        const title = res.data['results'][0]['title'];
        this.setState({ title });

        const popularity = res.data['results'][0]['popularity']
        this.setState({ popularity });

        const poster = res.data['results'][0]['poster_path']
        this.setState({ poster });

        const background = res.data['results'][0]['backdrop_path']
        this.setState({ background })


      })
        }
    }

  render() {
    const backgroundStyle = {
      backgroundImage: `linear-gradient(to bottom, rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.8)), 
  url(https://image.tmdb.org/t/p/w500${this.state.background})`,

      backgroundSize: "cover",
      height: "100vh"
  }

    return (
      <div id="main-div" style={backgroundStyle}>
        <div id="second-div">
         <input type="search" id="search" onKeyDown={event => this.clickHandler(event)} />
         <h1 id="title">Title: {this.state.title}</h1>
         <h1 id="popularity">Popularity: {this.state.popularity}</h1>
         <img id="poster" src={`https://image.tmdb.org/t/p/w300${this.state.poster}`} />
      </div>
    </div>

    )
  }
}

App.js

import React from "react"
import Movielist from './components/Movielist'



function App() {
    return (
        <div>
            <Movielist />
        </div>

    )
}

export default App
index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(
    <App />,
    document.getElementById('root')
);


你可以做很多事情,有很多方法,例如:

在clickHandler内部,将整个结果数组设置为状态:

this.setState{results:res.data.results}

然后在render内部使用.map函数迭代结果,并为每个结果项render返回一些内容

<div id="main-div" style={backgroundStyle}>
<input type="search" id="search" onKeyDown={event => this.clickHandler(event)} />
  <div id="results">
    {this.state.results.map(item => {
      return (
        <div key={item.id}>
           <h1 id="title">Title: {item.title}</h1>
           <h1 id="popularity">Popularity: {item.popularity}</h1>
           Basically render whatever you want
        </div>
      )
    })}
  <div>
</div>

您可以使用.slice函数来限制要显示的项目数,如下面的.state.results.slice0,5.map。。。将切片前5个项目。你可以在渲染中使用它,甚至当你使用setState时,我应该把它放在渲染中的什么地方?无论你想渲染到哪里:刚刚添加了一些说明,希望它现在有意义