使用nextjs切换页面时如何只更改一个组件?

Posted

技术标签:

【中文标题】使用nextjs切换页面时如何只更改一个组件?【英文标题】:How to change only one component when switching pages with nextjs? 【发布时间】:2019-12-24 19:04:53 【问题描述】:

背景

我想建立一个网页,每当我将 url 更改为另一个路径时,它都不会触发导航,我的意思是,它不会再次加载页面;相反,我希望此 url 更改以更改页面中一个组件“x”的属性。根据 url 路径,它会导致组件“x”加载不同的属性;

代码示例

在下面的示例中,根据单击的链接,它会在空段落行上显示不同的值:如果 url 路径只是“/”,它应该是空的,但如果我单击链接 1 它应该在段落上显示“value1”,如果我点击链接 2,它应该显示“value2”。在这两种情况下,我都不想触发导航,我只想更改 url 并且段落上的值也相应更改。

import React from 'react'
import Link from 'next/Link'


const example = ()=>
    return(
    <div>
        <div>   
        <h1>Example</h1>
        <Link href='/value1'><a>Link 1</a></Link>
        <Link href='/value2'><a>Link 2</a></Link>
        </div>
        <div>
         <p> Value <p>
        </div>
    </div>
    )


export default example

问题

如何使用 NextJS 做到这一点?我知道有浅路由,但根据我在这个问题上发现的https://github.com/zeit/next.js/issues/3253 没有确定的方法...... 我知道可以使用 react-router 来完成,但是为了学习 nextJS,我想知道如何使用这个工具来做这样的事情。

感谢您的帮助!

【问题讨论】:

您应该使用为查询属性命名的页面文件 - pages/[param].tsx。据我了解,任何路线value1/value2 在这种情况下都将由同一个文件处理,并将作为router.query.param 传递 【参考方案1】:

使用Next.js Shallow Routing。

浅路由允许您更改 URL 而无需再次运行数据获取方法,包括 getServerSidePropsgetStaticPropsgetInitialProps

您将通过router object(由useRouterwithRouter 添加)收到更新后的pathnamequery,而不会丢失状态。

要启用浅层路由,请将shallow 选项设置为true


应用于您的示例:

// pages/[index].js

import  useEffect  from 'react'
import  useRouter  from 'next/router'

export default function Index() 
  const router = useRouter()

  return (
    <>
      <a onClick=() => router.push('/?value=1', undefined,  shallow: true )>
        Value 1
      </a>

      <a onClick=() => router.push('/?value=2', undefined,  shallow: true )>
        Value 2
      </a>

      <p> router.query.value <p>
    </>
  )

【讨论】:

以上是关于使用nextjs切换页面时如何只更改一个组件?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改NextJS根路径页面

react-query 在 nextjs 中重新获取页面更改的数据

Nextjs 和 TypeScript 中的条件渲染不起作用

NextJS 组件级 SASS 样式

NextJs - 导出使用样式组件的应用程序时出错

如何在 nextjs 的预渲染静态生成页面中获取更改的数据