Javascript React实时搜索获取API

Javascript React实时搜索获取API,javascript,reactjs,Javascript,Reactjs,我需要对电影进行搜索输入,我需要进行现场搜索。 它需要在用户输入3个字符后一秒钟后触发。 如何使用功能组件实现此功能?使用自定义挂钩,可以通过以下方式实现: import React,{useState}来自“React”; 进口{ 使用异步回调, E_REASON_已卸载, 取消错误 }来自“use-async-effect2”; 从“c-promise2”导入{CPromise}; 从“cp axios”导入cpAxios; 导出默认函数TestComponent(道具){ const[t

我需要对电影进行搜索输入,我需要进行现场搜索。 它需要在用户输入3个字符后一秒钟后触发。
如何使用功能组件实现此功能?

使用自定义挂钩,可以通过以下方式实现:

import React,{useState}来自“React”;
进口{
使用异步回调,
E_REASON_已卸载,
取消错误
}来自“use-async-effect2”;
从“c-promise2”导入{CPromise};
从“cp axios”导入cpAxios;
导出默认函数TestComponent(道具){
const[text,setText]=useState(“”);
const handleSearch=useAncyncCallback(
功能*(事件){
const{value}=event.target;
if(value.length<3)返回;
收益率c减少延迟(1000);
setText(“搜索…”);
试一试{
常数响应=收益率(
`https://rickandmortyapi.com/api/character/?name=${value}`
).超时(道具超时);
setText(response.data?.results?.map(({name})=>name.join(“,”);
}捕捉(错误){
取消错误。重试(错误,原因为卸载);
setText(err.response?.status==404?“未找到”:err.toString();
}
},
{cancelPrevious:true}
);
返回(
UseAncyncCallback演示:Rickandmortyapi宇宙角色搜索
字符名:
{text}
取消请求
);
}

此代码已处理取消先前搜索序列(包括中止请求)以及在卸载组件时取消序列的操作,以避免出现React泄漏警告。

请共享一些代码
import React, { useState } from "react";
import {
  useAsyncCallback,
  E_REASON_UNMOUNTED,
  CanceledError
} from "use-async-effect2";
import { CPromise } from "c-promise2";
import cpAxios from "cp-axios";

export default function TestComponent(props) {
  const [text, setText] = useState("");

  const handleSearch = useAsyncCallback(
    function* (event) {
      const { value } = event.target;
      if (value.length < 3) return;
      yield CPromise.delay(1000);
      setText("searching...");
      try {
        const response = yield cpAxios(
          `https://rickandmortyapi.com/api/character/?name=${value}`
        ).timeout(props.timeout);
        setText(response.data?.results?.map(({ name }) => name).join(","));
      } catch (err) {
        CanceledError.rethrow(err, E_REASON_UNMOUNTED);
        setText(err.response?.status === 404 ? "Not found" : err.toString());
      }
    },
    { cancelPrevious: true }
  );

  return (
    <div className="component">
      <div className="caption">
        useAsyncCallback demo: Rickandmortyapi universe character search
      </div>
      Character name: <input onChange={handleSearch}></input>
      <div>{text}</div>
      <button className="btn btn-warning" onClick={handleSearch.cancel}>
        Cancel request
      </button>
    </div>
  );
}