如何删除自动完成上的清除按钮并仅显示文本

Posted

技术标签:

【中文标题】如何删除自动完成上的清除按钮并仅显示文本【英文标题】:How to remove Clear button on Autocomplete and show only text 【发布时间】:2021-01-20 08:58:02 【问题描述】:

我是反应虚拟化和自动完成的新手。我目前已经构建了一个列表,该列表在选中复选框时显示多个文本。这是我的代码: https://codesandbox.io/s/material-demo-forked-1qzd3?file=/demo.tsx

当从列表中选择任何内容时,我只想显示一个文本,并删除附加的清除按钮和灰色背景。

【问题讨论】:

【参考方案1】:

有一个专用的道具来禁用图标。 在 Autocomplete 组件上尝试 prop "disableClearable" 它在文档中:

<Autocomplete
    ...defaultProps
    id="disable-clearable"
    disableClearable
    renderInput=(params) => <TextField ...params label="disableClearable" 
    margin="normal" />
/>

【讨论】:

【参考方案2】:

试试这个:

import React,  useState  from "react";
import Checkbox from "@material-ui/core/Checkbox";
import TextField from "@material-ui/core/TextField";
import Autocomplete from "@material-ui/lab/Autocomplete";
import CheckBoxOutlineBlankIcon from "@material-ui/icons/CheckBoxOutlineBlank";
import  ListItemText  from "@material-ui/core";
import CheckBoxIcon from "@material-ui/icons/CheckBox";
import MenuItem from "@material-ui/core/MenuItem";
import  List  from "react-virtualized";
import faker from "faker";

const icon = <CheckBoxOutlineBlankIcon fontSize="small" />;
const checkedIcon = <CheckBoxIcon fontSize="small" />;

const ListboxComponent = React.forwardRef(function ListboxComponent(
  props,
  ref
) 
  const  children, role, ...other  = props;
  const itemCount = Array.isArray(children) ? children.length : 0;
  const itemSize = 36;

  return (
    <div ref=ref>
      <div ...other>
        <List
          height=250
          width=300
          rowHeight=itemSize
          overscanCount=5
          rowCount=itemCount
          rowRenderer=(props) => 
            return React.cloneElement(children[props.index], 
              style: props.style
            );
          
          role=role
        />
      </div>
    </div>
  );
);

const myDAta = Array.from(new Array(10000)).map(() => 
  return  name: faker.name.findName() ;
);

myDAta.unshift( name: "ALL" );

export default function CheckboxesTags() 
  const [selectedFilm, setSelectedFilm] = useState([]);
  const onCloseHandle = () => 
    console.log("Closed");
  ;
  return (
    <Autocomplete
      id="checkboxes-tags-demo"
      ListboxComponent=ListboxComponent
      options=myDAta
      onChange=(e, film) => 
        console.log(e.target);
        setSelectedFilm(film);
      
      onClose=onCloseHandle
      getOptionLabel=(option) => option.name
      // fullWidth
      renderOption=(option) => <>option.name</>
      closeIcon=""

      style= width: 300, maxHeight: "1px" 
      renderInput=(params) => (
        <TextField
          ...params
          variant="outlined"
          label="Checkboxes"
          placeholder="Favorites"
        />
      )
    />
  );


// Top 100 films as rated by IMDb users. http://www.imdb.com/chart/top
const top100Films = [
   title: "All", year: 0 ,
   title: "The Shawshank Redemption", year: 1994 ,
   title: "The Godfather", year: 1972 ,
   title: "The Godfather: Part II", year: 1974 ,
   title: "The Dark Knight", year: 2008 ,
   title: "12 Angry Men", year: 1957 ,
   title: "Schindler's List", year: 1993 ,
   title: "Pulp Fiction", year: 1994 ,
   title: "The Lord of the Rings: The Return of the King", year: 2003 ,
   title: "The Good, the Bad and the Ugly", year: 1966 ,
   title: "Fight Club", year: 1999 ,
   title: "The Lord of the Rings: The Fellowship of the Ring", year: 2001 ,
   title: "Star Wars: Episode V - The Empire Strikes Back", year: 1980 ,
   title: "Forrest Gump", year: 1994 ,
   title: "Inception", year: 2010 ,
   title: "The Lord of the Rings: The Two Towers", year: 2002 ,
   title: "One Flew Over the Cuckoo's Nest", year: 1975 ,
   title: "Goodfellas", year: 1990 ,
   title: "The Matrix", year: 1999 ,
   title: "Seven Samurai", year: 1954 ,
   title: "Star Wars: Episode IV - A New Hope", year: 1977 ,
   title: "City of God", year: 2002 ,
   title: "Se7en", year: 1995 ,
   title: "The Silence of the Lambs", year: 1991 ,
   title: "It's a Wonderful Life", year: 1946 ,
   title: "Life Is Beautiful", year: 1997 ,
   title: "The Usual Suspects", year: 1995 ,
   title: "Léon: The Professional", year: 1994 ,
   title: "Spirited Away", year: 2001 ,
   title: "Saving Private Ryan", year: 1998 ,
   title: "Once Upon a Time in the West", year: 1968 ,
   title: "American History X", year: 1998 ,
   title: "Interstellar", year: 2014 
];

【讨论】:

这只是隐藏了我可以接受的关闭图标。但是如何删除文本周围的关闭图标和灰色背景? @Priyanka Panjabi 这将允许您一次只进行一个选择,而无需关闭图标和背景。要添加多选吗? 在共享沙盒链接时,我正在使用复选框进行多项选择。所以是的,我想用复选框@Priyanka Panjabi 进行多项选择 但是你已经提到了“当从列表中选择任何内容时,我只想显示一个文本” 是的。因此,如果有复选框和多项选择,那么我应该只显示第一个选择而不是其他选择,并且没有关闭按钮和背景。只是文字。对不起我的台词。它从多个数据中选择。【参考方案3】:

返回所有参数,TextField 中没有 endAdornment

renderInput=(params) => <TextField ...params 
InputProps= ...params.InputProps, endAdornment : null 
onPaste=handlePaste variant='outlined'/>

【讨论】:

以上是关于如何删除自动完成上的清除按钮并仅显示文本的主要内容,如果未能解决你的问题,请参考以下文章

文本框上的 Chrome 自动填充和自动完成问题

如何在自动完成文本框中没有按钮的情况下回发?

Cordova inAppBrowser 如何隐藏 URL 并仅显示完成按钮

在自动完成输入上写入时显示/隐藏按钮

如何清除文本框的缓存?? asp.net

带有“清除按钮”的 UI 自动化清除文本字段