【问题标题】:How to implement onClick componentDidMount() in React using Axios如何使用 Axios 在 React 中实现 onClick componentDidMount()
【发布时间】:2020-06-12 10:15:15
【问题描述】:

我正在尝试使用 React、Axios 和 movieDB API 制作电影搜索功能。我现在尝试实现的功能是在搜索栏中输入电影,然后单击提交按钮会将电影标题作为 H1 元素返回。

我的 onClick 功能不起作用:<button onClick={(e)=>clickHandler()}>submit</button>

componentDidMount() 仅在页面刷新时起作用,并且由于提交按钮损坏,您无法搜索任何内容。

我不确定如何实现这一点,但我也不介意是否可以通过按 Enter 键而不是使用按钮来搜索它,以更容易者为准。

这是我目前的代码。

App.js

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



function App() {
    return (
        <div>
            <input type="search" id="search" />
            <button onClick={(e)=>clickHandler()}>submit</button>
            <h1 id="title">title</h1>
            <Movielist />
        </div>

    )
}

export default App

Movielist.js

import React from 'react';

import axios from 'axios';

export default class Movielist extends React.Component {
  state = {
    title: ""
  }

    componentDidMount() {
    const API_KEY = '***********************';
    const query = document.getElementById('search').value;
    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 });

      })

  }

  render() {
    return (

    <h1>{this.state.title}</h1>

    )
  }
}

index.js

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

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

【问题讨论】:

    标签: javascript reactjs api


    【解决方案1】:
    import React from 'react';
    
    import axios from 'axios';
    
    export default class Movielist extends React.Component {
      state = {
        title: ""
      }
    
        clickHandler = (event) => {
            if (event.keyCode === 13) {
               const query = event.target.value;
               const API_KEY = '***********************';
        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 });
    
          })
            }
        }
    
      render() {
        return (
    
    <input type="search" id="search" onKeyDown={event => this.clickHandler(event)} />
        <h1>{this.state.title}</h1>
    
        )
      }
    }
    

    【讨论】:

    • 我收到此错误 ./src/App.js Line 10:35: 'clickHandler' is not defined no-undef
    • ``` 从“react”导入反应;导入“./styles.css”;导出类 App 扩展 React.Component { clickHandler(event) { if (event.keyCode === 13) { const query = event.target.value;常量 API_KEY = '****************************'; console.log(event.target.value) } } render() { return ( ); } } ```
    • 这只是将我在文本框中写的内容放入控制台,而不是从 API 获取电影的标题并将其作为 h1 元素返回
    • 没问题,我已经更新了我原来的答案。试试看。
    • 回车键的keyCode是13
    【解决方案2】:

    点击按钮后,您应该调用 API 来获取电影列表,然后将您获得的数据传递给 Movielist。试试这个:
    App.js:

    import React from "react"
    import axios from 'axios'
    import Movielist from './components/Movielist'
    
    function App() {
        const [movieList, setMovieList] = React.useState([])
        const handleOnSubmit = () => {
          const API_KEY = '***********************';
          const query = document.getElementById('search').value;
          axios.get(`https://api.themoviedb.org/3/search/movie?api_key=${API_KEY}&query=${query}`)
            .then(res => {
              const title = res.data['results'][0]['title'];
              setMovieList(res.data['results'])
            })
        }
        return (
            <div>
                <input type="search" id="search" />
                <button onClick={handleOnSubmit}>submit</button>
                <h1 id="title">title</h1>
                <Movielist movieList={movieList}/>
            </div>
    
        )
    }
    
    export default App

    Movielist.js:

    import React from 'react';
    
    const Movielist = ({movieList}) => {
        return (
        <div>
          {
            movieList.map(movie => <h1 key={movie.key}>{movie.title}</h1>)
          }
        <div/>
        )
      }
    }
    
    export default Movielist

    【讨论】:

      【解决方案3】:
      import React, {useState} from "react"
      import axios from 'axios';
      import Movielist from './components/Movielist'
      
      const [title, setTitle] = useState("")
      const API_KEY = '***********************'
      
      function App() {
      
        const clickHandler = () => {
          const query = document.getElementById('search').value;
          axios.get(`https://api.themoviedb.org/3/search/movie?api_key=${API_KEY}&query=${query}`)
          .then(res => {
            const title = res.data['results'][0]['title'];
            setTitle(title);
          })
      
       }
      
          return (
              <div>
                  <input type="search" id="search" />
                  <button onClick={clickHandler}>submit</button>
                  <h1 id="title">title</h1>
                  <Movielist title={title} />
              </div>
      
          )
      }
      
      export default App
      

      只需将调用 api 句柄移动到您的 onclik 函数,然后将标题道具传递给电影列表

      【讨论】:

      • 我收到一条错误消息,提示 ./src/App.js Line 10:35: 'clickHandler' is not defined no-undef 并且当我尝试像这样将导入添加到 App.js 中时 import React from "react" import Movielist from './components/Movielist' import clickHandler from './components/Movielist' 它返回错误./src/components/Movielist.js Module not found: Can't resolve './components/Movielist' in 'D:\Web Development\React Projects\moviesearch\src\components'
      • 尝试将 const clickHandler = () => .... 移到您的 App func sr 中:D
      • 我要把它放在函数 App() 下吗?
      • 抱歉,我把我的 App.js 代码误认为是 Movielist.js。但是现在我改变了我得到的错误是Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: 1. You might have mismatching versions of React and the renderer (such as React DOM) 2. You might be breaking the Rules of Hooks
      • 哦,这是因为你的 App 是 func 组件,而你的电影列表是类组件。尝试将电影列表切换到 func 组件。挂钩功能仅在 func 组件中运行:D
      【解决方案4】:

      如果您想在用户按下提交按钮后查询 API。您应该在调用处理程序中调用 API,然后将状态从 App 传递到 MovieList 作为道具

      export class App extends React.Component {
          state = {
              title: ""
          }
      
          clickHandler() {
              const API_KEY = '***********************';
              const query = document.getElementById('search').value;
              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 });
              });
          }
      
          render() {
              return (
                  <div>
                      <input type="search" id="search" />
                      <button onClick={(e)=>clickHandler()}>submit</button>
                      <h1 id="title">title</h1>
                      <Movielist list={this.state.title}/>
                  </div>
      
              )
          }
      }
      
      export class MovieList extends React.Component {
          render() {
               <h1>{this.props.title}</h1>
          }
      }
      

      或者,您可以将输入包装在一个元素中并使用 onSubmit + evt.preventDefault() 代替,这样做您可以处理按钮单击并按“Enter”提交。

      【讨论】:

      • 我收到错误:./src/App.js Line 28:1: Parsing error: Only one default export allowed per module.
      • 这是因为我将假设在 2 个不同文件中的两个脚本放入一个脚本块中。如果您想将 MovieList 和 App 放入同一个文件中,您需要从 export default class Appexport default class MovieList 中删除一个或两个 default,具体取决于您的项目文件的结构。
      猜你喜欢
      • 2019-08-24
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 2021-05-22
      相关资源
      最近更新 更多