首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单击链接后,ReactJS在进入链接路由之前执行一个函数

单击链接后,ReactJS在进入链接路由之前执行一个函数
EN

Stack Overflow用户
提问于 2022-06-11 10:32:46
回答 1查看 123关注 0票数 0

我已经创建了我的导航条,这样,当我在移动设备中打开它时,body就会应用overflow-hidden类。当肚脐关闭时,overflow-hidden被从身体上移除。

遇到的问题:当我单击链接并导航到另一个视图时,从body中删除overflow-hidden的函数不会运行。这意味着,在新页面上,主体有溢出隐藏,因此用户不能真正滚动到任何地方。打开和关闭导航条修复了这个问题,因为它消除了隐藏在身体上的溢出。

我用的是ReactJS的Laravel。

代码语言:javascript
复制
// NavLink.js
import React, { useEffect, useCallback } from "react";
import { useNavigate } from "react-router-dom";
import { Link } from "@inertiajs/inertia-react";

export default function NavLink({ href, active, children, className = "" }) {
    return (
        <Link
            href={href}
            className={
                (active
                    ? "inline-flex items-center px-1 pt-1 border-b-2 border-[#ed8686] text-sm font-medium leading-5 text-gray-900 focus:outline-none focus:border-[#E05D5D] transition duration-150 ease-in-out dark:text-gray-400"
                    : "inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out dark:text-gray-300 dark:hover:text-gray-500 dark:hover:border-gray-300 dark:focus:outline-none dark:focus:text-gray-500 dark:focus:border-gray-300") +
                ` ${className}`
            }
        >
            {children}
        </Link>
    );
}
代码语言:javascript
复制
// NavBar.js
import ApplicationLogo from "@/Components/ApplicationLogo";
import DarkModeButton from "@/Components/DarkModeButton";
import NavLink from "@/Components/NavLink";
import { Link } from "@inertiajs/inertia-react";
import React, { useEffect, useRef, useState } from "react";

import { MdClose, MdMenu } from "react-icons/md";

const NavBar = ({ dark, setDark }) => {
    const [scrollTop, setScrollTop] = useState("");
    const navRef = useRef();
    const mobileNavRef = useRef();
    const toggleNav = (e) => {
        e.preventDefault();
        const navBar = mobileNavRef.current;
        navBar.classList.toggle("active");
        document.body.classList.toggle("overflow-hidden");
    };

    const hideNav = (e) => {
        e.preventDefault();
        const navBar = mobileNavRef.current;
        navBar.classList.remove("active");
        document.body.classList.remove("overflow-hidden");
    };

    // TODO: Too many renders, change to remove extra renders
    useEffect(() => {
        if (scrollTop >= 80) {
            navRef.current.classList.add("scrolled");
        } else {
            navRef.current.classList.remove("scrolled");
        }
        const onScroll = (e) => {
            setScrollTop(e.target.documentElement.scrollTop);
        };
        window.addEventListener("scroll", onScroll);

        return () => window.removeEventListener("scroll", onScroll);
    }, [scrollTop]);

    return (
        <>
            <nav className="main-nav" ref={navRef}>
                <Link to="/" className="h-full w-auto block py-4 mx-auto">
                    <ApplicationLogo className="h-full w-auto" dark={!!dark} />
                </Link>
                <MdMenu
                    className="fixed right-4 top-4 text-lg cursor-pointer lg:hidden dark:text-white"
                    onClick={(e) => toggleNav(e)}
                />
                <ul className="hidden lg:flex flex-row items-center justify-center">
                    <li>
                        <NavLink
                            href={route("home")}
                            active={route().current("home")}
                            children="Home"
                            className="text-lg my-2 mx-4"
                        />
                    </li>
                    <li>
                        <NavLink
                            href={route("gallery")}
                            children="Gallery"
                            active={route().current("gallery")}
                            className="text-lg my-2 mx-4"
                        />
                    </li>
                    <li>
                        <NavLink
                            // href={route("about")}
                            children="About"
                            active={route().current("about")}
                            className="text-lg my-2 mx-4"
                        />
                    </li>
                    <li className="cursor-pointer flex items-center justify-center">
                        <DarkModeButton dark={dark} setDark={setDark} />
                    </li>
                </ul>
            </nav>
            <ul
                className="w-full md:w1/2 lg:w-1/4 flex items-center justify-center fixed inset-0 bg-white h-full flex-col mobile-nav lg:hidden z-50 dark:bg-gray-900"
                ref={mobileNavRef}
            >
                <MdClose
                    className="absolute top-4 right-4 text-lg cursor-pointer lg:hidden dark:text-white"
                    onClick={(e) => hideNav(e)}
                />
                <Link to="/" onClick={(e) => hideNav(e)}>
                    <ApplicationLogo
                        className="h-32 mb-2 w-auto lg:hidden"
                        dark={dark}
                    />
                </Link>
                <li>
                    <NavLink
                        href={route("home")}
                        active={route().current("home")}
                        children="Home"
                        className="text-lg my-2 mx-4"
                        onClick={(e) => hideNav(e)}
                    />
                </li>
                <li>
                    <NavLink
                        href={route("gallery")}
                        children="Gallery"
                        active={route().current("gallery")}
                        className="text-lg my-2 mx-4"
                        onClick={(e) => hideNav(e)}
                    />
                </li>
                <li>
                    <NavLink
                        // href={route("about")}
                        children="About"
                        active={route().current("about")}
                        className="text-lg my-2 mx-4"
                        onClick={(e) => hideNav(e)}
                    />
                </li>
                <li className="cursor-pointer">
                    <DarkModeButton dark={dark} setDark={setDark} />
                </li>
            </ul>
        </>
    );
};

export default NavBar;

我已经创建了函数hideNav(),它有e.preventDefault(),但我猜它不能工作,因为它不直接应用于Link标记?我没有把握

不知道如何解决这个问题

我考虑过使用useNavigate,但我不使用router,inertiajs正在为我处理路由,我只是在laravel web.php文件中设置路由。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-11 12:42:25

我想出了一个解决办法,

这不是理想的解决方案,但这是我所能想到的

我向NavLink组件添加了一个支柱,并且基于该支柱是否为真,我添加了onclick事件处理程序,该处理程序从主体中删除溢出类。

代码语言:javascript
复制
import React from "react";
import { Link } from "@inertiajs/inertia-react";
import { Inertia } from "@inertiajs/inertia";

export default function NavLink({
    href,
    active,
    children,
    className = "",
    mobileLink = false,
}) {
    return (
        <Link
            href={href}
            className={
                (active
                    ? "inline-flex items-center px-1 pt-1 border-b-2 border-[#ed8686] text-sm font-medium leading-5 text-gray-900 focus:outline-none focus:border-[#E05D5D] transition duration-150 ease-in-out dark:text-gray-400"
                    : "inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out dark:text-gray-300 dark:hover:text-gray-500 dark:hover:border-gray-300 dark:focus:outline-none dark:focus:text-gray-500 dark:focus:border-gray-300") +
                ` ${className}`
            }
            onClick={
                mobileLink
                    ? (e) => {
                          e.preventDefault();
                          document.body.classList.remove("overflow-hidden");
                          Inertia.visit(href);
                      }
                    : undefined
            }
        >
            {children}
        </Link>
    );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72583591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档