如何在 Material UI Labs Autocomplete 中创建可点击的第一个选项

ais*_*439 4 autocomplete reactjs material-ui

您可以在下面找到有关自动完成的 MUI 文档的示例,其中我在选项列表之前传递了一个指向 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}
    />
  );
}
Run Code Online (Sandbox Code Playgroud)

https://codesandbox.io/s/material-demo-egi6p

有趣的是,打开自动完成功能

    <Autocomplete
      open // add this prop
      id="combo-box-demo"
      options={top100Films}
Run Code Online (Sandbox Code Playgroud)

允许它按预期工作。

目前,我正在使用 onMouseDown 来完成这项工作,但感觉这可能是一个糟糕的解决方案。

Rya*_*ell 7

您可以通过添加以下内容来解决此问题:

      onMouseDown={event => {
        event.preventDefault();
      }}
Run Code Online (Sandbox Code Playgroud)

到您的链接,以便您的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>
);
Run Code Online (Sandbox Code Playgroud)

编辑自动完成论文中的链接

我包含的一个单独的修复是将任何额外的 props 传递给Paper组件(通过...other)。该Popper组件将 props 传递Paper控制其定位的组件,因此如果不进行此更改,定位将不正确。

之所以event.preventDefault()有必要,是因为焦点集中在单击之前的输入上。鼠标按下的默认效果之一是将焦点从输入更改为链接。输入的 onBlur将触发列表框部分的关闭,这Autocomplete意味着链接将不再存在,并且不会继续执行onClick链接的行为。调用event.preventDefault()可以防止焦点发生变化。