前端分页+搜索常用写法记录


1. 定义基础数据

const defaultFilters = {
  Page: 0,
  NumberPerPage: 10,
};

const [loading, setLoading] = useState(false);
const [list, setList] = useState([]); // 存放原始数据
const [filteredList, setFilteredList] = useState([]);  // 存放过滤后的数据
const [totalCount, setTotalCount] = useState(0); // 存放当前显示的总条数
const [filter, setFilters] = useState(defaultFilters); // 过滤器:默认第一页,10 条显示

2. 获取原始数据

useEffect(() => {
  getList(defaultFilters);
}, []);

const getList = data => {
  setLoading(true);
  // Api.PostData 为你设置的ajax请求
  Api.PostData(data).then(res => {
    const currentList = res.Data || [];
    // 设置原始数据
    setList(currentList);
    // 执行初始化过滤
    searchList(filter, currentList);
    setLoading(false);
  }).catch(e => {
    setLoading(false);
    setErrorMessage(e.message || "获取数据失败")
  });
}

3. 搜索查询

const searchList = (values, currentList = list) => {
  if (values) {
    // 初次加载是 currentList,之后默认是原始数据 list
    const searchedList = (currentList || []).filter(item => {
      // TODO: 自定义的过滤规则
      if (values.BrevityCode && item.BrevityCode !== values.BrevityCode) {
        return false;
      }
      
      return true;
    });

    const currentFilter = {
      ...values,
    }

    // 搜索完后,设置总条数
    setTotalCount(searchedList.length);
    // 设置过滤器
    setFilters(currentFilter);
    // 开始执行分页
    setFilteredList(paginationList(searchedList, currentFilter));
  }
}

4. 分页查询

const paginationList = (list, currentFilter = filter) => {
  return list.slice(currentFilter.Page * currentFilter.NumberPerPage, currentFilter.Page * currentFilter.NumberPerPage + currentFilter.NumberPerPage);
};

如此,便完成了初始化列表展示:获取元数据 --> 按照默认搜索条件执行一次搜索 --> 记录搜索后的总条数(自然是元数据的总数)--> 对于搜索后的数据,按照默认条件分页

5. 执行分页

<!-- 为简单起见,只使用下一页和上一页,通过页码跳转的使用大同小异 -->
<div>共{totalCount}条</div> 
<button disabled={filter.Page === 0} onClick={() => handlePreviousPage()}>{"<<上一页"}</Button>
<button disabled={filteredList && filteredList.length < filter.NumberPerPage} onClick={() => handleNextPage()}>{"下一页>>"}</Button>

分页查询步骤:获取分页条件 --> 按照之前记录的搜索条件执行一次搜索 --> 记录搜索后的总条数--> 对于搜索后的数据,按照分页条件分页

6. 执行搜索

为简单起见,搜索的表单这里省略,只提供搜索表单的回调事件。

const onFilter = (values) => {
  searchList({ ...values, Page: 0, NumberPerPage: filter.NumberPerPage });
}

搜索查询步骤:获取搜索条件(回到第一页开始) --> 按照当前搜索条件执行一次搜索 --> 记录搜索后的总条数--> 对于搜索后的数据,按照之前记录的分页条件分页

7. 数据流向总结

getList() 获取元数据 --> list --> searchList() --> paginationList() --> filteredList

Was this page helpful?