为什么我在同一个组件中来自 React 路由器的链接在 React 中表现不同

问题描述 投票:0回答:0

我正在使用 React 18.0 和 react-router-dom 5.3。我有一个导航组件

import React, { useContext } from "react";
import { Link } from "react-router-dom";

import { LINK, STATIC_NAMES } from "../../../constants/constants";
import { DashboardContext } from "../../../context/DashboardContextApi";
import { GlobalContext } from "../../../context/GlobalContextApi";

const Navigation = () => {
    const { menu, staticList } = useContext(GlobalContext);
    const { chartsType } = useContext(DashboardContext);

    const currentPath = window.location.href.split("/").pop();
    const StaticItems = [
        {
            id: 1,
            title: "Shows",
            slug: "programme-lists",
            url: "/programme-lists",
        },
        {
            id: 2,
            title: "Podcast",
            slug: "podcast",
            url: "/podcast",
        },
        {
            id: 3,
            title: "Rjs",
            slug: "our-rjs",
            url: "/our-rjs",
        },
    ];
    const NavMenu = menu?.category?.slice(0, 2)?.map((el) => {
        if (el.sub_home_categories?.length) {
            return (
                <DropMenu
                    key={el.id}
                    dropItems={el}
                    currentPath={currentPath}
                />
            );
        } else {
            return (
                <NavItem
                    key={el.id}
                    url={`${
                        el.slug === STATIC_NAMES.TASBIR
                            ? `/${LINK.GALLERY}/${el.slug}`
                            : el.slug === STATIC_NAMES.VIDEO
                            ? `/${LINK.GALLERY}/${el.slug}`
                            : `/${LINK.CATEGORY}/${el.slug}`
                    }`}
                    title={el.name}
                    label={el.name}
                    slug={el.slug}
                    currentPath={currentPath}
                />
            );
        }
    });
    return (
        <div className="navigation_box mains" id="root-abc">
            <ul>
                <li className="dropdown">
                    <a
                        className="nav-link dropdown-toggle"
                        href="#"
                        id="navbarDropdown"
                        role="button"
                        data-toggle="dropdown"
                        aria-haspopup="true"
                        aria-expanded="false"
                        title="About"
                    >
                        About
                    </a>
                    <ul className="dropdown-menu">
                        {staticList?.map((el) => (
                            <li>
                                <Link
                                    to={`/${LINK.STATIC}/${el.slug}`}
                                    title={el?.title}
                                    className={
                                        currentPath == el?.url ? "selected" : ""
                                    }
                                >
                                    {el?.title}
                                </Link>
                            </li>
                        ))}
                    </ul>
                </li>

                {StaticItems.slice(0, 2).map((el) => (
                    <li key={el.id}>
                        <NavItem
                            title={el.title}
                            slug={el.slug}
                            currentPath={currentPath}
                            url={el.url}
                            label={el.title}
                        />
                    </li>
                ))}

                <li className="dropdown">
                    <a
                        className="nav-link dropdown-toggle"
                        href="#"
                        id="navbarDropdown"
                        role="button"
                        data-toggle="dropdown"
                        aria-haspopup="true"
                        aria-expanded="false"
                        style={{ cursor: "pointer" }}
                        title="Charts"
                    >
                        Charts
                    </a>
                    <ul className="dropdown-menu">
                        {chartsType?.map((el) => {
                            if (el?.countdowns?.length > 0)
                                return (
                                    <li>
                                        <Link
                                            to={{
                                                pathname: `/${LINK.CHARTS}/${el?.slug}`,
                                                state: { category: el?.title },
                                              }}
                                            className={
                                                currentPath == el?.slug
                                                    ? "selected"
                                                    : ""
                                            }
                                            title={el?.title}
                                        >
                                            {el?.title}
                                        </Link>
                                    </li>
                                );
                        })}
                    </ul>
                </li>

                {NavMenu}
                {StaticItems.slice(2).map((el) => (
                    <li key={el.id}>
                        <NavItem
                            title={el.title}
                            slug={el.slug}
                            currentPath={currentPath}
                            url={el.url}
                            label={el.title}
                        />
                    </li>
                ))}

                <li className="live-btn">
                    <Link to={`/${LINK.LIVE}`} title="Listen Live">
                        <span className="listen">Listen</span>
                        <span className="live-text">Live</span>
                    </Link>
                </li>
            </ul>
        </div>
    );
};

export default Navigation;

const NavItem = ({ url = "/", label = "", slug, currentPath }) => {
    return (
        <li>
            <Link
                to={{
                    pathname: url,
                    state: { title: label },
                }}
                className={currentPath == slug ? "selected" : ""}
                title={label}
            >
                {label}
            </Link>
        </li>
    );
};

const DropMenu = ({ dropItems, currentPath }) => {
    return (
        <li key={dropItems.id} className={`dropdown`}>
            <a
                className="nav-link dropdown-toggle"
                href="#"
                id="navbarDropdown"
                role="button"
                data-toggle="dropdown"
                aria-haspopup="true"
                aria-expanded="false"
                style={{ cursor: "pointer" }}
                title={dropItems.name}
            >
                {dropItems.name}
            </a>
            <ul className={`dropdown-menu`}>
                {dropItems.sub_home_categories.map((sub_menu) => (
                    <NavItem
                        key={sub_menu.id}
                        title={sub_menu.name}
                        slug={sub_menu.slug}
                        currentPath={currentPath}
                        url={`${
                            sub_menu.slug === STATIC_NAMES.TASBIR
                                ? `/${LINK.GALLERY}/${sub_menu.slug}`
                                : sub_menu.slug === STATIC_NAMES.VIDEO
                                ? `/${LINK.GALLERY}/${sub_menu.slug}`
                                : `/${LINK.CATEGORY}/${sub_menu.slug}`
                        }`}
                        label={sub_menu.name}
                    />
                ))}
            </ul>
        </li>
    );
};

这个组件用在header & Mobile Menu组件中

import React, { useContext } from "react";
import { Link } from "react-router-dom";

import Social from "../Social";
import Navigation from "./Navigation";
import SearchForm from "../SearchForm";

import { DashboardContext } from "../../../context/DashboardContextApi";
import { GlobalContext } from "../../../context/GlobalContextApi";

const Header = ({ meta }) => {
    const { setRefresh } = useContext(DashboardContext);
    const { setRefreshList } = useContext(GlobalContext);

    const handleApiRefresh = () => {
        setRefresh(Date.now());
        setRefreshList(Date.now());
    };

    return (
        <>
            <div id="sticky" className="header">
                <div className="container-fluid headbox">
                    <div className="row headerbox ">
                        <div className="logo-box col-sm-3 col-md-2">
                            <div className="logo-item">
                                <Link
                                    to={{
                                        pathname: "/",
                                        state: {
                                            prev: "Home",
                                        },
                                    }}
                                    title={meta?.title}
                                >
                                    <img
                                        src="/themes/radio2/images/logo.png"
                                        alt={meta?.title}
                                        onClick={handleApiRefresh}
                                    />
                                </Link>
                            </div>
                            <a className="search-btn btn-search" title="Search">
                                <span className="search-icon fa fa-search"></span>
                            </a>
                        </div>
                        <div className="navigation-box col-sm-6 col-md-8">
                            <Navigation />
                        </div>
                        <div className="navigation-box col-sm-3 col-md-2">
                            <div className="nav-box">
                                <Social meta={meta} />
                            </div>
                        </div>
                    </div>
                </div>
            </div>

            {/* <!--<search option>--> */}
            <div className="search-panel">
                <span className="menu-close">
                    <span className="left-icon lnr lnr-cross"></span>
                </span>
                <div className="search-box">
                    <div className="search-form">
                        <SearchForm />
                    </div>
                </div>
            </div>
        </>
    );
};

export default Header;

import React from "react";

import Navigation from "../Header/Navigation";
import SlideNav from "../Header/SlideNav";
import Social from "../Social";

const MobileMenu = ({meta}) => {
  return (
    <>
      <span className="menu-toggle">
        <span className="left-icon lnr lnr-menu"></span>
      </span>

      <div className="primary-panel">
        <div className="close-box">
          <span className="main-title">
            <span className="menu-close">
              <span className="left-icon lnr lnr-cross"></span>
            </span>
          </span>
        </div>
        <div className="menu-box">
          <Navigation />
          <SlideNav />
          <Social meta={meta}/>
        </div>
      </div>
    </>
  );
};

export default MobileMenu;

import React, { useEffect, useContext } from "react";
import { useLocation } from "react-router-dom";

import LivePlayer from "../LivePlayer/LivePlayer";
import PopupNotice from "../PopupNotice/PopupNotice";
import ScrollTop from "./ScrollTop";
import MobileMenu from "./MobileMenu";
import Wrapper from "./Wrapper";
import Error from "../../../pages/404/Error";
import { GlobalContext } from "../../../context/GlobalContextApi";

const Layout = ({ children }) => {
  const { state, pathname } = useLocation();
    const { global } = useContext(GlobalContext);

  // useEffect(() => {
  //   window.scrollTo(0, 0);
  // }, [pathname]);

  if (state?.from == "NOTFOUND") {
    return <Error />;
  }

  return (
    <>
      <LivePlayer />

      {/* <PopupNotice /> */}

      <MobileMenu meta={global} />

      <Wrapper children={children} />

      <ScrollTop />

      <div className="mask-box"></div>
    </>
  );
};

export default Layout;

const App = () => {
    return (
        <Router>
            <Layout>
                <Switch>
                    <Route path={HOME.INDEX} exact component={Home} />
                    <Route path={NEWS.INDEX}>
                        <NewsPage />
                    </Route>
                    <Route path={NEWS_DETAIL.INDEX}>
                        <SingleNews />
                    </Route>
                    <Route path={ABOUT.INDEX}>
                        <AboutPage />
                    </Route>
                    <Route path={PROGRAMME.INDEX}>
                        <ShowsPage />
                    </Route>
                    <Route path={PROGRAMDETAIL.INDEX}>
                        <ProgramDetailPage />
                    </Route>
                    <Route path={LIVE.INDEX}>
                        <LivePage />
                    </Route>
                    <Route path={PODCAST.INDEX}>
                        <PodcastPage />
                    </Route>
                    <Route path={PODCASTDETAIL.INDEX}>
                        <PodcastDetailPage />
                    </Route>
                    <Route path={PHOTO.INDEX}>
                        <PhotoPage />
                    </Route>
                    <Route path={PHOTODETAIL.INDEX}>
                        <PhotoDetailPage />
                    </Route>
                    <Route path={VIDEODETAIL.INDEX}>
                        <VideoDetailPage />
                    </Route>
                    <Route path={RJS.INDEX}>
                        <RjsPage />
                    </Route>
                    <Route path={TEAM.INDEX}>
                        <TeamPage />
                    </Route>
                    <Route path={FEATUREDARTIST.INDEX}>
                        <FeaturedArtistPage />
                    </Route>
                    <Route path={RJDETAIL.INDEX}>
                        <RjDetailPage />
                    </Route>
                    <Route path={FEATUREDARTISTDETAIL.INDEX}>
                        <FeaturedArtistDetailPage />
                    </Route>
                    <Route path={SEARCH.INDEX}>
                        <SearchPage />
                    </Route>
                    <Route path={CHARTS.INDEX}>
                        <ChartsPage />
                    </Route>
                    <Route path={ERROR.INDEX}>
                        <Redirect
                            to={{ ...location, state: { from: "NOTFOUND" } }}
                        />
                    </Route>
                </Switch>
            </Layout>
        </Router>
    );
};

export default App;
import React, { useContext } from "react";

import Header from "../Header/Header";
import Footer from "../Footer/Footer";
import { GlobalContext } from "../../../context/GlobalContextApi";

const Wrapper = ({ children }) => {
    const { global } = useContext(GlobalContext);
    return (
        <div id="wrapper" className="wrapper">
            <Header meta={global}/>
            <div>{children}</div>
            <Footer meta={global} />
        </div>
    );
};

export default Wrapper;

现在我的问题是当单击

<Navigation />
中使用的
<MobileMenu />
组件的链接时,某些东西触发了页面重新加载。单击
<Navigation />
组件中也使用的相同
<Header />
组件时,链接工作正常。

我尝试将组件移动到

<Header/>
组件,但问题仍然存在。

javascript reactjs react-router
© www.soinside.com 2019 - 2024. All rights reserved.