我创建了一个过滤器,当我点击确认按钮时会更改URL。
例如,当我点击第1页并在巴黎选择住宿类型为客栈时,URL如下所示。
http://localhost3000/findstay?page=1&per=10&place_type=guest_house&city=paris
现在我想要当 URL 发生变化时更改结果。假设我手动更改查询参数如下,筛选器也应该随之更改。
http://localhost3000/findstay?page=1&per=10&place_type=hotel&city=newYork
为了实现这一点,我在pages文件夹中创建了名为findstay的文件,并在components文件夹中创建了findstay-filter组件。
import React from "react";
import FindstayFilter from "@/components/findstay/findstay-filter";
interface IFindstayProps { };
const Findstay: React.FC<IFindstayProps> = () => {
return <FindstayFilter />;
};
export default Findstay;
所有的逻辑都写在FindstayFilter组件内部。
当FindstayFilter被渲染时,该代码会推送url。
useEffect(() => {
const { city, page, per, placeType } = query;
const _page = parseInt(page || 1 as any);
const _city = city || state.cityState; // paris
const _placeType = placeType || "";
router.push({
pathname: `/findstay`,
query: {
page: _page,
per: 10,
plage_type: _placeType,
city: _city,
}
}, undefined,
{ shallow: true })
const initialRender = {
page: _page,
placeType: _placeType,
city: _city,
}
searchAvailableBookingDays(initialRender).then(res => res.json().then(value => setData(value)));
}, []);
正如您所看到的,我使用了{shallow: true}选项,URL并不改变,只有查询参数发生了改变。然而,当我手动更改其中一个查询时(例如,city=paris -> city=newYork),组件会重新渲染,并重置在组件第一次渲染时推送的查询参数。
为什么浅层渲染选项没有起作用?
window.location.replaceState
。:) 完全忘记了这个问题在这里,否则也会加上的。 - roka