You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取自定义Hook中的重复函数实现复用?

解决方案

1. 保留公共函数定义(/common/tableUtils.ts)

你提取的公共函数没问题,它是一个纯函数,接收所有必要参数:

export function handleOnColumnSortChange(
    columnName: string,
    order: any,
    changeColumnSorting: any,
    filters: any,
    setFilters: (data: any) => void
) {
    changeColumnSorting?.(columnName, order);
    const newFilters = {
        ...filters,
        sorting: { [columnName]: order },
    };
    setFilters(newFilters);
}

2. 在自定义Hook中包装公共函数

在每个需要复用的Hook里,用useCallback把公共函数包装成表格要求的回调格式(只接收columnName和order),同时把Hook内部的依赖项绑定进去:

import { useState, useCallback } from 'react';
import { handleOnColumnSortChange as commonSortHandler } from '../common/tableUtils';

export function useMyHook({ changeColumnSorting }) {
    const [filters, setFilters] = useState();

    // 生成符合表格调用要求的回调
    const handleOnColumnSortChange = useCallback(
        (columnName: string, order: any) => {
            // 调用公共函数,传入所有必要参数
            commonSortHandler(columnName, order, changeColumnSorting, filters, setFilters);
        },
        [changeColumnSorting, filters, setFilters] // 依赖项变化时重新生成回调
    );

    return {
        sorting: filters?.sorting,
        filters,
        handleOnColumnSortChange
    };
}

3. 组件调用无需修改

之前的组件使用代码完全不用改,因为包装后的handleOnColumnSortChange和原函数签名一致,表格依然可以正常传入columnName和order:

const { handleOnColumnSortChange} = useMyHook({ changeColumnSorting });

<Table handleOnColumnSortChange={handleOnColumnSortChange} />

关键点说明

  • useCallback用于缓存回调函数,避免依赖项未变化时触发表格组件不必要的重渲染。
  • 公共函数是纯函数,不依赖外部上下文,只靠传入的参数工作,在多个Hook中复用不会产生副作用。
  • 后续要修改排序逻辑时,只需要调整公共文件里的函数,所有用到的Hook会同步更新。

内容的提问来源于stack exchange,提问作者Matexon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:45:29