"use client";
import React, { useEffect, useState } from "react";
import { AnimatePresence, motion } from "framer-motion";
import { Route, routeCollection } from "../../data/route";
import { IonIcon } from "@ionic/react";
import Link from "next/link";
import { usePathname } from "next/navigation";
import {
linkAppearAnimationVariant,
linkContainerAnimationVariants,
navScreenVariant,
} from "../../animation/navbarVariants";
import { signal } from "@preact/signals";
const isNavOpen = signal<boolean>(false);
const MobileNav = () => {
// const [isNavOpen, setIsNavOpen] = useState(false);
const pathname = usePathname();
return (
<>
{!isNavOpen && (
<div
className="fixed right-12 top-12 md:hidden text-neutral-50"
onClick={() => {
isNavOpen.value = true;
}}
>
Open
</div>
)}
<AnimatePresence>
{isNavOpen && (
<motion.div
variants={navScreenVariant}
initial="initial"
animate="animate"
exit="exit"
className="w-full h-full flex flex-col justify-between absolute origin-top bg-main backdrop-blur-md md:hidden text-neutral-50 p-8"
>
<motion.div className="flex justify-between p-4 items-center">
<motion.p className="font-bold text-lg">Ayush</motion.p>
<motion.p
onClick={() => {
isNavOpen.value = false;
}}
>
Close
</motion.p>
</motion.div>
<motion.div
variants={linkContainerAnimationVariants}
initial="initial"
animate="animate"
exit="initial"
className="flex flex-col justify-between items-center gap-4"
>
{routeCollection.map((eachRoute, index) => (
<div className="overflow-hidden">
<LinkRender
key={index}
eachRoute={eachRoute}
pathName={pathname}
closeTab={() => {
isNavOpen.value = false;
}}
/>
</div>
))}
</motion.div>
<motion.a
href="mailto:[email protected]"
className="underline underline-offset-2 text-center"
>
Contact Me
</motion.a>
</motion.div>
)}
</AnimatePresence>
</>
);
};
const LinkRender = ({
eachRoute,
pathName,
closeTab,
}: {
eachRoute: Route;
pathName: string;
closeTab: () => void;
}) => {
return (
<motion.div variants={linkAppearAnimationVariant} onClick={closeTab}>
<Link href={eachRoute.address}>
<motion.div
className={`flex gap-2 items-center font-bold text-md ${
pathName === eachRoute.address ? "text-extraLight" : ""
}`}
>
<IonIcon icon={eachRoute.iconText}></IonIcon>
<span>{eachRoute.name}</span>
</motion.div>
</Link>
</motion.div>
);
};
export default MobileNav;
字符串
这是上面的代码是为我的一个组件在未来的js
现在问题出在这段代码上
{!isNavOpen && (
<div
className="fixed right-12 top-12 md:hidden text-neutral-50"
onClick={() => {
isNavOpen.value = true;
}}
型
只有这段代码在这一行抛出错误
isNavOpen.value = true;
型
在其他地方,它没有抛出错误,我无法使用取消按钮
我第一次尝试预处理/信号
我试着把这段代码
const isNavOpen = signal<boolean>(false) as {value: boolean};
型
我也试过这个分离整个功能
const stateChange_isNavOpen = (newState: boolean) => {
isNavOpen.value = newState;
};
型
现在它没有抛出任何错误,但整个功能不工作
1条答案
按热度按时间bvjveswy1#
你使用的是Preact信号绑定,而不是React的。
请按照安装说明并使用
@preact/signals-react
,如果你试图在React中使用它们。