用户键入时的搜索功能,而不必先提交表单

问题描述 投票:0回答:0

输入值以使用用户名或电子邮件在 GitHub 中搜索用户。对 GitHub API 端点执行 HTTP 请求,然后再次使用浏览器获取 API 获取用户的个人资料。请求 URL 将使用输入值。 .Tried Debounce 但没有用,下面是完整代码


import { useState } from "react";
import "./styles.css";

const API_URL = "https://api.github.com";

async function fetchResults(query) {
  try {
    const response = await fetch(`${API_URL}/search/users?q=${query}`);
    const json = await response.json();
    return json.items || [];
  } catch (e) {
    throw new Error(e);
  }
}

export default function App() {
  const [query, setQuery] = useState("");
  const [results, setResults] = useState([]);

  function onSearchChange(event) {
    setQuery(event.target.value);
  }

  async function onSearchSubmit(event) {
    event.preventDefault();
    const results = await fetchResults(query);
    setResults(results);
  }

  return (
    <div className="app">
      <main className="main">
        <h2>GitHub User Search</h2>
        <Form
          onChange={onSearchChange}
          onSubmit={onSearchSubmit}
          value={query}
        />
        <h3>Results</h3>
        <div id="results">
          <div>
            {results.map((user) => (
              <User
                key={user.login}
                avatar={user.avatar_url}
                url={user.html_url}
                username={user.login}
              />
            ))}
          </div>
        </div>
      </main>
    </div>
  );
}

function User({ avatar, url, username }) {
  return (
    <div className="user">
      <img src={avatar} alt="Profile" width="50" height="50" />
      <a href={url} target="_blank" rel="noopener noreferrer">
        {username}
      </a>
    </div>
  );
}

function Form({ onSubmit, onChange, value }) {
  return (
    <form className="search-form" onSubmit={onSubmit}>
      <input
        id="search"
        type="text"
        // onkeyup="processChange()"
        placeholder="Enter username or email"
        onChange={onChange}
        value={value}
      />
      {/* <button type="submit" >Search</button> */}
      <button onclick="processChange()">Click me</button>

    </form>
  );
}

function debounce(func, timeout = 300){
  let timer;
  return (...args) => {
    clearTimeout(timer);
    timer = setTimeout(() => { func.apply(this, args); }, timeout);
  };
}
function saveInput(){
  console.log('Saving data');
}
const processChange = debounce(() => saveInput());

我想要搜索功能,因为用户键入 github 电子邮件而不是必须先提交表单。

reactjs search
© www.soinside.com 2019 - 2024. All rights reserved.