reactjs - Materail UI x React:当项目尝试显示 Popover 时自动完成关闭
问题描述
我正在尝试自定义自动完成功能,当您将鼠标指针悬停时,每个项目都有一个更多图标。
当您单击该图标时,它应该会弹出 Popover,但它会关闭自动完成列表。
上图中,我将指针悬停在图标上,当我单击它时,它关闭了列表。
应用程序.js
import React, { useState } from "react";
import { TextField, Paper } from "@material-ui/core";
import { Autocomplete, useAutocomplete } from "@material-ui/lab";
import Item from "./Item";
const App = () => {
const [isOpen, setIsOpen] = useState(false);
const [anchorEl, setAnchorEl] = useState(null);
const countries = [
{ code: "US", label: "USA", phone: "1" },
{ code: "HU", label: "Hungary ", phone: "2" },
{ code: "IT", label: "Italy ", phone: "3" }
];
const openMultipleOptionSearch = (event) => {
setIsOpen(true);
setAnchorEl(event.currentTarget);
};
const {
getRootProps,
getInputLabelProps,
getInputProps,
getListboxProps,
getOptionProps,
groupedOptions
} = useAutocomplete({
id: "use-autocomplete-demo",
options: countries,
getOptionLabel: (option) => option.label,
disableCloseOnSelect: true
});
return (
<div {...getRootProps()}>
<input {...getInputProps()} />
<Paper>
{groupedOptions.length > 0 &&
groupedOptions.map((option, index) => (
<Item key={index} text={option.label} onClose={() => {}} />
))}
{groupedOptions.length === 0 && <p>No match.</p>}
</Paper>
</div>
);
};
export default App;
项目.js
import React, { useState } from "react";
import MoreHoriz from "@material-ui/icons/MoreHoriz";
import { Box, Typography, Button } from "@material-ui/core";
import Popup from "./Popup";
const Item = (prop) => {
const [onMouseOver, setOnMouseOver] = useState(false);
const [isOpen, setIsOpen] = useState(false);
const [anchorEl, setAnchorEl] = useState(null);
const openDeleteItem = (event) => {
setAnchorEl(event.currentTarget);
setIsOpen(true);
};
const closeDeleteItem = () => {
setAnchorEl(null);
setIsOpen(false);
setOnMouseOver(false);
prop.onClose();
};
return (
<Box
onMouseOver={() => setOnMouseOver(true)}
onMouseOut={() => isOpen || setOnMouseOver(false)}
>
<div className="item-container">
<Typography variant="body1">{prop.text}</Typography>
</div>
<Button
style={{ display: onMouseOver ? "" : "none" }}
onClick={openDeleteItem}
>
<MoreHoriz />
</Button>
<Popup
isOpen={isOpen}
anchorEl={anchorEl}
onClose={() => closeDeleteItem()}
/>
</Box>
);
};
export default Item;
Popup.js
import React from 'react';
import { Popover } from '@material-ui/core';
const Popup = (prop) => {
return (
<Popover
id={prop.isOpen ? 'simple-popover' : undefined}
open={prop.isOpen}
anchorEl={prop.anchorEl}
onClose={() => prop.onClose()}
>
Popup content
</Popover>
);
};
export default Popup;
有谁知道如何解决这一问题?
解决方案
我认为当您单击更多按钮时,您的自动完成弹出窗口会变得模糊,因此它会失去焦点并关闭下拉菜单本身。
这可能会对您有所帮助 -如果在内部单击 OnBlur 关闭反应组件
推荐阅读
- json - Google Cloud Text-to-Speech 返回“INVALID_ARGUMENT”
- java - 如何在 Android 9 上制作应用程序支持
- pyspark - 属性错误:“datetime.timedelta”对象没有属性“_get_object_id”
- php - 如何使唯一数组的自定义验证规则依赖于其他字段 laravel
- java - 如何使用 JDBCIO (apache beam) 执行存储过程/例程
- javascript - 更新提交事件中的值后未提交隐藏输入
- php - 表中每一行的非法字符串偏移 'Data_length'/'Index_length'
- c# - C#计算器 - 不能在小数点前插入数字
- python - 如何对分支 python 版本有 100% 的覆盖率?
- botframework - 在 QnA maker bot 中,我想中断 qnamaker 对话