在 React 中单击时调用挂钩函数的最佳方法是什么
What's the best way to call a hook function on click in React
我正在为我的应用程序创建一些 header,所以我尝试将挂钩放在其他文件中以便更好地组织。
但是我有点困惑,当我点击 header 中的按钮时,如何调用这个函数 useHeaderNavStatus()标记,而不在 Header 组件中创建另一个 useEffect 和 useState?可以吗还是我太瞎了?
感谢您的帮助! :D
文件结构如下:
Header 组件
const Header = () => {
const headerNav = useHeaderNavStatus();
return (
<header>
<button
ref={headerNav.toggleRef}
onClick={What do I do here?}>
Menu
</button>
</header>
);
}
挂钩文件
import { useEffect, useRef, useState } from 'react';
const useHeaderNavStatus = () => {
// Creating ref for toggle button
const toggleRef = useRef<HTMLButtonElement>(null);
// Creating state to know if nav is showing or not
const [isActive, setIsActive] = useState(false);
// This function opens and closes nav
const updateBodyScroll = () => {
setIsActive(!isActive);
const body = document.body.classList;
if (isActive) {
body.remove('no-scroll');
} else {
body.add('no-scroll');
}
};
// This function closes the nav on outside click
const closeNavOnOutsideClick = (event: MouseEvent) => {
if (!toggleRef.current?.contains(event.target as Node))
updateBodyScroll();
};
// Adds and removes event listener to know the target click
useEffect(() => {
if (isActive) {
window.addEventListener('mousedown', closeNavOnOutsideClick);
return () =>
window.removeEventListener('mousedown', closeNavOnOutsideClick);
}
});
return { toggleRef, isActive };
};
你的挂钩还应该return一个打开导航的函数:
const openNav = () => setIsActive(true);
return { toggleRef, isActive, openNav };
然后使用它:
const Header = () => {
const headerNav = useHeaderNavStatus();
return (
<header>
<button
ref={headerNav.toggleRef}
onClick={headerNav.openNav}>
Menu
</button>
</header>
);
}
我正在为我的应用程序创建一些 header,所以我尝试将挂钩放在其他文件中以便更好地组织。
但是我有点困惑,当我点击 header 中的按钮时,如何调用这个函数 useHeaderNavStatus()标记,而不在 Header 组件中创建另一个 useEffect 和 useState?可以吗还是我太瞎了?
感谢您的帮助! :D
文件结构如下:
Header 组件
const Header = () => {
const headerNav = useHeaderNavStatus();
return (
<header>
<button
ref={headerNav.toggleRef}
onClick={What do I do here?}>
Menu
</button>
</header>
);
}
挂钩文件
import { useEffect, useRef, useState } from 'react';
const useHeaderNavStatus = () => {
// Creating ref for toggle button
const toggleRef = useRef<HTMLButtonElement>(null);
// Creating state to know if nav is showing or not
const [isActive, setIsActive] = useState(false);
// This function opens and closes nav
const updateBodyScroll = () => {
setIsActive(!isActive);
const body = document.body.classList;
if (isActive) {
body.remove('no-scroll');
} else {
body.add('no-scroll');
}
};
// This function closes the nav on outside click
const closeNavOnOutsideClick = (event: MouseEvent) => {
if (!toggleRef.current?.contains(event.target as Node))
updateBodyScroll();
};
// Adds and removes event listener to know the target click
useEffect(() => {
if (isActive) {
window.addEventListener('mousedown', closeNavOnOutsideClick);
return () =>
window.removeEventListener('mousedown', closeNavOnOutsideClick);
}
});
return { toggleRef, isActive };
};
你的挂钩还应该return一个打开导航的函数:
const openNav = () => setIsActive(true);
return { toggleRef, isActive, openNav };
然后使用它:
const Header = () => {
const headerNav = useHeaderNavStatus();
return (
<header>
<button
ref={headerNav.toggleRef}
onClick={headerNav.openNav}>
Menu
</button>
</header>
);
}