Держите список открытым при выборе элемента

Я хотел бы создать элемент CSS таким образом, чтобы:

  1. Есть кнопка.
  2. При нажатии на кнопку открывается список (например, выпадающий список) элементов.
  3. Мы можем щелкнуть элементы для выбора, и родительский компонент будет систематически информироваться.
  4. Мы нажимаем на область за пределами списка (например, снова нажимаем кнопку), чтобы закрыть список.

Я сделал обычный выпадающий список со следующим кодом с помощью Dropdown (одна версия и другая предварительная версия ) Fluent UI (codesandbox: https://codesandbox.io/s/inspiring-lovelace-ivln6v ?file=/src/App.js). Это не соответствует 4-му условию выше: выбор элемента будет систематически закрывать раскрывающийся список, тогда как я ожидаю, что список все еще открыт, и щелчок по области за пределами списка (например, повторное нажатие на кнопку) закрывает список.

Обратите внимание, что это поведение по умолчанию контролируемого раскрывающегося списка с множественным выбором, где нам нужно щелкнуть область за пределами раскрывающегося списка (например, снова нажать кнопку), чтобы закрыть раскрывающийся список. Так что это не безосновательная потребность.

Кто-нибудь знает, как сделать такой элемент CSS (вероятно, настроив существующие элементы управления)? Я открыт для списка элементов управления, таких как Dropdown, Select и Combobox библиотек, таких как пользовательский интерфейс Fabric, пользовательский интерфейс Fluent, пользовательский интерфейс материалов.

import React from "react";
import { Dropdown } from "@fluentui/react/lib/Dropdown";
import { initializeIcons } from "@fluentui/react/lib/Icons";

initializeIcons();

const numberOptions = [8, 9, 10].map((i) => ({
  key: i,
  text: "Number: " + i.toString()
}));

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = { number: 8 };
  }
  onnumberChange = (_ev, option) => {
    if (typeof option.key === "number") {
      this.setState({ number: option.key });
    }
  };

  render() {
    return (
      <div>
        {`Number: ${this.state.number}`}
        <br />
        <br />
        <Dropdown
          options = {numberOptions}
          defaultSelectedKey = {this.state.number}
          onChange = {this.onnumberChange}
        />
      </div>
    );
  }
}
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
1
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обходной путь — использовать open, onOpenChange, onOpenSelect или предварительную версию Dropdown.

CodeSandbox: https://codesandbox.io/s/inspiring-almeida-3lgtcy?file=/src/App.js

import React from "react";
import { Dropdown, Option } from "@fluentui/react-components/unstable";
import { FluentProvider, webLightTheme } from "@fluentui/react-components";
import { initializeIcons } from "@fluentui/react/lib/Icons";

initializeIcons();

const numberOptions = ["8", "9", "10"];

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = { number: "9", op: false };
  }

  render() {
    return (
      <FluentProvider theme = {webLightTheme}>
        <div>
          {`Number: ${this.state.number}`}
          <br />
          <br />
          <Dropdown
            open = {this.state.op}
            onOpenChange = {(e, data) =>
              this.setState(
                { op: data.open },
                console.info("onOpenChange", this.state.op ? "closed" : "open")
              )
            }
            onOptionSelect = {(e, data) =>
              this.setState({ op: true, number: data.optionText })
            }
            defaultSelectedOptions = {["9"]}
          >
            {numberOptions.map((option) => (
              <Option key = {option}>{option}</Option>
            ))}
          </Dropdown>
        </div>
      </FluentProvider>
    );
  }
}

Другие вопросы по теме