如何修复Next.js错误“取消渲染路线”?

kpbpu008  于 2023-02-12  发布在  其他
关注(0)|答案(1)|浏览(164)

我尝试链接到一个div id,但收到以下错误:Error: Cancel rendering route
这似乎是双重链接的问题。
我已经在[slug]中使用了useRouter to push,因为NextLink<a>不会导致map循环中的重新呈现,我使用map循环来呈现与asPath: /posts/post-id/the-slug匹配(endsWith)的内容

const router = useRouter();
  const { asPath } = useRouter();
  const {
    query: { id },
  } = useRouter();

  const handleHref = (link) => {
    router.push(link);
  };

这工作,链接到也重新渲染贴图循环的插件。

<ButtonLink
    onClick={() =>
      handleHref(
        `/posts/${id}/${String(item.slug).replace(/ /g, "-")}`
      )
    }
  >
    Example
  </ButtonLink>

现在,当尝试使用与useRouterNextLink相同的方法链接到div id /posts/post-id/the-slug#div-id时,我得到了错误。

<Link href={`#${String(sect.section).replace(/ /g, "-")}`} passHref>
    <a>
      <Text>Example</Text>
    </a>
  </Link>

  //or

  <ButtonLink
    onClick={() =>
      handleHref(`/posts/${id}/${String(
        item.slug
      ).replace(/ /g, "-")}#${String(
        sect.section
      ).replace(/ /g, "-")}`)
    }
  >
    Example
  </ButtonLink>

编辑:在第一次点击Map循环中的一个ButtonLink之后,我不能从其他ButtonLink推送新的散列。

<div>
  <ButtonLink
    onClick={() =>
      handleHref(`/posts/${id}/${String(item.slug).replace(/ /g, "-")}`)
    }
  >
    Example
  </ButtonLink>
    
  {posts.map((item) => {
    if (
      asPath.startsWith(
        `/posts/${id}/${String(item.slug).replace(/ /g, "-")}`
      )
    )
      return (
        <div key={item.id}>
          <div>
            {item.section.map((sect) => {
              <div key={sect.id}>
                <ButtonLink
                  onClick={() =>
                    handleHref(
                      `#${String(sect.section).replace(/ /g, "-")}`
                    )
                  }
                >
                  {sect.name}
                </ButtonLink>
              </div>;
            })}
          </div>
        </div>
      );
  })}
</div>
ql3eal8s

ql3eal8s1#

当我刚刚使用router.push({ hash: ... })时,我遇到了同样的问题,它看起来是随机的,所以我认为这是因为SSR和React组件didmount(useEffect)生命周期问题。我尝试这种方式可能对我有效:

const router = useRouter();
  router.isReady = true;

这篇文章可能会有所帮助:https://nextjs.org/docs/advanced-features/automatic-static-optimization
而且我不确定是否有更好的方法来设置isReady,请参阅:https://nextjs.org/docs/api-reference/next/router#router-object

相关问题