如何在 Material UI 实验室自动完成中创建可点击的第一个选项
How can I create a clickable first option in Material UI Labs Autocomplete
您可以在下面找到有关自动完成的 MUI 文档中的示例,其中我在选项列表之前将 link 传递给 google。但是,我无法单击该选项,事件目标只是 MuiAutocomplete,而不是我传递的 <a>
。
import React from "react";
import TextField from "@material-ui/core/TextField";
import Paper from "@material-ui/core/Paper";
import Autocomplete from "@material-ui/lab/Autocomplete";
const Link = ({ children }) => (
<Paper>
<a href="https://www.google.com/" rel="nofollow" target="_blank">
Go to Google
</a>
{children}
</Paper>
);
export default function ComboBox() {
return (
<Autocomplete
id="combo-box-demo"
options={top100Films}
getOptionLabel={option => option.title}
style={{ width: 300 }}
renderInput={params => (
<TextField {...params} label="Combo box" variant="outlined" fullWidth />
)}
PaperComponent={Link}
/>
);
}
https://codesandbox.io/s/material-demo-egi6p
有趣的是,通过 open 自动完成
<Autocomplete
open // add this prop
id="combo-box-demo"
options={top100Films}
允许它按预期工作。
目前,我正在使用 onMouseDown 来完成这项工作,但我觉得这可能是一个糟糕的解决方案。
您可以通过添加以下内容来解决此问题:
onMouseDown={event => {
event.preventDefault();
}}
到您的 link 以便您的 Link
组件看起来像:
const Link = ({ children, ...other }) => (
<Paper {...other}>
<a
onMouseDown={event => {
event.preventDefault();
}}
href="https://www.google.com/"
rel="nofollow"
target="_blank"
>
Go to Google
</a>
{children}
</Paper>
);
我包含的一个单独的修复是将任何额外的道具传递给 Paper
组件(通过 ...other
)。 Popper
组件 passes props 到控制其定位的 Paper
组件,因此如果不进行此更改,定位将不正确。
之所以需要 event.preventDefault()
,是因为焦点在点击之前的输入上。鼠标按下的默认效果之一是将焦点从输入更改为 link。 onBlur of the input 将触发 Autocomplete
的列表框部分的关闭,这意味着 link 将不再存在并且不会继续 onClick
的行为link。调用 event.preventDefault()
可防止发生焦点更改。
您可以在下面找到有关自动完成的 MUI 文档中的示例,其中我在选项列表之前将 link 传递给 google。但是,我无法单击该选项,事件目标只是 MuiAutocomplete,而不是我传递的 <a>
。
import React from "react";
import TextField from "@material-ui/core/TextField";
import Paper from "@material-ui/core/Paper";
import Autocomplete from "@material-ui/lab/Autocomplete";
const Link = ({ children }) => (
<Paper>
<a href="https://www.google.com/" rel="nofollow" target="_blank">
Go to Google
</a>
{children}
</Paper>
);
export default function ComboBox() {
return (
<Autocomplete
id="combo-box-demo"
options={top100Films}
getOptionLabel={option => option.title}
style={{ width: 300 }}
renderInput={params => (
<TextField {...params} label="Combo box" variant="outlined" fullWidth />
)}
PaperComponent={Link}
/>
);
}
https://codesandbox.io/s/material-demo-egi6p
有趣的是,通过 open 自动完成
<Autocomplete
open // add this prop
id="combo-box-demo"
options={top100Films}
允许它按预期工作。
目前,我正在使用 onMouseDown 来完成这项工作,但我觉得这可能是一个糟糕的解决方案。
您可以通过添加以下内容来解决此问题:
onMouseDown={event => {
event.preventDefault();
}}
到您的 link 以便您的 Link
组件看起来像:
const Link = ({ children, ...other }) => (
<Paper {...other}>
<a
onMouseDown={event => {
event.preventDefault();
}}
href="https://www.google.com/"
rel="nofollow"
target="_blank"
>
Go to Google
</a>
{children}
</Paper>
);
我包含的一个单独的修复是将任何额外的道具传递给 Paper
组件(通过 ...other
)。 Popper
组件 passes props 到控制其定位的 Paper
组件,因此如果不进行此更改,定位将不正确。
之所以需要 event.preventDefault()
,是因为焦点在点击之前的输入上。鼠标按下的默认效果之一是将焦点从输入更改为 link。 onBlur of the input 将触发 Autocomplete
的列表框部分的关闭,这意味着 link 将不再存在并且不会继续 onClick
的行为link。调用 event.preventDefault()
可防止发生焦点更改。