14

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

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

我怎样才能实现它?

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

4

5 回答 5

33

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

const router = useRouter();

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

用于replace防止在历史记录中添加新的 URL 条目(否则只需使用push),并shallow: true允许您在不运行数据获取方法的情况下更改 URL。这将导致重新渲染,但不会刷新页面本身。

于 2021-01-07T11:53:53.530 回答
3

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

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

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


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

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

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

于 2021-03-16T05:59:32.607 回答
1

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

window.history.replaceState(null, '', '/about')
于 2021-01-07T06:55:24.513 回答
0

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

于 2021-01-07T05:22:28.113 回答
0

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

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"
};

于 2021-12-01T14:30:24.367 回答