【问题标题】:If event is Enter Button or mouse click, do something如果事件是 Enter Button 或鼠标点击,做一些事情
【发布时间】:2021-03-03 22:22:31
【问题描述】:

我有一个搜索栏,我希望用户能够在单击搜索按钮或按下回车键时调用 handleSearch 函数。搜索按钮工作正常,但我无法在按下回车键时让它工作。请帮忙:)

import React, { useState } from 'react';
import { Form, FormControl, Button } from 'react-bootstrap';
import { useHistory } from 'react-router-dom';
import { useDispatch } from 'react-redux';
import { searchBlogs, setSearchQuery } from '../../actions/searchBlogsAction';

function SearchComponent() {
  const history = useHistory();
  const dispatch = useDispatch();
  const [searchInput, setSearchInput] = useState('');

  const inputHandler = (e) => {
    setSearchInput(e.target.value);
  };

  // Search blogs and redirect to the search results page
  const handleSearch = (e) => {
    if (e.keyCode === 13 || e == ??) {
      e.preventDefault();
      history.push('/search-results');
      dispatch(setSearchQuery(searchInput));
      dispatch(searchBlogs(searchInput));
      setSearchInput('');
    }
  };

  return (
    <Form inline>
      <FormControl
        type="text"
        size="sm"
        placeholder="Search"
        className="mr-sm-2"
        onChange={inputHandler}
        value={searchInput}
        onKeyPress={handleSearch}
      />
      <Button size="sm" variant="outline-secondary" onClick={handleSearch}>
        Search
      </Button>
    </Form>
  );
}

export default SearchComponent;

【问题讨论】:

  • 这应该抛出一个 SyntaxError。 if (e.keyCode === 13 || e == ??)。你不能像这样使用?
  • @HåkenLid 我不能肯定地说,但我认为他只是想显示?? 来问嘿,我应该在这里放什么?...
  • 事情是??实际上是新的Nullish coalescing operator。它的两边都必须有一个操作数。

标签: javascript reactjs


【解决方案1】:

试试这个:

      <FormControl
        type="text"
        size="sm"
        placeholder="Search"
        className="mr-sm-2"
        onChange={inputHandler}
        value={searchInput}
        onKeyPress={event => event.key === "Enter" && handleSearch()}
      />

handleSearch 函数应该是:

  const handleSearch = (e) => {
      e.preventDefault();
      history.push('/search-results');
      dispatch(setSearchQuery(searchInput));
      dispatch(searchBlogs(searchInput));
      setSearchInput('');
  }

【讨论】:

  • 嘿。我以前试过这个,不知道为什么它不起作用。当我按下回车键时,页面就会刷新。所以看起来它只是做默认行为。
【解决方案2】:

根据react-bootstrap docs regarding Form,您可以将onSubmit 回调传递给Form 组件,如下所示:

- <Form inline>
+ <Form inline onSubmit={handleSearch}>

【讨论】:

    【解决方案3】:

    您想将onSubmit 事件处理程序添加到表单中。

    import React, { useState } from 'react';
    import { Form, FormControl, Button } from 'react-bootstrap';
    import { useHistory } from 'react-router-dom';
    import { useDispatch } from 'react-redux';
    import { searchBlogs, setSearchQuery } from '../../actions/searchBlogsAction';
    
    function SearchComponent() {
      const history = useHistory();
      const dispatch = useDispatch();
      const [searchInput, setSearchInput] = useState('');
    
      const inputHandler = (e) => {
        setSearchInput(e.target.value);
      };
    
      // Search blogs and redirect to the search results page
      const handleSearch = (e) => {
        e.preventDefault();
        history.push('/search-results');
        dispatch(setSearchQuery(searchInput));
        dispatch(searchBlogs(searchInput));
        setSearchInput('');
      };
    
      return (
        <Form inline onSubmit={handleSearch}>
          <FormControl
            type="text"
            size="sm"
            placeholder="Search"
            className="mr-sm-2"
            onChange={inputHandler}
            value={searchInput}
          />
          <Button type="submit" size="sm" variant="outline-secondary">
            Search
          </Button>
        </Form>
      );
    }
    
    export default SearchComponent;

    点击表单中的提交按钮会触发提交事件,就像点击回车键一样。

    【讨论】:

    • 嗯,我可能是错的,但我认为你被否决了,因为 handleSearch 函数会在每次按键时触发,就像在 ANY 键中一样,而不仅仅是输入。由于handleSearch 中没有任何内容来过滤被按下的特定键,因此每次更新输入时都会运行该函数中的所有代码。
    • 但我的代码没有将handleSearch附加到onChange,而是将其附加到表单的onSubmit,只有在通过按回车键提交表单时才会触发
    • 这是有问题的部分:onKeyPress={handleSearch}
    • 我把这个沙盒放在一起给你演示问题:codesandbox.io/s/icy-glade-sk5s8?file=/src/App.js
    • 啊,当然,我看到了这个问题。只是没看到那里有 :sweat-smile: 那肯定会造成问题!
    猜你喜欢
    • 2015-06-08
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2014-12-13
    相关资源
    最近更新 更多