.
.
import { withRouter } from 'next/router';
import { Component } from 'react';
class User extends Component {
...
render() {
if(this.props.router.isReady){ // Add this condition and include return ()
// Do anything
console.log(this.props.router.query) // Log 'query' on first render
return (
<div>
<SearchBar pid={this.props.router.query.pid} /> // Pass the query params to another component if needed
</div>
);
}
}
}
export default withRouter(User);
9条答案
按热度按时间vd2z7a6w1#
我发现了一些东西:
isReady:boolean -路由器字段是否已在客户端更新并准备就绪。应仅在useEffect方法内部使用,而不应用于在服务器上有条件地呈现。https://nextjs.org/docs/api-reference/next/router#router-object
代码如下所示:
t5fffqht2#
不可能在第一次呈现时获取查询值。
静态优化页在未提供路由参数的情况下水合。例如,
query
是空对象({}
)。水合之后,Next.js将填充查询对象。
Next.js 10.0.5及更高版本
在
useEffect
钩子中使用router.isReady
来检查参数是否准备好了。请参见@doxylee的回答。在下一个. js 10.0.5之前
动态路由的第一次渲染
router.asPath
和router.route
相等。一旦query
对象可用,router.asPath
就反映它。在
asPath
更改后,您可以依赖useEffect
钩子内的查询值。GitHub Issue - Add a "ready" to Router returned by "useRouter"
b5buobof3#
在NextJS9+中,确保路由参数立即可用于页面组件的一种方法是从传递给
getServerSideProps()
的context
参数中获取这些参数,并将其作为props传递给组件。对于像
[id].js
这样的页面,8mmmxcuj4#
这是一个很棒的问题,我花了几天时间才弄清楚最好的方法是什么。
对于验证动态路由路径参数或一般路由路径参数的问题,我个人找到了三种可行的解决方案。
这三种解决方案是
1.使用路由器
1.中间件[下12个必填项]
在我的例子中,a将使用一个需要reset-token的路由,否则它应该被重定向。
SSR首先使用
getServerSideProps
进行服务器端渲染。Vercel建议将SSR作为最后的手段,我强烈建议在可能的情况下不要使用SSR(字节时间和成本)。我们建议尝试增量静态生成或客户端提取,看看它们是否适合您的需要。https://vercel.com/blog/nextjs-server-side-rendering-vs-static-generation
但是在您需要的情况下,假设您需要某个服务器端API验证调用来验证查询参数。
useRouter第二个最简单的
useRouter
。当我第一次这样做的时候,我遇到了一个问题,当nextjs/react水合时,会有一个查询参数为空的点。幸运的是useRouter有isReady!中间件现在这是我个人的最爱,因为它以一种干净的方式分离了功能。我发现这是基于vercel的例子。我强烈建议阅读一堆这些来找到最佳实践。https://github.com/vercel/examples/
型
下面是一个repo,它对查询参数进行了一些很酷的过滤。这是一个更软的方法,而不是硬重定向。https://github.com/vercel/examples/tree/main/edge-functions/query-params-filter
Nico对此也有一个很好的答案,但我不建议像他的例子那样使用钩子,而是使用
isReady
. https://stackoverflow.com/a/58182678/4918639vwoqyblh5#
对于类组件爱好者
更好的方法是使用
this.props.router.events.on
方法监听routeChangeComplete
的专用事件,如果使用类component -,则在componentDidMount中监听该事件参考:https://nextjs.org/docs/api-reference/next/router#routerevents
路线变更完成:在路线完全更改时激发。
实际上,当
isReady
变为true
时,或者当router.query
对象具有数据时。iqih9akk6#
适用于NextJS版本-12.0.8
如果从页面导出名为getServerSideProps(服务器端呈现)的函数,则Next.js将使用getServerSideProps返回的数据在每次请求时预呈现此页面。
=异步函数
参考:https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props#getserversideprops
简单地把这个异步函数放在页面上就可以通知NextJS它的存在。在组件的预呈现阶段,路由器的查询对象将为空。
isReady:boolean -路由器字段是否在客户端更新并准备好使用。应该只在useEffect方法内部使用,而不是在服务器上有条件地呈现。
参考:https://nextjs.org/docs/api-reference/next/router
解决方案:
jgovgodb7#
我解决了我的问题,我需要它在特殊组件。我 Package 使用withRouter(withLocale(Comp))和创建条件在HOC中
r1zhe5dt8#
下一个. js〈= 10.0.5
这是一个很好的工作周围,我发现周围从这个评论
添加
useQuery.ts
帮助文件用法
sczxawaw9#
类组件|2022年12月16日|ReactJS 18.2.0|Next.js 13.0.6
对于那些想要使用类组件的人,我得到了答案。这实际上是无处可寻的!好好享受吧!
您将添加
if(this.props.router.isReady)
并将return
包含在render()
的条件中。