如何在 NextJS 中使用 onClick 事件调用 2 个函数?
How do I call 2 functions with a onClick event in NextJS?
我的 NextJs 应用程序中已经有 2 个常量 =>“toggleMenu”和“changeLanguage”。当有人点击菜单中的语言转换器时,我需要它来调用这两个函数。
我试过了,但它似乎在我的代码中不起作用,它卡在其中一个函数上,说它未定义。如果我只尝试 运行 这个函数,它确实会按预期工作,所以问题一定出在这段代码上:
onClick={() => { changeLanguage(); toggleMenu() }}
我在网上找到了这个,但它也不起作用,因为我相信语法:
onclick="f1();f2()"
任何人都可以提出其他建议吗?谢谢
编辑:
这是我尝试调用的 2 个函数,但在“changelanguage”函数上出错,特别是在读取“e.target.value”时出现 => undefined。
const Navbar = (props) => {
const [isOpen, setOpen] = useState(false);
const toggleMenu = () => setOpen(!isOpen);
useEffect(() =>{
document.body.style.overflowY = isOpen ? 'hidden' : 'auto';
}, [isOpen])
const router = useRouter();
const { locale } = router
const t = locale === 'en' ? en : es;
const changeLanguage = (e) => {
router.push(router.pathname, router.pathname,{
locale: e.target.value,
})
}
return (
<header className="relative bg-black">
<div className="w-full px-5 sm:px-10">
<div className="flex justify-between items-center py-1 md:space-x-10">
{/* Logos on the left */}
<div className="flex justify-start lg:w-0 lg:flex-1">
</div>
{/* Hamburger menu icon */}
<div className="flex md:hidden">
<button aria-label="menu" onClick={toggleMenu} className="flex text-white hover:text-gray-500">
</button>
</div>
{/* nav links and language changer*/}
<nav className="hidden md:flex space-x-10 font-light text-white">
<Link href="servicios">
<a className='hover:border-b' >{t.navbar.serviciosLink}</a>
</Link>
<select defaultValue={ router.locale } onChange={changeLanguage} className='bg-black text-white'>
<option className=' font-light' value='es'>ES</option>
<option className=' font-light' value='en'>EN</option>
</select>
</nav>
</div>
</div>
{isOpen && (
<div className="absolute top-0 flex flex-col place-content-between w-full h-screen transition transform origin-left md:hidden bg-white z-50 px-5 sm:px-10 py-1">
<div className="flex items-center justify-between">
{/*Left logo*/}
<div className='flex'>
</div>
{/* close icon*/}
<div className="flex">
<button aria-label="close-menu" onClick={toggleMenu} className="text-black hover:text-gray-500">
</button>
</div>
</div>
{/* navigation links */}
<div className="flex">
</div>
{/* social links and language changer */}
<div className='flex text-black text-xl font-light justify-between mb-5'>
<div className='flex flex-col'>
<button onClick={ changeLanguage } className='cursor-pointer font-light' value='es'>ES</button>
<button onClick={ changeLanguage } className='cursor-pointer font-light' value='en'>EN</button>
</div>
</div>
</div>
)}
</header>
);
};
export default Navbar
您不能在按钮的 onClick
事件上使用 e.target.value
。我要做的是创建另一个函数 handleSelectChange 来保持所选选项的状态。
.....
const [selectValue, setSelectValue] = useState("defaultValue");
.....
const handleSelectChange = (event) => {
setSelectValue(event.target.value);
}
.....
<select defaultValue={ router.locale } onChange={handleSelectChange} className='bg-black text-white'>
然后为您的按钮调用您的 changeLanguage 函数,该函数现在实现为使用状态变量
const changeLanguage = (e) => {
router.push(router.pathname, router.pathname,{
locale: selectValue,
})
}
老实说,我们并不真正了解实际问题出在哪里。是未定义的事件还是你不能调用两个函数的事实。
一个点击事件可以调用两个函数
export default function Somepage() {
const functionOne = event =>{
console.log("function one");
}
const functionTwo = event =>{
console.log("function two");
}
const mainFunction = event => {
functionOne(event)
functionTwo(event)
}
return (
<>
<button onClick={mainFunction}>click to change</button>
</>
)
}
我的 NextJs 应用程序中已经有 2 个常量 =>“toggleMenu”和“changeLanguage”。当有人点击菜单中的语言转换器时,我需要它来调用这两个函数。
我试过了,但它似乎在我的代码中不起作用,它卡在其中一个函数上,说它未定义。如果我只尝试 运行 这个函数,它确实会按预期工作,所以问题一定出在这段代码上:
onClick={() => { changeLanguage(); toggleMenu() }}
我在网上找到了这个,但它也不起作用,因为我相信语法:
onclick="f1();f2()"
任何人都可以提出其他建议吗?谢谢
编辑:
这是我尝试调用的 2 个函数,但在“changelanguage”函数上出错,特别是在读取“e.target.value”时出现 => undefined。
const Navbar = (props) => {
const [isOpen, setOpen] = useState(false);
const toggleMenu = () => setOpen(!isOpen);
useEffect(() =>{
document.body.style.overflowY = isOpen ? 'hidden' : 'auto';
}, [isOpen])
const router = useRouter();
const { locale } = router
const t = locale === 'en' ? en : es;
const changeLanguage = (e) => {
router.push(router.pathname, router.pathname,{
locale: e.target.value,
})
}
return (
<header className="relative bg-black">
<div className="w-full px-5 sm:px-10">
<div className="flex justify-between items-center py-1 md:space-x-10">
{/* Logos on the left */}
<div className="flex justify-start lg:w-0 lg:flex-1">
</div>
{/* Hamburger menu icon */}
<div className="flex md:hidden">
<button aria-label="menu" onClick={toggleMenu} className="flex text-white hover:text-gray-500">
</button>
</div>
{/* nav links and language changer*/}
<nav className="hidden md:flex space-x-10 font-light text-white">
<Link href="servicios">
<a className='hover:border-b' >{t.navbar.serviciosLink}</a>
</Link>
<select defaultValue={ router.locale } onChange={changeLanguage} className='bg-black text-white'>
<option className=' font-light' value='es'>ES</option>
<option className=' font-light' value='en'>EN</option>
</select>
</nav>
</div>
</div>
{isOpen && (
<div className="absolute top-0 flex flex-col place-content-between w-full h-screen transition transform origin-left md:hidden bg-white z-50 px-5 sm:px-10 py-1">
<div className="flex items-center justify-between">
{/*Left logo*/}
<div className='flex'>
</div>
{/* close icon*/}
<div className="flex">
<button aria-label="close-menu" onClick={toggleMenu} className="text-black hover:text-gray-500">
</button>
</div>
</div>
{/* navigation links */}
<div className="flex">
</div>
{/* social links and language changer */}
<div className='flex text-black text-xl font-light justify-between mb-5'>
<div className='flex flex-col'>
<button onClick={ changeLanguage } className='cursor-pointer font-light' value='es'>ES</button>
<button onClick={ changeLanguage } className='cursor-pointer font-light' value='en'>EN</button>
</div>
</div>
</div>
)}
</header>
);
};
export default Navbar
您不能在按钮的 onClick
事件上使用 e.target.value
。我要做的是创建另一个函数 handleSelectChange 来保持所选选项的状态。
.....
const [selectValue, setSelectValue] = useState("defaultValue");
.....
const handleSelectChange = (event) => {
setSelectValue(event.target.value);
}
.....
<select defaultValue={ router.locale } onChange={handleSelectChange} className='bg-black text-white'>
然后为您的按钮调用您的 changeLanguage 函数,该函数现在实现为使用状态变量
const changeLanguage = (e) => {
router.push(router.pathname, router.pathname,{
locale: selectValue,
})
}
老实说,我们并不真正了解实际问题出在哪里。是未定义的事件还是你不能调用两个函数的事实。
一个点击事件可以调用两个函数
export default function Somepage() {
const functionOne = event =>{
console.log("function one");
}
const functionTwo = event =>{
console.log("function two");
}
const mainFunction = event => {
functionOne(event)
functionTwo(event)
}
return (
<>
<button onClick={mainFunction}>click to change</button>
</>
)
}