当前位置: 首页 > 知识库问答 >
问题:

将选定筛选器与URL参数同步

胡曾笑
2023-03-14

我正在构建一个简单的实体分页列表,支持使用ReactJS的动态过滤器。数据是在react查询库的帮助下从RESTful API层获取的。它在服务器上进行分页和筛选。所选过滤器需要存储在URL的查询参数中,以便在刷新页面时恢复。我正在努力寻找最干净的方法,将过滤器的状态与当前URL同步。我不想引入其他依赖项,如React Router,但我已经在应用程序中使用了redux。但是,我不想在redux存储中复制URL状态。

组件结构及其道具如下所示(为便于提问而简化):

过滤器

此组件在UI中呈现过滤器,这些过滤器随dropDownFilters prop提供。它支持对每个过滤器进行多选。它需要以下道具:

selectedFiltersIds: { [k: string]: string[] };
setSelectedFiltersIds: (selected: { [k: string]: string[] }) => void;
dropdownFilters: FilterDropdownType[];

带有两个预选过滤器的selectedFiltersIds示例:

{
 locations: [1,4,5],
 zones: [3,2]
}

另一个组件List获取列表数据:

export const List: React.FC = ({ selectedFiltersIds }) => {
  const listData = useListData(page, { ...selectedFiltersIds });
  return <>{listData.data.items.map((i, index) => (
      <div key={i.id}>
        <Card {...i} />
      </div>
    ))}</>
}

列表父项:

const ListParent: React.FC = () => {
  const filtersData = useFilters();
  
  const dropdownFilters = useMemo(() => {
      return filtersData?.data?.groups
        .map((f: any) => ({
          ...f,
          items: f.items.map((i: any) => ({ name: i.name, val: i })),
        }));
  }, [brandFiltersData]);
  
  const [selectedFiltersIds, setSelectedFiltersIds] = useState<{
    [k: string]: string[];
  }>({}); // this needs to be synchronized with the query params in the browser's URL
  
  if (filtersData.isLoading) {
    return <LoadingScreen />;
  }
  
  return (
    <main>
      <FilterBar
        selectedFiltersIds={selectedFiltersIds}
        setSelectedFiltersIds={setSelectedFiltersIds}
        dropdownFilters={dropdownFilters}
      />
      <List selectedFiltersIds={selectedFiltersIds} />
    </main>
  );
};

export default ListParent;

我不知道什么是最好的方法来移动选择的筛选器从ListP的内部状态,并使其与URL状态同步。我不想为这个特殊的案件保留两个真相来源。

共有1个答案

司马同
2023-03-14

似乎UseQueryParams库提供了一种简单而干净的方法来解决这个问题。它支持查询参数的双向绑定,而不需要React路由器(例如repo)或redux。

 类似资料:
  • 我看不到任何关于何时应该使用查询或过滤器或两者结合的描述。他们之间有什么区别?谁能解释一下吗?

  • 如果我的配置发生了变化,我不会期望任何筛选器会被命中。 编辑:我正在使用Spring Security 2

  • 我正在使用JSF2.2,并配置了servlet过滤器。过滤器中工作的部分代码: 如果我添加第二个param-常规请求可以工作(发生重定向并看到两个param),但AJAX请求不能工作(没有重定向,什么也不发生)。以下是Firebug报告: 这是如何造成的,我们如何在filter中为AJAX调用设置多个参数?

  • 有什么建议吗?

  • 筛选器。 Usage 全部引入 import { Picker } from 'beeshell'; 按需引入 import Picker from 'beeshell/dist/components/Picker'; Examples Code import { Picker } from 'beeshell'; <Picker ref={(c) => { this._pick