Пользовательская кнопка с одним значением не нажимается

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

const CustomOption = (props) => {
  const handleEdit = (e) => {
    e.stopPropagation();
    alert("This is working like I want");
  };

  return (
    <components.Option {...props}>
      <div className = "test">
        <span>{props.children}</span>
        <button onClick = {handleEdit}>Edit</button>
      </div>
    </components.Option>
  );
};
export default function App() {
  const option = [
    { value: "Spring", label: "Spring" },
    { value: "Summer", label: "Summer" },
    { value: "Autumn", label: "Autumn" },
    { value: "Winter", label: "Winter" },
  ];

  return (
    <div className = "App">
      <Select
        className = "dropdown"
        options = {option}
        components = {{ SingleValue: CustomSingleValue }}
      />
    </div>
  );
}

Вопрос: Почему не работает кнопка внутри CustomSingleValue (а кнопка внутри CustomOption работает) и как это исправить?

Код SandBox

Это особенно неприятно, поскольку CustomOption, использующий точно такой же код, работает нормально.

Работаем или не работаем

Полный код, включая рабочий CustomOption:

// This isn't working like I want
const CustomSingleValue = (props) => {
  const handleEdit = (e) => {
    e.stopPropagation();
    alert("This I can't click");
  };

  return (
    <components.SingleValue {...props}>
      <div className = "test">
        <span>{props.children}</span>
        <div>
          <button onClick = {handleEdit}>Edit</button>
        </div>
      </div>
    </components.SingleValue>
  );
};

// This is working how I want
const CustomOption = (props) => {
  const handleEdit = (e) => {
    e.stopPropagation();
    alert("This is working like I want");
  };

  return (
    <components.Option {...props}>
      <div className = "test">
        <span>{props.children}</span>
        <button onClick = {handleEdit}>Edit</button>
      </div>
    </components.Option>
  );
};
export default function App() {
  const option = [
    { value: "Spring", label: "Spring" },
    { value: "Summer", label: "Summer" },
    { value: "Autumn", label: "Autumn" },
    { value: "Winter", label: "Winter" },
  ];

  return (
    <div className = "App">
      <Select
        className = "dropdown"
        options = {option}
        placeholder = "Click on a option and then try to click the edit button"
        components = {{ SingleValue: CustomSingleValue, Option: CustomOption }}
      />
    </div>
  );
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

введите сюда описание изображения просто добавьте позицию: относительно в контейнере опций, все будет работать

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

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

Проблема номер один: у вас есть ввод реакции-выбора, наложенный на ваш компонент, поэтому вы щелкаете по нему вместо компонента с одним значением:

Чтобы решить эту проблему, вам нужно добавить z-index:

const singleValueStyles = {
  singleValue: (styles) => ({ ...styles, "z-index": 2 }),
};
...

<Select
  className = "dropdown"
  options = {option}
  styles = {singleValueStyles} // 👈
...

После этого кнопка работает хорошо, однако раскрывающийся список все равно открывается. Это потому, что в реакции-выборе используется onMouseDown, а не onClick. Самый простой способ исправить это — использовать onMouseDown:

<button onMouseDown = {handleEdit}>Edit</button>

Если вы хотите сохранить onClick, просто добавьте еще один обработчик для onMouseDown, который только останавливает распространение.

Спасибо! Мне действительно не приходило в голову, что это проблема css/стиля, а не только проблема с javascript.

ColtonSomeone 15.08.2024 23:57

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