javascript - 在选择一个项目或在其外部单击时关闭列表项下拉列表
问题描述
我在我的 react js 项目中创建了一个下拉列表,其中包含列表项(下拉项在此处由 ul 和 li 标签显示)。
我面临的问题是,在选择任何项目时,状态值会发生变化,但下拉菜单不会关闭,当我点击它之外的任何地方时它不会关闭。请帮帮我,这是同一个 repo 的工作代码和框 url
我也在分享下面的代码。
应用程序.js
import React, { Component, useState } from "react";
import Dropdown from "./dropdown";
import "./dropdown.css";
const App = () => {
const [value, setValue] = useState("");
const [showDropdown, setShowDropdown] = useState(false);
const selectedValue = (value) => {
console.log(value);
setValue(value);
};
const onSelectItem = () => {
console.log("12");
setShowDropdown(false);
};
return (
<section className="shadow-border" id="FlightsForm">
<div className="top-sec d-flex">
<div className="left-side">
<span
className="custm-dropdown"
onClick={() => setShowDropdown(true)}
>
<span style={{ backgroundColor: "grey", color: "white" }}>
{value.tripType}
</span>
<span className="dropdown-icon"> </span>
<Dropdown
selectedValue={selectedValue}
onSelectItem={onSelectItem}
showDropdown={showDropdown}
/>
</span>
</div>
</div>
</section>
);
};
export default App;
Dropdown.js
import React from "react";
import { useState, useEffect } from "react";
const TripTypeDropdown = (props) => {
const [values, setValues] = useState([
{ tripType: "One Way", value: 1 },
{ tripType: "Return", value: 2 },
{ tripType: "Multi- City", value: 3 },
]);
const [selectedItem, setSelectedItem] = useState({
tripType: "One Way",
value: 1,
});
useEffect(() => {
props.selectedValue(selectedItem);
console.log(selectedItem);
}, [selectedItem]);
const selectItemFromList = (index) => {
const itemSelected = values[index];
setSelectedItem(itemSelected);
props.onSelectItem();
};
const getActiveClassName = (item) => {
if (selectedItem) {
if (item.tripType == selectedItem.tripType) return "active";
else return "";
}
} ;
return (
<React.Fragment>
<div
className={`dropdown-modal sm-modal ripple trip-type-dropdown`}
style={{ display: `${props.showDropdown ? "block" : "none"}` }}
>
<ul>
{console.log(values)}
{values.map((item, index) => (
<li
className={getActiveClassName(item)}
onClick={() => selectItemFromList(index)}
key={index}
style={{backgroundColor:'yellow',border:"1px solid black",listStyle:"none"}}
>
{item.tripType}
</li>
))}
</ul>
</div>
</React.Fragment>
);
};
export default TripTypeDropdown;
解决方案
您需要停止将单击事件从下拉组件冒泡到它的父 span 元素。单击时,您需要传递 event 参数和stopPropagation
事件对象的调用函数
这是冷凝箱
Dropdown.js
const selectItemFromList = (e,index) => {
e.stopPropagation();
...
<li
className={getActiveClassName(item)}
onClick={(e) => selectItemFromList(e,index)}
key={index}
还添加了外部点击的代码。
const ref = useRef();
...
useEffect(() => {
document.addEventListener("click", handleDropdownClick);
}, [ref]);
const handleDropdownClick = (e) => {
e.stopPropagation();
if (ref.current && ref.current.contains(e.target)) {
setShowDropdown(true);
} else {
setShowDropdown(false);
}
};
...
<span
ref={ref}
className="custm-dropdown"
onClick={handleDropdownClick}
>
推荐阅读
- java - 具有不同对象的反序列化 json 数组 - jackson/spring
- google-apps-script - Google Apps 脚本组合图表在 x 轴上重复相同的值
- mysql - 更新查询 - @
- c# - 如何从服务“内部”的代码访问托管在 IIS 中的 WCF 服务的 web.config
- python - 是否有一个 numpy 函数返回给定大小的数组索引矩阵?
- django - 当我登录 Django 时,Href 不起作用
- python - 我设计了一个算法并实现了代码,但是我不知道代码的时间复杂度 T(n)=O(??)
- sql - NULL 未在枢轴中折叠(可能的 JOIN 问题)
- .net - 我可以在 .netframework 应用程序下运行 core 3.1 子站点应用程序吗
- python - 如何在python中更新json键名