我一直在为React 18The Movie Database (TMDB) API的SPA工作.

我目前正在做一台search functionality.

Searchbox.jsx个组成部分中,我有:

import { ReactComponent as Magnifier } from '../../icons/magnifier.svg';
import { useEffect, useState } from 'react';
import axios from 'axios';

function Searchbox({ movie }) {

 const API_URL = 'https://api.themoviedb.org/3';
 const [searchInput, setSearchInput] = useState('');
 const [results, setResults] = useState([]);
 const timeOutInterval = 1000;

const doMovieSearch = async (e) => {
setSearchInput(e.target.value);

if (searchInput.length >= 3) {
  const { data: { results } } = await axios.get(`${API_URL}/search/movie?query=${searchInput}`, {
    params: {
      api_key: process.env.REACT_APP_API_KEY
    }
  });

  setResults(results);
  console.log(results);
}

}

  return (
    <form className="search_form w-100 mx-auto mt-2 mt-md-0">
      <div className="input-group">
        <input className="form-control search-box" type="text" value={searchInput} onKeyUp={debounceMovieSearch} placeholder="Search movies..." />
        <div className="input-group-append">
          <button className="btn" type="button">
            <Magnifier />
          </button>
        </div>
      </div>
    </form>
  );
}

export default Searchbox;

问题

对于我一直无法弄清楚的原因,执行搜索失败并出现以下错误:

无法读取未定义的属性(正在读取‘Target’).

错误在第setSearchInput(e.target.value)行.

console.log(results)不记录任何内容.

问题

  1. 我做错了什么?
  2. 解决此问题的最可靠方法是什么?

推荐答案

您需要将该事件传递给debaleMovieSearch,并进一步传递给doMovieSearch:

import { ReactComponent as Magnifier } from '../../icons/magnifier.svg';
import { useState } from 'react';
import axios from 'axios';

function Searchbox({ movie }) {

  const API_URL = 'https://api.themoviedb.org/3';
  const [searchInput, setSearchInput] = useState('');
  const [results, setResults] = useState([]);
  const timeOutInterval = 1000;

  const doMovieSearch = async (e) => {
    setSearchInput(e.target.value);

    if (e.target.value.length >= 3) {
      const { data: { results } } = await axios.get(`${API_URL}/search/movie`, {
        params: {
          api_key: process.env.REACT_APP_API_KEY,
          query: e.target.value
        }
      });

      setResults(results);
    }
  }

  const debounceMovieSearch = (e) => {
    setTimeout(() => doMovieSearch(e), timeOutInterval);
  }

return (
    <form className="search_form w-100 mx-auto mt-2 mt-md-0">
      <div className="input-group">
      <input className="form-control search-box" type="text" defaultValue={searchInput} onKeyUp={debounceMovieSearch} placeholder="Search movies..." />
        <div className="input-group-append">
          <button className="btn" type="button">
            <Magnifier />
          </button>
        </div>
      </div>
    </form>
 );
}
export default Searchbox;

此外,我对doMovieSearch中的条件做了一个小调整,使用e.Target.value.long而不是searchInput.long,因为我们想要判断用户输入的长度,而不是之前的searchInput状态.

Javascript相关问答推荐

react 页面更改类别时如何返回第0页

Vue Quill css仅应用于我的第一个Quill Editor组件+如何自定义工具栏

如何让\w token 在此RegEx中表现得不贪婪?

可以的.是否可以在不预编译的情况下使用嵌套 Select 器?

Bootstrap动态选项卡在切换选项卡后保持活动状态,导致元素堆叠

调用removeEvents不起作用

如何从JSON数组添加Google Maps标记—或者如何为数组添加参数到标记构造器

角色 map 集/spritebook动画,用户输入不停止在键上相位器3

浮动Div的淡出模糊效果

在这种情况下,如何 for each 元素添加id?

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

如何粗体匹配的字母时输入搜索框使用javascript?

编剧如何获得一个div内的所有链接,然后判断每个链接是否都会得到200?

如何在ASP.NET项目中使用Google Chart API JavaScript将二次轴线值格式化为百分比

基于props 类型的不同props ,根据来自接口的值扩展类型

Rxjs流中生成IMMER不能在对象上操作

将数组扩展到对象中

无法读取未定义的属性(正在读取合并)-react RTK

Socket.IO在刷新页面时执行函数两次

在将元素追加到DOM之前,createElement()是否会触发回流?混淆abt DocumentFragment行为