Material ui Autocomplete 按回车键创建新芯片

Pau*_*aul 3 javascript autocomplete reactjs material-ui

我希望我可以使用材料 ui 的自动完成功能来做这样的事情:wertarbyte

也就是说,在没有必须从中选择的元素列表的情况下插入文本(字符串)。

因此不应该出现 noOptions 消息,每次在键盘上按下 Enter 键时都会插入文本。

在此处输入图片说明

链接:代码沙盒

代码:

import React from "react";
import Chip from "@material-ui/core/Chip";
import Autocomplete from "@material-ui/lab/Autocomplete";
import { makeStyles } from "@material-ui/core/styles";
import TextField from "@material-ui/core/TextField";

const useStyles = makeStyles(theme => ({
  root: {
    width: 500,
    "& > * + *": {
      marginTop: theme.spacing(3)
    }
  }
}));

export default function Tags() {
  const classes = useStyles();

  return (
    <div className={classes.root}>
      <Autocomplete
        multiple
        id="tags-outlined"
        options={[]}
        defaultValue={["foo", "bar"]}
        //getOptionLabel={(option) => option}
        //defaultValue={[top100Films[13]]}
        //filterSelectedOptions
        renderInput={params => (
          <TextField
            {...params}
            variant="outlined"
            label="filterSelectedOptions"
            placeholder="Favorites"
          />
        )}
      />
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

Dek*_*kel 9

如果您有简单的元素(不是对象,只是字符串),而你并不真的需要处理状态(您自动完成不被控制)可以使用freeSolo的道具Autocomplete

<Autocomplete
    multiple
    freeSolo
    id="tags-outlined"
    options={["foo", "bar"]}
    defaultValue={["foo", "bar"]}
    renderInput={params => (
        <TextField
            {...params}
            variant="outlined"
            label="filterSelectedOptions"
            placeholder="Favorites"
        />
    )}
/>
Run Code Online (Sandbox Code Playgroud)

如果您的元素更复杂并且您确实需要控制该元素:

  1. 确保自动完成标记是一个受控标记(您设法重视)。

  2. 收听 TextField 上的按键按下事件。

  3. 如果键是enter( keyCode === 13) - 获取输入的值并将其推送到您拥有的当前值列表中。

  4. 确保您还处理onChange处理元素的删除:

这是代码:

const [autoCompleteValue, setAutoCompleteValue] = useState(["foo", "bar"]);

return (
  
  <Autocomplete
    multiple
    id="tags-outlined"
    options={[]}
    value={autoCompleteValue}
    onChange={(e, newval, reason) => {
      setAutoCompleteValue(newval);
    }}
    renderInput={params => (
      <TextField
        {...params}
        variant="outlined"
        label="filterSelectedOptions"
        placeholder="Favorites"
        onKeyDown={e => {
          if (e.keyCode === 13 && e.target.value) {
            setAutoCompleteValue(autoCompleteValue.concat(e.target.value));
          }
        }}
      />
    )}
  />
);
Run Code Online (Sandbox Code Playgroud)

检查两个选项的实时工作示例:https : //codesandbox.io/s/mui-autocomplete-create-options-on-enter-gw1jc