当前位置: 首页 > 知识库问答 >
问题:

反应-输入在按键时失去焦点

魏泰
2023-03-14

我遇到了一个奇怪的错误,我的搜索输入组件,它失去了对每个按键的关注,不知道为什么。

const App = () => {
  let [characters, setCharacters] = useState([]);
  let [filteredCharacters, setFilteredCharacters] = useState([]);
  // more state
  let [search, setSearch] = useState("");

  useEffect(() => {
    setIsLoading(true);
    axios
      .get(`https://swapi.co/api/people/?page=${pageNumber}`)
      .then(res => {
        console.log(res.data.results);
        setCharacters(res.data.results);
        setFilteredCharacters(res.data.results);
      })
      .catch(err => console.error(err))
      .then(() => {
        setIsLoading(false);
      });
  }, [pageNumber]);

  function updatePage(e) {
     // update page
  }

  function handleSearch(e) {
    setSearch(e.target.value);
    const filtered = characters.filter(character => {
      if (character.name.toLocaleLowerCase().indexOf(e.target.value) !== -1) {
        return character;
      }
    });
    setFilteredCharacters(filtered);
  }
  function SearchBar() {
    return (
      <React.Fragment>
        <StyledInput
          type="text"
          id="search"
          value={search}
          placeholder="Search by name..."
          onChange={e => handleSearch(e)}
        />
      </React.Fragment>
    );
  }

  return (
    <React.Fragment>
      <GlobalStyles />
      <div className="App">
        <Heading>React Wars!</Heading>
        <SearchBar />
        <Pagination handleClick={updatePage} />
        {!isLoading && Object.entries(filteredCharacters).length ? (
          <CharacterList characters={filteredCharacters} />
        ) : (
          <LoadingBar />
        )}
      </div>
    </React.Fragment>
  );
};

我还得到了一个行65:50:对于字符,应该在arrow函数数组回调return的末尾返回一个值。filter()行,所以我不知道这是否与此有关。

如果有帮助,可以在这里看到部署的带有错误的应用程序-


共有1个答案

萧德庸
2023-03-14

焦点有问题,因为组件SearchBarApp组件中声明,并且在每次渲染时都会重新创建。您需要将SearchBar移出App,或者只需将StyledInput移动到SearchBar的位置。如果您选择第一种方式,我建议您删除React。来自搜索栏的片段,因为它只有一个渲染子项:

function SearchBar(props) {
    return (
        <StyledInput
          type="text"
          id="search"
          value={props.value}
          placeholder="Search by name..."
          onChange={props.onChange}
        />
    );
  }

并且在App中:

<SearchBar onChange={handleSearch} value={search} />

要修复警告,您需要始终在filter函数中返回一个布尔值。现在,如果字符未通过条件,则不返回任何内容(即未定义)。因此,如下所示更改您的过滤器功能

const filtered = characters.filter(character => {
    return character.name.toLocaleLowerCase().indexOf(e.target.value) !== -1
});

 类似资料:
  • 我正在编写文本输入,并在事件中调用,因此React重新呈现我的UI。问题是文本输入总是失去焦点,所以我需要为每个字母重新聚焦:D。

  • 我正在使用构建组件,其中我有一个文本字段列表。 我在redux中存储数据。 每个保留每个

  • 在我的活动中,我有一个editText字段。当用户点击它时,editText获得焦点并出现键盘。现在,当用户按下手机上的硬件后退按钮时,键盘会消失,但光标仍保留在Edittext中,即它仍然具有焦点。当按下后退按钮时,是否有可能使EditText失去焦点?我尝试使用以下代码,但它不起作用:

  • 我遇到了一个非常奇怪的问题,我无法理解。我目前正在使用一个创建反应应用程序,使用反应16.3和Antd 3.11框架,我已经创建了一个表,在它的标题列中呈现一个带有onChange事件的组件。 当我第一次聚焦输入时,问题就出现了。 我在第一个关键事件上失去了焦点,之后当我再次单击该字段时,它将保持焦点,直到我单击其他内容。 下面是我一直在使用的例子:https://ant.design/compo

  • 当将html输入与样式化组件一起使用并将值保存为react state with onChange时,组件似乎会在每次状态更改时重新呈现,并导致输入失去焦点。有没有办法防止输入失去焦点?为什么会发生这种情况?这里有一个例子。

  • 问题内容: 我正在制作动态表格。一个有值的列表。每个值由一个字符串表示。 我的组件中有一个函数,可以向该字段添加新值。 值和按钮在我的HTML中这样显示。 一旦我在值的输入中写入一些文本,输入就会失去焦点。如果我在一个字段中添加了多个值,并且在一个输入值中写入了一个字符,则该输入将失去焦点,并且该字符将写入每个输入中。 问题答案: 当数组是原始类型(在您的情况下是数组)时,会发生这种情况。这可以通