当我在 React 中使用 UseState 更改 class 名称时,汉堡包菜单不起作用
Hamburger menu not working when I change class name using UseState in React
我正在为网站创建导航栏,一切正常,当您更改屏幕大小时汉堡菜单。但是,我还让我的导航栏在用户滚动时固定。
当您滚动到顶部时,汉堡菜单工作正常,但一旦您开始滚动,汉堡菜单就不会点击。
如果我将 'false' 的初始状态更改为 'true,' 它将以相反的顺序工作..因此它在顶部时不起作用,但在滚动时它会起作用。
我整天都在想办法解决这个问题,我一直在试图找到解决办法,但我不能。如果有人能帮助我,将不胜感激。
导航条代码:
function Navbar2() {
const [scrolled, setScrolled] = useState(false);
const canvasRef = useRef();
const navLinksRef = useRef();
const liRefAbout = useRef();
const liRefServices = useRef();
const liRefGallery = useRef();
const liRefTestimonials = useRef();
const liRefContact = useRef();
// toggle mobile menu on icon click
useEffect(() => {
const burger = canvasRef.current;
const nav = navLinksRef.current;
const aboutLink = liRefAbout.current;
const servicesLink = liRefServices.current;
const galleryLink = liRefGallery.current;
const testimonialsLink = liRefTestimonials.current;
const contactLink = liRefContact.current;
burger.addEventListener('click', () => {
nav.classList.toggle('nav-active');
aboutLink.classList.toggle('list-about-active');
servicesLink.classList.toggle('list-services-active');
galleryLink.classList.toggle('list-gallery-active');
testimonialsLink.classList.toggle('list-testimonials-active');
contactLink.classList.toggle('list-contact-active');
burger.classList.toggle('toggle');
});
}, [scrolled]);
// make navbar fixed on scroll
const handleScroll = () => {
const offset = window.scrollY;
if (offset > 80) {
setScrolled(true);
} else if (offset < 80) {
setScrolled(false);
}
};
useEffect(() => {
window.addEventListener('scroll', handleScroll);
});
let x = ['navbar'];
if (scrolled) {
x.push('scrolled');
}
return (
<nav className={`navbar ${scrolled ? 'scrolled' : ''}`}>
........
导航栏CSS
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
min-height: 8vh;
background: transparent;
transition: all 0.4s linear;
position: sticky;
position: -webkit-sticky;
top: 0;
z-index: 900;
}
.scrolled {
position: fixed;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.8);
backdrop-filter: blur(6px);
width: 100%;
}
这里可以通过代码优化很多东西。
useEffect(() => {
const burger = canvasRef.current;
const nav = navLinksRef.current;
const aboutLink = liRefAbout.current;
const servicesLink = liRefServices.current;
const galleryLink = liRefGallery.current;
const testimonialsLink = liRefTestimonials.current;
const contactLink = liRefContact.current;
burger.addEventListener('click', () => {
nav.classList.toggle('nav-active');
aboutLink.classList.toggle('list-about-active');
servicesLink.classList.toggle('list-services-active');
galleryLink.classList.toggle('list-gallery-active');
testimonialsLink.classList.toggle('list-testimonials-active');
contactLink.classList.toggle('list-contact-active');
burger.classList.toggle('toggle');
});
}, [scrolled]);
您不必在每次“滚动”发生变化时都添加事件侦听器。
它只是一个不关心什么是“滚动”状态的函数,但如果按钮已被单击,那么添加一次事件监听器是好的。
其次,您不需要将 ref 重新声明为常量,因为它们将指向同一事物。
第二个参数为空数组会触发一次useEffecthook,
useEffect(() => {
const burger = canvasRef.current;
const nav = navLinksRef.current;
const aboutLink = liRefAbout.current;
const servicesLink = liRefServices.current;
const galleryLink = liRefGallery.current;
const testimonialsLink = liRefTestimonials.current;
const contactLink = liRefContact.current;
burger.addEventListener('click', () => {
nav.classList.toggle('nav-active');
aboutLink.classList.toggle('list-about-active');
servicesLink.classList.toggle('list-services-active');
galleryLink.classList.toggle('list-gallery-active');
testimonialsLink.classList.toggle('list-testimonials-active');
contactLink.classList.toggle('list-contact-active');
burger.classList.toggle('toggle');
});
}, []);
我正在为网站创建导航栏,一切正常,当您更改屏幕大小时汉堡菜单。但是,我还让我的导航栏在用户滚动时固定。
当您滚动到顶部时,汉堡菜单工作正常,但一旦您开始滚动,汉堡菜单就不会点击。
如果我将 'false' 的初始状态更改为 'true,' 它将以相反的顺序工作..因此它在顶部时不起作用,但在滚动时它会起作用。
我整天都在想办法解决这个问题,我一直在试图找到解决办法,但我不能。如果有人能帮助我,将不胜感激。
导航条代码:
function Navbar2() {
const [scrolled, setScrolled] = useState(false);
const canvasRef = useRef();
const navLinksRef = useRef();
const liRefAbout = useRef();
const liRefServices = useRef();
const liRefGallery = useRef();
const liRefTestimonials = useRef();
const liRefContact = useRef();
// toggle mobile menu on icon click
useEffect(() => {
const burger = canvasRef.current;
const nav = navLinksRef.current;
const aboutLink = liRefAbout.current;
const servicesLink = liRefServices.current;
const galleryLink = liRefGallery.current;
const testimonialsLink = liRefTestimonials.current;
const contactLink = liRefContact.current;
burger.addEventListener('click', () => {
nav.classList.toggle('nav-active');
aboutLink.classList.toggle('list-about-active');
servicesLink.classList.toggle('list-services-active');
galleryLink.classList.toggle('list-gallery-active');
testimonialsLink.classList.toggle('list-testimonials-active');
contactLink.classList.toggle('list-contact-active');
burger.classList.toggle('toggle');
});
}, [scrolled]);
// make navbar fixed on scroll
const handleScroll = () => {
const offset = window.scrollY;
if (offset > 80) {
setScrolled(true);
} else if (offset < 80) {
setScrolled(false);
}
};
useEffect(() => {
window.addEventListener('scroll', handleScroll);
});
let x = ['navbar'];
if (scrolled) {
x.push('scrolled');
}
return (
<nav className={`navbar ${scrolled ? 'scrolled' : ''}`}>
........
导航栏CSS
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
min-height: 8vh;
background: transparent;
transition: all 0.4s linear;
position: sticky;
position: -webkit-sticky;
top: 0;
z-index: 900;
}
.scrolled {
position: fixed;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.8);
backdrop-filter: blur(6px);
width: 100%;
}
这里可以通过代码优化很多东西。
useEffect(() => {
const burger = canvasRef.current;
const nav = navLinksRef.current;
const aboutLink = liRefAbout.current;
const servicesLink = liRefServices.current;
const galleryLink = liRefGallery.current;
const testimonialsLink = liRefTestimonials.current;
const contactLink = liRefContact.current;
burger.addEventListener('click', () => {
nav.classList.toggle('nav-active');
aboutLink.classList.toggle('list-about-active');
servicesLink.classList.toggle('list-services-active');
galleryLink.classList.toggle('list-gallery-active');
testimonialsLink.classList.toggle('list-testimonials-active');
contactLink.classList.toggle('list-contact-active');
burger.classList.toggle('toggle');
});
}, [scrolled]);
您不必在每次“滚动”发生变化时都添加事件侦听器。 它只是一个不关心什么是“滚动”状态的函数,但如果按钮已被单击,那么添加一次事件监听器是好的。 其次,您不需要将 ref 重新声明为常量,因为它们将指向同一事物。
第二个参数为空数组会触发一次useEffecthook,
useEffect(() => {
const burger = canvasRef.current;
const nav = navLinksRef.current;
const aboutLink = liRefAbout.current;
const servicesLink = liRefServices.current;
const galleryLink = liRefGallery.current;
const testimonialsLink = liRefTestimonials.current;
const contactLink = liRefContact.current;
burger.addEventListener('click', () => {
nav.classList.toggle('nav-active');
aboutLink.classList.toggle('list-about-active');
servicesLink.classList.toggle('list-services-active');
galleryLink.classList.toggle('list-gallery-active');
testimonialsLink.classList.toggle('list-testimonials-active');
contactLink.classList.toggle('list-contact-active');
burger.classList.toggle('toggle');
});
}, []);