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

如何基于变量或参数执行JavaScript回调函数(React场景)

问题场景

从Laravel后端传数据库列数组到React用来做表格表头,需要针对不同列调用对应的回调函数转换每行数据——比如把数据库里TinyInt类型的1/0转成"Yes"/"No"。现有回调定义和Row组件代码,要实现根据列名调用对应回调,还得让多个布尔列能复用同一个回调。

原回调代码:

const callbacks = {
    name: function(name) {
        console.log(name);
    },
    completed: function(name) {
        console.log(name);
    },
    created_at: function(name) {
        console.log(name);
    },
    updated_at: function(name) {
        console.log(name);
    },
};

原Row组件代码:

export default function Row({ can, buttons, row }) {
    return (
        <>
            {
                Object.keys(row).map((k, i) => {
                    if(k !== "id") { 
                        return ( <td key={ i } className="whitespace-nowrap p-4">{ row[k] }</td> )
                    }
                })
            }
            { buttons(can, row.id) }
        </>
    );
}

实现方案

1. 抽离通用回调,支持复用

先把布尔转换这种通用逻辑单独写成一个函数,然后在回调配置里让需要的列直接复用它,其他列保留自定义处理:

// 通用布尔值转换函数
const formatBoolean = (value) => {
  return value ? 'Yes' : 'No';
};

const callbacks = {
    name: (val) => val, // 不需要处理就直接返回原数据
    completed: formatBoolean, // 复用布尔转换
    is_active: formatBoolean, // 其他布尔列也用这个
    created_at: (date) => new Date(date).toLocaleDateString(), // 日期格式化示例
    updated_at: (date) => new Date(date).toLocaleString(),
};

2. 修改Row组件,动态调用回调

在渲染单元格的地方,先判断当前列有没有对应的回调,有就调用转换数据,没有就直接用原数据:

export default function Row({ can, buttons, row }) {
    return (
        <>
            {
                Object.keys(row).map((k, i) => {
                    if(k !== "id") { 
                        // 拿到当前列的转换函数,默认返回原数据
                        const formatFn = callbacks[k] || (val => val);
                        const formattedValue = formatFn(row[k]);
                        return ( 
                            <td key={ i } className="whitespace-nowrap p-4">
                                { formattedValue }
                            </td> 
                        )
                    }
                })
            }
            { buttons(can, row.id) }
        </>
    );
}

3. 可选:配合后端列数组更精准控制

如果后端传来的列数组和row的key不完全对应,或者只想渲染指定列,可以把后端的列数组作为props传给Row组件,遍历列数组而不是Object.keys(row):

// 假设props里有columns,是后端传来的列名数组比如['name', 'completed', 'created_at']
export default function Row({ can, buttons, row, columns }) {
    return (
        <>
            {
                columns.map((k, i) => {
                    const formatFn = callbacks[k] || (val => val);
                    const formattedValue = formatFn(row[k]);
                    return ( 
                        <td key={ i } className="whitespace-nowrap p-4">
                            { formattedValue }
                        </td> 
                    )
                })
            }
            { buttons(can, row.id) }
        </>
    );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:07:37