如何在 React Material UI 自动完成表单中禁用 ENTER 键

How to Disable the ENTER Key in React Material UI Autocomplete form

我在 React 组件中有一个 Material UI 自动完成表单。它工作完美,除了 ENTER 键当前正在清除输入字段。 我只是希望输入字段不会在用户按下回车键时被清除。我在 Whosebug 上搜索了所有类似的问题,其中 none 处理忽略自动完成表单中的此键(它们主要处理常规输入表单)。下面我列出了所有我尝试过但不起作用的东西。

在这种情况下如何禁用 ENTER 键?

我试过忽略回车键,例如:

onKeyPress={(event) => {return event.key !== 'Enter';}}

我也尝试通过这样做来阻止自动完成回车键被视为表单提交(希望它不会清除表单):

onKeyPress={(event) => {
    if (event.key === 'Enter') {
      event.preventDefault();
      return false;
    }
}

我什至试过了:

onKeyPress={(event) => {
    if (event.key === 'Enter') {
      event.stopPropagation();
      return false;
    }
}

而且,是的,我也尝试在上述两个示例中使用 onKeyDown 而不是 onKeyPress

最后,我尝试使用自动完成组件中的 disableClearable 选项,如下所示:

  const onInputChange = useCallback(
    (_event: ChangeEvent<{}>, newInputValue: string) => {
      debounceFetchData(newInputValue);
    },
    [debounceFetchData]
  );

  return (
    <section className={classes.container}>
      <SearchIcon className={classes.icon} />
      <Autocomplete
        id="search"
        options={options}
        disableClearable
        getOptionLabel={() => ''}
        filterOptions={(x) => x}
        fullWidth
        freeSolo
        onInputChange={onInputChange}
        renderInput={(params) => (
          <TextField
            {...params}
            placeholder="Search"
            variant="outlined"
            size="small"
            inputProps={{
              ...params.inputProps,
              'aria-label': 'Search',
            }}
          />
        )}
        ...
        ...
        ...
      />

我也坚持了一段时间,并在 上找到了答案。

只需将 onKeyDown 处理程序传递给 <TextField>inputProps 即可处理:

 <Autocomplete
        ...
        renderInput={(params) => (
          <TextField
            {...params}
            ...
            inputProps={{
              ...params.inputProps,
              onKeyDown: (e) => {
                    if (e.key === 'Enter') {
                      e.stopPropagation();
                    }
              },
            }}
          />
        )}
        ...
        ...
        ...
      />

这有效,但它删除了使用键盘 select 值的能力。

注意{...params}后面的省略号要省略。