Я пытаюсь добавить кнопку редактирования (которая в настоящее время вызывает предупреждение) в мой компонент реагирования. Однако это делает добавленную кнопку недоступной для нажатия; вместо этого он открывает меню выбора реакции. Остановка распространения не решает проблему.
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 работает) и как это исправить?
Это особенно неприятно, поскольку 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>
);
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


введите сюда описание изображения просто добавьте позицию: относительно в контейнере опций, все будет работать
вы видите, что когда опция выбрана и отображается на входе, это слой под входными данными, поэтому, несмотря на то, что вы видите опцию там, когда вы нажимаете на нее, вы на самом деле не нажимаете на нее, вы нажимаете на вход выбора, в результате чего открывается раскрывающийся список опций.
Проблема номер один: у вас есть ввод реакции-выбора, наложенный на ваш компонент, поэтому вы щелкаете по нему вместо компонента с одним значением:
Чтобы решить эту проблему, вам нужно добавить 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.