React - 输入失去对按键的关注

Posted

技术标签:

【中文标题】React - 输入失去对按键的关注【英文标题】:React - input loses focus on keypress 【发布时间】:2020-03-05 19:10:26 【问题描述】:

我的搜索输入组件遇到了一个奇怪的错误,它失去了对每次按键的关注并且无法弄清楚原因。

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>
  );
;

我还收到了Line 65:50: Expected to return a value at the end of arrow function array-callback-returncharacters.filter() 行,所以我不知道这是否与此有关。

如果有帮助,可以在此处查看已部署的存在错误的应用程序 --> https://mundane-vacation.surge.sh

【问题讨论】:

在 React 中,如果输入字符在输入时失去焦点,99% 的时间是因为它正在重新渲染。我猜这是因为您将功能组件嵌套在另一个组件中并将它们用作子组件。 SearchBaronChange 调用handleSearch,后者调用setSearch,这会更改状态值,从而导致重新渲染(包括重新渲染SearchBar 子本身)。查看类似这样的其他问题,了解如何解决问题:***.com/questions/42573017/… 您在每次渲染时定义function SearchBar() ,因此它是一个全新的组件,每次都会被评估和渲染。您可以省略它并注入StyledInput 内容代替&lt;SearchBar /&gt;,这应该会有所帮助 您收到的警告/错误是因为您的 characters 过滤器函子每次都应该返回一个布尔值,而不是函子的当前值。您可以简单地返回该名称的值以进行小写索引检查。 这对我有帮助!因为更明显:***.com/a/59287017/7156690 【参考方案1】:

您的焦点有问题,因为您的组件 SearchBar 是在 App 组件内声明的,并且在每次渲染时都会重新创建它。您需要将SearchBar 移出App 或将StyledInput 移到SearchBar 的位置。如果你选择第一种方式,我建议你从SearchBar中删除React.Fragment,因为它只有一个渲染的孩子:

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 函数中返回一个布尔值。现在,如果character 不满足条件,您将不返回任何内容(即undefined)。所以像这样改变你的filter函数:

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

【讨论】:

以上是关于React - 输入失去对按键的关注的主要内容,如果未能解决你的问题,请参考以下文章

反应输入文本失去对重新渲染的关注

输入字段失去对每个字符类型的关注 - 反应

失去对 AndroidTV 的输入关注

Bootstrap 模态输入失去对点击的关注

按键精灵的qui节目问题,关于输入框的焦点的问题,懂的进来看看

React - 以动态形式输入 1 个字符后输入失去焦点