hook实现带有搜索功能的列表组件

Posted 前端e站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hook实现带有搜索功能的列表组件相关的知识,希望对你有一定的参考价值。

带有搜索功能的列表在我们前端开发过程中是经常遇到的,那么这篇文章就来学习一下用hook是怎么实现一个带有搜索框的列表组件。

拆分业务

拿到一个组件开始,首先要分析的就是组件所要包括的内容。

1. 查询动作( handleSearch 

2. 分页( fetchList 

3. 列表的所选id触发事件( rowSelection )

基本上这些业务是一个列表都有的功能,基于这些功能点做更多的扩展。

自定义hook代码


// ListHooks.js
import  useState, useEffect  from 'react';

export const usePageList = ( list, page, loading , api) => 
  // 注意useState的值顺序不能变,因为hook内部的值是用链表存储的,例如最好不要在外围加条件判断
  const [values, setValues] = useState();
  const [selectRowKeys, setSelectRowkeys] = useState([]);

  const handleSearch = values => 
    setValues(values);
  ;

  const fetch = (page = 1, pageSize = 10) => 
   // 为了封装性,这里直接用全局的dispatch
    window.g_app._store.dispatch(
      type: api,
      payload: 
        page,
        pageSize,
        ...values
      
    );
  ;
  // 根据values触发分页和选择调用函数方法
  useEffect(() => 
    fetch()
    setSelectRowkeys([])
  , [values]);
  
 // 搜索框的属性
  const searchProps = 
    handleSearch,
  ;
 
// 分页属性
  const tableProps = 
    dataSource: list,
    pagination: page,
    onChange: ( current, pageSize ) => fetch(current, pageSize),
    loading,
    rowSelection: 
      selectRowKeys,
      onChange: k => setSelectRowkeys(k),
    ,
  ;
  return 
    values,
    searchProps,
    tableProps,
    selectRowKeys,
  ;
;

基于此,一个带有搜索功能的hook组件就完成了。

使用场景


// xx/index.js 容器页面
import  usePageList  from 'hooks'; 
const FETCH_API =  'xxx/xxx';

// props其实可以干净点,只写list,page,loading就够用,
// 但为了以后拓展和少些点代码(还有懒)的原 因,直接一个大props完事
const Index = props => 
  // 由自定义hook返回几个属性,直接提供给相应子组件
  const  values, searchProps, tableProps, selectRowKeys  = usePageList(props, FETCH_API);
  return (
    <>
      <Card>
        <Searchgroup
          config=config
          ...searchProps
        />
      </Card>
      <Card>
        <Table
          columns=columns
          rowKey="xxxId"
          ...tableProps
        />
      </Card>
    </>
  );
;

export default connect(( test, loading ) => (
  list: test.list,
  page: test.page,
  loading: loading.effects[FETCH_API],
))(Index);

业务逻辑直接封装好,只需抽离出个性部分就就可以了,省去大量代码,同时还需要保留组建自身的可扩展性。

以上是关于hook实现带有搜索功能的列表组件的主要内容,如果未能解决你的问题,请参考以下文章

hook实现带有搜索功能的列表组件

谁有多选下拉列表含模糊搜索功能的js组件,谢谢

用React Hooks做一个搜索栏

React+hook+ts+ant design封装一个input和select搜索的组件

尝试用React写几个通用组件 - 带搜索功能的下拉列表,开关切换按钮,弹出框

基于Element UI select组件实现同时支持通过label和value过滤列表