Reactjs 如果参数Next.JS不存在,如何重定向

Reactjs 如果参数Next.JS不存在,如何重定向,reactjs,next.js,next-router,Reactjs,Next.js,Next Router,我有一个页面可以有两个参数之一。电子邮件和散列如果没有,我想重定向用户 /confirm-email?email=user@email.com 我尝试了以下方法: const router = useRouter(); const { email, hash } = router.query; useEffect(() => { if (!email && !hash) { router.push('/'); } else if (hash) {

我有一个页面可以有两个参数之一。电子邮件和散列如果没有,我想重定向用户

/confirm-email?email=user@email.com
我尝试了以下方法:

const router = useRouter();
const { email, hash } = router.query;

useEffect(() => {
  if (!email && !hash) {
    router.push('/');
  } else if (hash) {
    // Do stuff
  }
}, [email, hash, router]);
但是第一次渲染时,这两个参数都是
未定义的
,即使存在哈希或电子邮件参数,用户也会被重定向

我怎样才能解决这个问题?有什么建议吗

if (hash)
看起来不必要

query:Object-解析为对象的查询字符串。如果页面没有数据获取要求,则在预呈现期间它将是一个空对象。默认为{}

引用自

我想这就是问题所在

参数将是Router.query中的文件名

例如:

import { useRouter } from 'next/router'

const Post = () => {
  const router = useRouter()
  const { pid } = router.query

  return <p>Post: {pid}</p>
}

export default Post
从“下一个/路由器”导入{useRouter}
const Post=()=>{
const router=useRouter()
const{pid}=router.query
返回Post:{pid}

} 导出默认帖子
对于pages/morepages/[pid].js中的文件[pid].js

或者, 要使用2个参数选项,您需要转到同时使用这两个选项的网站页面。所以它们之间必须有一个标签


比如“website/emial/hash”

在做了一些研究之后。我发现最好检查参数是否存在于
getServerSideProps()中


尝试使用类似useRef的东西,并将值保留在那里,这样在第一次渲染时就不会检查任何内容,然后再次检查。所以基本上是一种更新的钩子。如果需要进一步的帮助,我可以在回答部分写下。我们不需要使用REF,即使我认为路由参数将覆盖同名的查询参数。你能分享你的文件名吗,这样我们就可以知道问题出在哪里了?这就是我强调的问题。您需要使用方括号。然后使用route.query引用“key”,即方括号中文件中的名称,而不是url中的值。与中一样,因为您没有使用动态路由,所以route.query没有指向任何内容。如果我执行
confirm email/[somename].js
我如何知道该参数是电子邮件还是散列。我必须创建2个文件,然后。对吗?只有电子邮件或散列可用。两者不会同时出现。通过使用
/[email]/[hash].js
来提供hash,我必须执行
/user@email.com/散列
对吗?
export async function getServerSideProps({ query }) {
  if (!query.email && !query.hash) {
    return {
      notFound: true,
    };
  }

  return {
    props: {},
  };
}