当前位置: 首页 > 面试题库 >

重大ui自动完成功能:能否在“ Enter”事件以外的事件上创建标签?

华宇
2023-03-14
问题内容

我目前正在使用freesolo自动完成功能,并且我的特定用例要求在逗号或空格跟随输入文本时创建标记。当前,自动完成功能会在Enter事件上创建标签,但我认为自动完成功能中没有内置任何功能,但支持任何其他事件的标签创建。我想知道我是否缺少任何东西,或者如果我没有,我该如何解决这个问题?

当前,我正在尝试使用Autocomplete中的onInputChange属性来捕获传入的字符串。我检查该字符串中的逗号和空格,并在成功找到这些字符之一的情况下,使用一些本地JS手动触发了Enter事件。码。这在某些情况下有效,但并非在所有情况下都有效,并且考虑所有情况变得很乏味。这种方法似乎容易出现很多问题,而且我不认为这是在不同事件上实现标记创建的最佳方法。寻找一些想法。谢谢

onInputChange 属性用法:

<Autocomplete
        multiple
        freeSolo
        filterSelectedOptions
        id="auto-complete"
        options={foo.map(bar => bar.name)}
        ref={autoRef}
        onInputChange={(e, value) => {
            createTagOnEvent(value);
        }}/>

在输入中搜索逗号和空格并手动触发Enter事件:

const createTagOnEvent = (bar) => {
    if (pattern.test(bar)) {
        const ke = new KeyboardEvent("keydown", {bubbles: true, cancelable: true, keyCode: 13});
        autoRef.current.dispatchEvent(ke);
    }
};

问题答案:

以下是我推荐的方法。

该方法有两个主要方面:

  1. 使用“受控”输入方法进行控制,Autocomplete以便您可以完全控制当前值。

  2. 用适当的逻辑指定onKeyDown用于TextField输入的处理程序,params.inputProps.onKeyDown以添加新值。

    import React from "react";
    import TextField from "@material-ui/core/TextField";
    import Autocomplete from "@material-ui/lab/Autocomplete";

    export default function Tags() {
      const [value, setValue] = React.useState([top100Films[13]]);
      const handleKeyDown = event => {
        switch (event.key) {
          case ",":
          case " ": {
            event.preventDefault();
            event.stopPropagation();
            if (event.target.value.length > 0) {
              setValue([...value, event.target.value]);
            }
            break;
          }
          default:
        }
      };
      return (
        <div style={{ width: 500 }}>
          <Autocomplete
            multiple
            freeSolo
            id="tags-outlined"
            options={top100Films}
            getOptionLabel={option => option.title || option}
            value={value}
            onChange={(event, newValue) => setValue(newValue)}
            filterSelectedOptions
            renderInput={params => {
              params.inputProps.onKeyDown = handleKeyDown;
              return (
                <TextField
                  {...params}
                  variant="outlined"
                  label="filterSelectedOptions"
                  placeholder="Favorites"
                  margin="normal"
                  fullWidth
                />
              );
            }}
          />
        </div>
      );
    }

    // Top 100 films as rated by IMDb users. http://www.imdb.com/chart/top
    const top100Films = [
      { title: "The Shawshank Redemption", year: 1994 },
      { title: "The Godfather", year: 1972 },
    // ... many more options
    ];

这是打字稿版本:

    /* eslint-disable no-use-before-define */
    import React from "react";
    import TextField from "@material-ui/core/TextField";
    import Autocomplete, { RenderInputParams } from "@material-ui/lab/Autocomplete";

    interface ObjectOption {
      title: string;
      year: number;
    }
    type Option = ObjectOption | string;

    interface MyInputProps {
      onKeyDown: (event: object) => void;
    }
    interface MyParams extends RenderInputParams {
      inputProps: MyInputProps;
    }

    export default function Tags() {
      const [value, setValue] = React.useState([top100Films[13]]);
      const handleKeyDown = event => {
        switch (event.key) {
          case ",":
          case " ": {
            event.preventDefault();
            event.stopPropagation();
            if (event.target.value.length > 0) {
              setValue([...value, event.target.value]);
            }
            break;
          }
          default:
        }
      };
      return (
        <div style={{ width: 500 }}>
          <Autocomplete
            multiple
            freeSolo
            id="tags-outlined"
            options={top100Films}
            getOptionLabel={option => {
              if (typeof option === "string") {
                return option;
              }
              return option.title;
            }}
            value={value}
            onChange={(event, newValue) => setValue(newValue)}
            filterSelectedOptions
            renderInput={(params: MyParams) => {
              params.inputProps.onKeyDown = handleKeyDown;
              return (
                <TextField
                  {...params}
                  variant="outlined"
                  label="filterSelectedOptions"
                  placeholder="Favorites"
                  margin="normal"
                  fullWidth
                />
              );
            }}
          />
        </div>
      );
    }

    // Top 100 films as rated by IMDb users. http://www.imdb.com/chart/top
    const top100Films: ObjectOption[] = [
      { title: "The Shawshank Redemption", year: 1994 },
      { title: "The Godfather", year: 1972 },
    // ... many more options
    ];



 类似资料:
  • 问题内容: 我正在尝试实现自动补全功能,但是找不到在Swift中可用的示例。下面,我打算转换Ray Wenderlich的自动完成教程 和2010年的示例代码。最后,代码进行了编译,但是没有显示包含可能完成的表格,而且我没有经验来了解为什么它未被隐藏shouldChangeCharactersInRange。 问题答案: 用下面的内容替换您的函数内容。希望对您有帮助。

  • 问题内容: 想象下面某个组件的功能: 和文本框,由上述组件的子组件呈现,并接收为: 当我在文本字段中输入内容时,出现错误消息。 如果我取消注释函数中的第一行(将文本框值存储在变量中),那么它将很好地工作。想法为什么? 问题答案: 这是因为React进行了事件池 -回调完成后,所有事件的字段都为空,因此您在异步回调中将它们视为null 。 请将事件数据复制到变量或调用以禁用此行为。 要么: 请参见以

  • 问题内容: 是的,在您将我指向他们之前,我已经回顾了有关该主题的六篇文章,但是我仍然对为什么这行不通感到困惑。 我的目标是检测自动填充何时产生0个结果。这是代码: 搜索本身工作正常,我可以毫无问题地显示结果。据我了解,我 应该 能够使用autocomplete(“ result”)处理程序拦截结果。在这种情况下,它根本不会触发。(即使不引用结果数量的通用警报或console.log也不会触发)。打

  • 问题内容: 我有一个非常简单的表格。当用户在输入字段中键入内容时,我想更新他们在页面上其他位置键入的内容。这一切都很好。我已经绑定的更新的,和事件。 唯一的问题是,如果您从浏览器的自动完成框中选择一个输入,则该输入不会更新。从自动完成功能中进行选择时,是否会触发任何事件(显然既不是也不是)。请注意,如果您从“自动完成”框中选择并 模糊 了输入字段,则将触发更新。我希望自动完成会立即触发它。 HTM

  • 我有一个很简单的表格。当用户在输入字段中键入时,我想更新他们在页面上其他地方键入的内容。一切正常。我已将更新绑定到、和事件。 唯一的问题是,如果您从浏览器的自动完成框中选择一个输入,它不会更新。当您从“自动完成”中选择时,是否会触发任何事件(显然既不是也不是)。注意,如果您从“自动完成”框中选择“模糊输入”字段,将触发更新。我希望它能在自动完成时被触发。 请参见:http://jsfidle.ne

  • 本文向大家介绍按钮功能和自定义事件– PyQt,包括了按钮功能和自定义事件– PyQt的使用技巧和注意事项,需要的朋友参考一下 首先,让我们创建一个主代码;然后,我们将对其进行修改。我在这里为您提供主代码。并且,所做的修改将带有其说明。让我们做一些编码: 源代码: 输出结果 此输出布局是使用主窗口小部件生成的。QtGui.QMainWindow。self.setWindowIcon(QtGui.Q