NEXT JS - 如何删除查询参数?

IT技术 reactjs next.js next-router
2021-04-17 05:16:04

如何在不刷新 Next JS (React) 中的页面的情况下删除或更新查询参数?

  1. 用户在 URL 上 /about?login=success&something=yes
  2. 单击按钮并?login=success&something=yes从 URL 中删除而不刷新页面。单击按钮后的 URL 将是/about

我怎样才能实现它?

正如在这个线程中提到的,我知道可以使用路由器删除查询参数或查询字符串。但是,useLocation并且useHistory在 上不可用next/router

5个回答

您可以使用next/router删除或更新 URL 中的查询参数。

const router = useRouter();

router.replace('/about', undefined, { shallow: true });

使用replace以防止增加新的网址进入历史(否则只是使用push),并shallow: true允许您更改URL而不运行数据获取方法这将导致重新渲染,但不会刷新页面本身。

我之前尝试过这个解决方案,但它会触发页面刷新😢
2021-06-07 05:16:04

我对类似问题的解决方案是这样的:

push(`${asPath.split('?')[0]}?comp=${id}`);

或者如果你想有可重用的功能:


function delQuery(asPath) {
  return asPath.split('?')[0]
}

...
const {push, asPath} = useRouter()

push(`${delQuery(asPath)}?comp=${id}`);

Nextjs 具有useRouter钩子,可用于以编程方式更改 url。 链接到文档

是的,我知道 useRouter 😃 但是我应该更改哪个值?如何?
2021-06-19 05:16:04

根据History,您可以使用history.replaceState来实现这一点。

window.history.replaceState(null, '', '/about')
我向你推荐,使用 useRouter : router.replace('/about', undefined, {shallow: true })
2021-05-31 05:16:04
是的,这个解决方案有效。谢谢,我也补充一下if (typeof window !== "undefined") { window.history.replaceState(null, '', '/about') }
2021-06-14 05:16:04
抱歉,但这不是我推荐的解决方案
2021-06-15 05:16:04
此解决方案有效,但会导致后退按钮出现问题。
2021-06-16 05:16:04
我试过这个解决方案,url更改被恢复
2021-06-21 05:16:04

如果您想从查询中删除单个或多个参数,

const router = useRouter();

/**
 * If removeList is empty, the function removes all params from url.
 * @param {*} router 
 * @param {*} removeList 
 */
const removeQueryParamsFromRouter = (router, removeList = []) => {
    if (removeList.length > 0) {
        removeList.forEach((param) => delete router.query[param]);
    } else {
        // Remove all
        Object.keys(object).forEach((param) => delete object[param]);
    }
    router.replace(
        {
            pathname: router.pathname,
            query: router.query
        },
        undefined,
        /**
         * Do not refresh the page
         */
        { shallow: true }
    );
};

const anyFunction = () => {
    // "/about?firstParam=5&secondParam=10"
    removeQueryParamsFromRouter(router, ['myParam']);
    // "/about?secondParam=10"
};