Сделать опции компонента автозаполнения материала-пользовательского интерфейса кликабельными ссылками?

#reactjs #hyperlink #autocomplete #material-ui

Вопрос:

 import React, { useEffect, useRef } from "react";
import TextField from "@material-ui/core/TextField";
import Autocomplete from "@material-ui/lab/Autocomplete";

export default function FreeSolo(props) {
  const [vendors, setVendors] = React.useState([]);
  const [value, setValue] = React.useState();
  const nameRef = useRef();
  useEffect(() => {
    sendDataToParent();
  }, [value]);

  const sendDataToParent = async () => {
    await props.parentFunction(value);
  };
  return (
    <div style={{}}>
      <Autocomplete
        freeSolo
        id="free-solo-2-demo"
        options={props.vendorData.map((option) => option.name)}
        renderInput={(params) => (
          <TextField
            {...params}
            value={value}
            required
            inputRef={nameRef}
            onChange={(e) => {
              setValue(e.target.value);
              sendDataToParent();
            }}
            label="Vendor Name"
            margin="normal"
            variant="standard"
            InputProps={{ ...params.InputProps, type: "search" }}
          />
        )}
      />
    </div>
  );
}
 

Я попытался сделать это с помощью renderOption, но не смог заставить его работать. Мне нужно, чтобы опции были кликабельными ссылками, чтобы всякий раз, когда пользователь выбирает один из вариантов, он перенаправлялся на ссылку.

ИЗМЕНИТЬ: Решено с помощью renderOption

 renderOption={(option) => (
          <React.Fragment>
            <span
              style={{ cursor: "pointer" }}
              onClick={() => {
                window.location.href = `/allvendors/${option.id}`;
              }}
            >
              {option.name} - Click to visit the Vendor
            </span>
          </React.Fragment>
        )}
 

Ответ №1:

Вместо того, чтобы делать ссылки на опции кликабельными, вы можете перенаправить на ссылку, используя onChange реквизит Autocomplete компонента.

Я предполагаю, что у каждого варианта в вашем vendorData есть name , а также link , например

 {
  name: "Google",
  link: "https://www.google.com"
}
 

Чтобы получить доступ к ссылке из этого объекта в Autocomplete компоненте onChange , вам нужно будет изменить функцию options карты, чтобы вернуть целое option . После этого изменения, если вы попытаетесь щелкнуть, чтобы открыть раскрывающийся список, он выдаст ошибку, поскольку метка опции должна быть string (например, имя опции), а не объектом (например, опция). Итак, нам нужно добавить getOptionLabel реквизит и вернуть option.name его .

Наконец, в onChange функции мы устанавливаем значение window.location.href равно option.link , которое изменяет URL текущей страницы на ссылку и направляет пользователя по этой ссылке.

 <div style={{}}>
  <Autocomplete
    freeSolo
    id="free-solo-2-demo"
    getOptionLabel={(option) => option.name}
    options={props.vendorData.map((option) => option)}
    onChange={(event: any, option: any) => {
      window.location.href = option.link;
    }}
    renderInput={(params) => (
      <TextField
        {...params}
        value={value}
        required
        inputRef={nameRef}
        onChange={(e) => {
          setValue(e.target.value);
          sendDataToParent();
        }}
        label="Vendor Name"
        margin="normal"
        variant="standard"
        InputProps={{ ...params.InputProps, type: "search" }}
      />
    )}
  />
</div>
 

Комментарии:

1. Большое вам спасибо за разъяснения по поводу метки getOptionLabel и опций.