Next.js компонент ссылки onhover обновляется

#reactjs #next.js

#reactjs #next.js

Вопрос:

У меня встроено приложение для электронной коммерции next.js . В этом у меня есть верхняя панель, содержащая контактную и другую информацию о ссылках, ниже которой есть длинный раздел и раздел поиска. Эти два элемента выполняются в 2 компонентах, и оба они объединены.

Теперь проблема в том, что при наведении курсора мыши на любую ссылку в компонентах конкретная страница обновляется (не перезагружается). В чем может быть проблема. Для лучшего понимания я разместил видео-удар. Пожалуйста, проверьте.

https://www.dropbox.com/s/tlh4e2os1ok2tpr/screen-recording.webm?dl=0

Я дал всю ссылку, как показано ниже,

 <Link href="/" as="/">
    <a className="mr-4">Help Center</a>
</Link>
  

Пожалуйста, проверьте мои приведенные ниже коды,

Top.js

 const Top = () => {
    return (
    <div>
        <div className="topBar">
            <div className="container">
                <div className="row">
                    <div className="col-sm-4 col-md-6">
                        <p className="text-center text-sm-left">
                            <Link href="/" as="/">
                                <a>Sell in RangerBee</a>
                            </Link>
                        </p>
                    </div>
                    <div className="col-sm-8 col-md-6">
                        <p className="text-center text-sm-right">
                            <Link href="/" as="/">
                                <a className="mr-4">Gift Card</a>
                            </Link>
                            <Link href="/" as="/">
                                <a className="mr-4">Help Center</a>
                            </Link>
                            <Link href="/" as="/">
                                <a>Download app</a>
                            </Link>
                        </p>
                    </div>
                </div>
            </div>
        </div>
    </div>
}

export default Top;
  

Header.js

 const Header = () => {
    return (
    <div>
        <div className="searchBar">
            <div className="container-fluid">
                <div className="row align-items-center">
                    <div className="col-8 col-md-2 col-lg-2">
                        <p>
                            <Link href="/" as="/">
                                <a><img src="/vercel.svg" alt="Example" className="img-fluid" /></a>
                            </Link>
                        </p>
                    </div>
                    <div className="col-4 col-md-2 col-lg-3 col-xl-2">
                        <div className="menuCategory">
                            <p className="main" onClick={() => changeMenuCategory()}><span>Shop By Category</span> <FontAwesomeIcon icon={faChevronDown} className="ml-2 pt-1 fa-down"/> <FontAwesomeIcon icon={faBars} className="ml-2 pt-1 fa-bars"/></p>
                            <ul className={toggleCategory ? "main-nav" : "main-nav d-none"}>
                                {menus amp;amp; menus.data.map((cat, index) => (
                                    <li key={index}>
                                        <Link href={"/products/" cat.cat_slug} as={"/products/" cat.cat_slug}><a title={cat.cat_name}>{cat.cat_name} <FontAwesomeIcon icon={faChevronRight} className="ml-2 float-right menu-arrow"/></a></Link>
                                        <ul>
                                            {cat.subcategory.map((subcat, index1) => (
                                                <li key={index1 index}><Link href={"/products/" cat.cat_slug "/" subcat.sub_slug} as={"/products/" cat.cat_slug "/" subcat.sub_slug}><a title={subcat.sub_name}>{subcat.sub_name}</a></Link></li>
                                            ))}
                                        </ul>
                                    </li>
                                ))}
                            </ul>
                        </div>
                    </div>
                    <div className="col-12 col-md-4 col-lg-4 col-xl-5 mt-3 mb-3 mt-md-0 mb-md-0">
                        <div className="search-box">
                            <div className="search-inner">
                                <input type="text" name="q" placeholder="Search for products, brands and much more" onClick={() => setToggleSearch(b => !b)} onFocus={(e) => trendingSearch(e)} onChange={(e) => startSearch(e)} />
                                <button><FontAwesomeIcon icon={faSearch}/></button>
                            </div>
                            <div className={toggleSearch ? "search-result" : "search-result d-none"}>
                                <ul ref={dropdown}>
                                    {trending !== null amp;amp; searched === null amp;amp; trending.data.length > 0 amp;amp; <li className="trending">Trending Search</li>}
                                    {trending !== null amp;amp; searched == null amp;amp; trending.data.length > 0 amp;amp;
                                        trending.data.map((trending, index) => (
                                            <li key={index}><Link href={"/products/" trending.trending_slug} as={"/products/" trending.trending_slug}><a>{trending.trending_name}</a></Link></li>
                                        ))
                                    }
                                    {searched !== null amp;amp; searched.data.length > 0 amp;amp;
                                        searched.data.map((search, index) => (
                                            <li key={index}>
                                                <Link href={search.search_url} as={search.search_url}>
                                                    {search.images.length > 0 ?
                                                        <a><img src={api.IMAGE_PRODUCTS "/" search.images[0].image_name} alt={search.search_name} /> {search.search_name}</a>
                                                    :
                                                        <a>{search.search_name}</a>
                                                    }
                                                </Link>
                                            </li>
                                        ))
                                    }
                                </ul>
                            </div>
                        </div>
                    </div>
                    <div className="col-12 col-md-4 col-lg-3">
                        <div className="text-center text-md-right">
                            <div className="d-inline loginDrop">
                                <Link href={!isAuthenticated ? "/login" : "/profile"} as={!isAuthenticated ? "/login" : "/profile"}>
                                    <a className="signinBtn mr-5">{!isAuthenticated ? "Sign In" : "My Account"}</a>
                                </Link>
                                <div className={!isAuthenticated ? "login-content" : "login-content logout-content"}>
                                    <p>amp;nbsp;</p>
                                    <div className="login-inner">
                                        <Link href={!isAuthenticated ? "/login" : "/profile"} as={!isAuthenticated ? "/login" : "/profile"}><a><FontAwesomeIcon icon={faUserCircle} className="mr-2"/> Your Profile</a></Link>
                                        <Link href={!isAuthenticated ? "/login" : "/orders"} as={!isAuthenticated ? "/login" : "/orders"}><a><FontAwesomeIcon icon={faBoxOpen} className="mr-2 orderIcon"/> Orders</a></Link>
                                        <Link href={!isAuthenticated ? "/login" : "/wishlist"} as={!isAuthenticated ? "/login" : "/wishlist"}><a><FontAwesomeIcon icon={faHeart} className="mr-2"/> Whishlist</a></Link>
                                        <div className="otherDrop">
                                            {!isAuthenticated ?
                                                <>
                                                <p className="first">Don't have an account?</p>
                                                <p className="register"><Link href="/register" as="/register"><a>Register</a></Link></p>
                                                <p className="login"><Link href="/login" as="/login"><a>Login</a></Link></p>
                                                </>
                                            :
                                                <p className="login"><a href="#" onClick={deauthenticate}>Logout</a></p>
                                            }
                                        </div>
                                    </div>
                                </div>
                            </div>
                            <Link href="/cart" as="/cart">
                                <a className="cartBtn"><FontAwesomeIcon icon={faShoppingCart} className="mr-xl-1"/> Cart <span>{carts[0] === null ? 0 : carts.length}</span></a>
                            </Link>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
}

export default Header;
  

Layout.js

 import Head from 'next/head';
import * as Main from './Index'
import './styles/Index';

const Layout = ({ children, title }) => (
  <div>
    <Head>
      <title>{ title }</title>
      <meta charSet="utf-8" />
      <meta name="viewport" content="initial-scale=1.0, width=device-width" />
    </Head>

    <Main.Top/>
    <Main.Header/>

    <div>
      { children }
    </div>
  </div>
);

export default Layout;
  

next.config.js

 const withSass = require('@zeit/next-sass')

module.exports = withSass({
    cssLoaderOptions: {
        url: false
    }
})
  

Есть ли какие-либо проблемы с моим кодом?

Я использую sass для стилизации. В чем может быть проблема. Я много искал и не мог найти никакого решения. На самом деле я новичок в next.js . Поэтому я не могу найти решение.

Комментарии:

1. Можете ли вы привести пример, с которым мы можем работать? Какой-нибудь пример репозитория или что-то в этом роде

Ответ №1:

Как сказано в их документах, next/Link примите реквизиты href и as , где:

href : Страница, на которую он должен перейти, этот путь никогда не изменится во время выполнения.

as : Что-то вроде декоратора, как ссылка должна отображаться для пользователя. Это может измениться во время выполнения.

Как уже было сказано, давайте посмотрим на одну из ваших ссылок:

 <Link href={"/products/" trending.trending_slug} as={"/products/" trending.trending_slug}><a>{trending.trending_name}</a></Link>
  

В этом случае ваш href динамический меняется в зависимости от вашего тренда, и это должна быть страница, которая существует в вашем проекте, например pages/product/trending , и если тренд является динамическим, вы можете использовать pages/product/[trending] , а затем в as свойстве вы должны использовать динамическую ссылку, как вы уже делаете, /products/" trending.trending_slug .

Взгляните на их документы об этом: https://nextjs.org/docs/tag/v9.5.2/api-reference/next/link#dynamic-routes

Вот проблема, которая выглядит как та же проблема: https://github.com/vercel/next.js/issues/11157

Комментарии:

1. Теперь ошибка 404 решена. Но прикрепленное видео все еще не исправлено.