- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我差点放弃这个错误。我只是无法在搜索输入中输入“S”。
键盘工作正常。
下面的沙盒。
https://codesandbox.io/s/jolly-raman-61zbx?file=/src/App.js
来自沙箱的代码:
import {
Box,
FormControl,
InputAdornment,
ListItem,
Menu,
TextField,
withStyles
} from "@material-ui/core";
import {
clamp,
difference,
includes,
intersection,
join,
map,
union
} from "lodash";
import ArrowDropDownIcon from "@material-ui/icons/ArrowDropDown";
import { FixedSizeList } from "react-window";
import Fuse from "fuse.js";
import React from "react";
import SearchIcon from "@material-ui/icons/Search";
import memoize from "memoize-one";
const styles = {
popoverPaper: {
width: "100%"
}
};
const fuseOptions = {
includeScore: true
};
const initialSearchState = {
searchValue: ""
};
const getCheckedList = (list) => (!!list ? list : []);
class VirtualisedSelector extends React.Component {
constructor(props) {
super(props);
this.state = {
anchorEl: null,
...initialSearchState
};
}
getSearchList = memoize((list, searchValue) => {
const fuse = new Fuse(list, fuseOptions);
return !!searchValue ? map(fuse.search(searchValue), (o) => o.item) : list;
});
handleSearch = (event) => {
this.setState({
...this.state,
searchValue: event.target.value
});
};
getCleanSelectedValues = memoize((currentSelectedValues, list) =>
intersection(currentSelectedValues, list)
);
getNewMultipleValue = (currentSelectedValues, clickedItemValue) =>
includes(currentSelectedValues, clickedItemValue)
? difference(currentSelectedValues, [clickedItemValue])
: union(currentSelectedValues, [clickedItemValue]);
getNewSingleValue = (currentSelectedValues, clickedItemValue) =>
includes(currentSelectedValues, clickedItemValue) ? [] : [clickedItemValue];
getNewValue = (currentSelectedValues, clickedItemValue, list, multiple) =>
multiple
? this.getNewMultipleValue(
this.getCleanSelectedValues(currentSelectedValues, list),
clickedItemValue
)
: this.getNewSingleValue(currentSelectedValues, clickedItemValue);
handleChange = (currentSelectedValues, list, multiple) => (event) => {
this.setState({
anchorEl: null
});
const clickedItemValue = event.target.getAttribute("value");
const newValue = this.getNewValue(
currentSelectedValues,
clickedItemValue,
list,
multiple
);
this.props.onSelect(newValue);
};
getTextFieldDisplayValue = (value, list, labelMap) =>
join(
map(this.getCleanSelectedValues(value, list), (e) => labelMap[e] ?? e),
", "
);
handleMenuOpen = (event) => {
this.setState({ anchorEl: event.currentTarget });
};
handleMenuClose = (event) => {
this.setState({ anchorEl: null, ...initialSearchState });
};
renderRow = () => ({ index, style }) => {
const { multiple, value, list, labelMap } = this.props;
const { searchValue } = this.state;
const searchList = this.getSearchList(list, searchValue);
const cleanSelectedValues = this.getCleanSelectedValues(value, list);
const listItem = searchList[index];
return (
<ListItem
value={listItem}
key={listItem}
selected={includes(value, listItem)}
onClick={this.handleChange(cleanSelectedValues, list, multiple)}
style={style}
>
{labelMap?.[listItem] || listItem}
</ListItem>
);
};
render() {
const {
value,
list,
name,
label,
labelMap,
required = false,
classes
} = this.props;
const { searchValue } = this.state;
const formControlClassNames = this.props?.classes?.formControl;
const searchList = this.getSearchList(getCheckedList(list), searchValue);
const nItems = searchList.length;
const stringHeight = 46;
const fixedSizeListHeight = stringHeight * clamp(nItems, 1, 10);
return (
<FormControl className={formControlClassNames} fullWidth>
<TextField
onClick={this.handleMenuOpen}
variant="outlined"
required={required}
InputProps={{
endAdornment: (
<InputAdornment position="end">
<ArrowDropDownIcon />
</InputAdornment>
)
}}
value={this.getTextFieldDisplayValue(value, list, labelMap)}
multiline
type="text"
name={name}
label={label}
fullWidth
/>
<Menu
anchorEl={this.state.anchorEl}
keepMounted
open={Boolean(this.state.anchorEl)}
onClose={this.handleMenuClose}
PopoverClasses={{ paper: classes.popoverPaper }}
>
{/* Search */}
<Box p={1}>
<TextField
variant="outlined"
InputProps={{
startAdornment: (
<InputAdornment position="start">
<SearchIcon />
</InputAdornment>
)
}}
type="text"
label={"Search"}
value={searchValue}
onChange={this.handleSearch}
fullWidth
/>
</Box>
{/* Virtualized list */}
<FixedSizeList
height={fixedSizeListHeight}
width={"100%"}
itemSize={stringHeight}
itemCount={nItems}
>
{this.renderRow()}
</FixedSizeList>
</Menu>
</FormControl>
);
}
}
VirtualisedSelector.defaultProps = {
value: "",
list: [],
name: "",
label: "",
labelMap: {},
required: false
};
export default withStyles(styles)(VirtualisedSelector);
最佳答案
主要问题是您不应该为此使用Menu
。 Menu
假定它有 MenuItem
子项,并且具有针对该假设的辅助功能。您看到的行为是由尝试通过键入菜单项文本开头的字符来导航到菜单项的功能引起的。在您的情况下,它正在查找标签“搜索”的文本,然后将焦点移至该“菜单项”(这就是为什么您随后在包含 TextField
的 div 上获得焦点轮廓的原因>).如果将标签更改为“在此处键入”,您会发现“s”有效,但“t”无效。
我的建议是使用 Popover直接(Menu
委托(delegate)给您使用的主要功能的低级组件)。另一种选择是使用 Autocomplete component因为您似乎正在尝试使用 Menu
和弹出式 TextField
来执行您自己的 Autocomplete
组件提供的自定义版本。
关于javascript - 输入错误 : cannot type 'S' into search input,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68728566/
我有一个测试即将进行,我想澄清两个有关参数的问题。 在我的笔记中指出,将参数传递给函数的推荐方法是使用“按引用传递” const type& x; // for "in" parameters
当我通过 OMG 2.5(Beta)推广的 UML 规范阅读以下概念时: in: Indicates that Parameter values are passed in by the caller
我试图在用户按下 Enter 时触发一个函数。我将此输入设置为只读的原因是限制用户在填充值后修改输入中的值。 该值来自将在点击属性中触发的弹出窗口。问题是 keyup.enter 没有触发该输入。 代
我在jQuery中使用模式弹出窗口控件,该弹出窗口具有由jQuery Tokenize输入插件提供动力的输入文本。问题是,当我在模式弹出文本框中键入内容时, token 化插件的搜索结果显示为隐藏在弹
我有一个问题。当我选中复选框时,系统工作正常,总值发生变化,但一旦我修改文本输入,它就会变为 0。我需要将此文本框输入排除在更改值之外。 这是 html: $15000 $
我正在努力让它发挥作用,但还是有些不对劲。 我想用 CSS 设置提交按钮的样式以匹配我已有的按钮。 风格: input[type="button"], input[type="submit"], b
import java.util.*;; public class selection { Scanner in=new Scanner(System.in); private
这可能是一个非常菜鸟的问题。假设我有一个带宽限制为 100MB/s 的网卡,那么输入/输出带宽是否有可能达到该限制 同时 ?或者我会在任何时候遇到这个不等式:in bandwidth + out ba
看着这个问题,Fill immutable map with for loop upon creation ,我很好奇是什么this表示在 Map(1 -> this) . scala> Map(1
我有这样的东西 一个 乙 问? 是或否 数字 数字或零 我想做的是: 如果 B1 = “Y”,则让用户在 B2 中输入一个数字。 如果 B1 = “N”,则将 B2 中的值更改为零,并且不允许用户在
我有一个包含许多列的表,我想添加 input标题单元格内的字段,但我希望输入适合根据正文内容的宽度。 这是没有 input 的样子领域: 这就是 input 的样子领域: 可以看出,像“index”和
关于为 FTP 客户端设置传出和传入文件夹,您遵循哪些最佳实践(如果有)?我们通常使用“outgoing”和“incoming”,但无论你如何表述方向,它都可以有两种解释方式,具体取决于名称相对于哪一
我正在尝试“求解”给定 d 的 Pell 方程:x^2 - d * y^2 = 1,或者至少我想得到最小的 x > 0 来求解方程。到目前为止,一切都很好。这是我的 Haskell 代码 minX :
我是VS Code的新手,可以使用Ctrl + Enter将代码运行到python交互式窗口中。我希望光标自动移动到下一行,因此我可以逐行浏览代码。 能做到吗? 最佳答案 如this blog pos
我正在创建一个 bool 值矩阵/二维数组,并且我想为 dategrid 推断一种不仅仅是“ANY”的类型。 let yearRange = [2000,2001,2002,2003,2004]; l
我有两个排序的列表,例如 a = [1, 4, 7, 8] b = [1, 2, 3, 4, 5, 6] 我想知道a中的每个项目是否在b中。对于上面的示例,我想找到 a_in_b = [True, T
菜鸟警报 这很奇怪 - 当我编写以下代码时,尝试在 AngularJS 中创建自定义指令: myModule.directive('myTab', function(){ console.lo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
假设我正在使用 gdscript 静态类型,并且对于一个函数参数,我事先不知道我会得到什么。这就是 python 中 typing.Any 的作用。如何使用 gdscript 做到这一点? 似乎 Va
我使用 dropzone 上传多个图像,并且工作正常,直到我想为每个图像插入品牌和网址。 我遇到的唯一问题是,当我要从输入字段获取值时,我会从服务器获取来自字段(品牌、网址)的未定义值,但如果我使用静
我是一名优秀的程序员,十分优秀!