【问题标题】:real time populate search with react用反应实时填充搜索
【发布时间】:2021-05-20 09:10:19
【问题描述】:

现在我的搜索功能是我必须单击搜索图标才能显示结果,所以我想将其更改为实时搜索。当我在输入中输入名称时,它会自动启动为我显示用户卡

这是我的以下代码:

const [searchQuery, setSearchQuery] = useState("");

  const handleChange = (event) => {
    event.preventDefault();
    setSearchQuery(event.target.value);
  };

  const handleSubmit = async (e) => {
    e.preventDefault();
    const res = await axios.get(
      `/api/v1/search/users/invite/${searchQuery}/${teamId}`
    );
    setInvitees(res.data[0]);
    setShowInvitees(!showInvitees);
  };
  useEffect(() => {
    if (searchQuery === "") {
      setInvitees([]);
    }
  }, [searchQuery]);

        <form onSubmit={handleSubmit}>
          <div className="invitees-search">
            <Button
              className="input invitees--search-icon"
              style={{ color: "white", backgroundColor: "#00B790" }}
              type="submit"
            >
              <SearchIcon />
            </Button>
            <input
              className="invitees--search_input"
              type="text"
              name="name"
              onChange={handleChange}
              placeholder="Name"
              aria-label="Search bar"
              pattern="^[a-zA-Z0-9 ]+"
              required
            />
          </div>
        </form>

当我的搜索查询长度 >= 2 个字母时,如何使其自动填充?

【问题讨论】:

标签: javascript reactjs react-hooks


【解决方案1】:

您可以在useEffect 的帮助下这样做

说明:

  1. 我将您的 handleSubmit 函数重命名为 getInvitees
  2. searchQuery长度大于等于2时调用getInvitees函数

解决方案

useEffect(() => {
   if(searchQuery === "") {
      setInvitees([]);
   }    
   if((searchQuery||'').length >= 2) {
      getInvitees();
   }    
}, [searchQuery]);

const getInvitees = async () => { // renamed handleSubmit function to getInvitees
   const res = await axios.get(`/api/v1/search/users/invite/${searchQuery}/${teamId}`);
   setInvitees(res.data[0]);
   setShowInvitees(!showInvitees);
};

【讨论】:

  • 我收到错误TypeError: Cannot read property 'preventDefault' of undefined
  • @NhanNguyen 删除该行,现在不需要了。我也更新了答案。
  • 请问!为什么我们使用useEffect
  • 您也可以在 handleChange 中执行相同的代码,但是您必须将 e.target.value 传递给 getInvitees 函数。这是因为 seState ( setSearchQuery(e.target.value) ) 的异步特性。
  • 你可以在handleChange方法中通过console.log(searchQuery)来检查。在那里,当你输入时你会得到旧值。但是在 useEffect 回调中你总是会得到最新的更新值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多