NextJS:动态路由器,路径名不显示路径,而是文件名-如何在路径中获得单词?

new9mtju  于 2022-11-23  发布在  其他
关注(0)|答案(5)|浏览(166)

我让这个例子尽可能简单,如果需要更多的信息来解决,我可以包括更多的代码
我在nextJS中使用动态路由。我的应用程序使用twitter-v2包,根据API输入到动态路由中的关键字从twitter中提取结果
我尝试使用router.pathname来创建页面上的一些属性,但它使用的是文件名而不是URL中的单词。
NextJS版本:Next 9.5.3
转译页面路径:/pages/[keywords].jsx
示例URL:

http://localhost:3000/kpop-heroes

示例寻呼功能:

import Router from 'next/router'

export default function Keywords() {
  const router = useRouter();

  const KEYWORDS = router.pathname
    .slice(1)
    .split('-')
    .join(' ');

  return (
   <div>Twitter reactions to <code>{KEYWORDS}</code></div>
  )
};

渲染:

我是不是误解了这个功能?有没有可能检索网址中的单词而不是文件名?
注意:我一直在使用window.location.href作为解决方法,但我的理解是访问window对象不是最佳的

oymdgrw7

oymdgrw71#

使用asPath属性。该属性返回浏览器中显示的路径(包括查询)。
https://nextjs.org/docs/api-reference/next/router#router-object

const router = useRouter();

router.asPath
xoefb8l8

xoefb8l82#

要获取两种情况下的正确URL,例如动态([slug])和固定路径:

const router = useRouter();

let relativeURL = "";

  const slug = router.query.slug;
  if (slug) {
    relativeURL = router.pathname.replace("[slug]", slug as string);
  } else {
    relativeURL = router.pathname;
  }
6fe3ivhb

6fe3ivhb3#

我只是使用了错误的方法-正确的方法是router.query
请考虑以下URL:

http://localhost:3000/test-keywords?query=params,%20strings,%20other%20things&anotherLevel=more%20stuff

记录由方法产生的对象:

const router = useRouter();
  console.log(router.query);

输出:

{
    anotherLevel: "more stuff"
    keywords: "test-keywords"
    query: "params, strings, other things"
  }

我一定是忽略了,文件上写得很清楚:https://nextjs.org/docs/routing/dynamic-routes
我想我还是把这个留着吧,免得别人也搞不清楚

hrysbysz

hrysbysz4#

我认为正确的方法是在特定的path(例如/twitter)下定义dynamic-routes
转译页面路径:

/pages/twitter/[keywords].jsx

示例URL:

http://localhost:3000/twitter/kpop-heroes

在url的第一级定义动态路由是不合理的。

beq87vna

beq87vna5#

这对我很有效

import { useRouter } from "next/router";

...

const router = useRouter();
const path = router.asPath.split("?")[0]; // (remove query string and use asPath since dynamic slug was rendering as "[slug]" using pathname)

...

const navigationList = (
    <MenuList>
      {links.map((item) => {    
        return (
          <MenuItem
            key={item.id}
            disabled={path == item.href}
            sx={{
              m: 0,
              p: 0,
              ...(path == item.href && {
                borderBottom: `1px solid ${theme.palette.primary.light}`,
                backgroundColor: theme.palette.primary.dark,
              }),
            }}
          >
            <StyledLink href={item.href}>{item.label}</StyledLink>
          </MenuItem>
        );
      })}
    </MenuList>
  );

相关问题