我有 2 个组件。一个导航栏和一个侧边栏/购物车。在导航栏上,我有一个按钮可以打开和关闭侧边栏。我有一个事件可以触发 clickOutside 函数及其工作。问题是,当我在侧边栏处于活动状态时单击购物车项目时,侧边栏会关闭并再次重新打开。
我的App.jsx:
import { useEffect, useState } from "react";
import "./App.css";
import { Navbar } from "./Components/Navbar";
import { ListItem } from "./Components/ListItem";
import { Cart } from "./Components/Cart";
function App() {
const [list, setList] = useState([]);
const [cartActive, setCartActive] = useState(false);
const fetchList = () => {
fetch(`https://fakestoreapi.com/products`)
.then((res) => res.json())
.then((data) => {
setList(data);
})
.catch((error) => {});
};
useEffect(() => {
fetchList();
}, []);
return (
<>
<Navbar setCartActive={setCartActive} cartActive={cartActive} />
<Cart cartActive={cartActive} setCartActive={setCartActive} />
<div className="main">
<div className="container">
{list.map((item) => {
return <ListItem key={item.id} item={item} />;
})}
</div>
</div>
</>
);
}
export default App;
我的导航栏:
import { useEffect, useState } from "react";
import { FaShoppingBag } from "react-icons/fa";
import { useSelector } from "react-redux";
export const Navbar = ({ setCartActive, cartActive }) => {
const cart = useSelector((state) => state.cart.cart);
const [totalItems, setTotalItems] = useState(0);
const fetchTotalItems = () => {
setTotalItems(cart.reduce((acc, curr) => acc + curr.amount, 0));
};
useEffect(() => {
fetchTotalItems();
}, [cart]);
return (
<nav>
<div className="container">
<div className="brand">
Redux<span>Store</span>
</div>
<div className="icon" onClick={() => setCartActive(!cartActive)}>
<FaShoppingBag /> ({totalItems})
</div>
</div>
</nav>
);
};
我的侧边栏/购物车:
import { useSelector } from "react-redux";
import { CartItem } from "./CartItem";
import { useEffect, useRef } from "react";
export const Cart = ({ cartActive, setCartActive }) => {
const cart = useSelector((state) => state.cart.cart);
const cartRef = useRef();
const handleClickOutside = (e) => {
if (cartActive && cartRef.current && !cartRef.current.contains(e.target)) {
setCartActive(false);
}
};
useEffect(() => {
document.addEventListener("mousedown", handleClickOutside);
() => {
document.removeEventListener("mousedown", handleClickOutside);
};
});
return (
<div className={`cart ${cartActive ? "active" : ""}`} ref={cartRef}>
{cart.map((item) => {
return <CartItem key={item.id} item={item} />;
})}
</div>
);
};
这是可行的,但是当用户在侧边栏打开时单击购物车图标时,侧边栏会关闭并重新打开。这是因为它捕获了 clickOutside 函数。我怎样才能停止导航栏上的 clickoutside 函数?