Update
It’s no longer necessary to prepend ? to search (as of ~September 2021):
import { createSearchParams, useNavigate } from "react-router-dom";
...
const navigate = useNavigate();
navigate({
pathname: "listing",
search: createSearchParams({
foo: "bar"
}).toString()
});
This isn’t quite as simplified as I’d like, but I think it’s the closest we can get currently. navigate does support passing in a search query string (not an object).
import { createSearchParams, useNavigate } from "react-router-dom";
...
const navigate = useNavigate();
navigate({
pathname: "listing",
search: `?${createSearchParams({
foo: "bar"
})}`
});
Source: https://github.com/ReactTraining/react-router/issues/7743#issuecomment-770296462