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

使用Fetch API加载Tom-Select选项失败问题求助

问题排查与解决方案

一、选项无法显示的核心问题修复

你的代码存在几个关键错误,导致Tom-Select无法正常渲染选项,逐一修正如下:

1. 修正valueField配置

后端返回的字段仅包含icd_code和icd_name,但你配置的valueField: 'url'不存在,Tom-Select无法识别选项的唯一值,需改为:

valueField: 'icd_code', // 用icd_code作为选项的唯一标识字段

2. 修复渲染函数的参数缺失

render.option和render.item函数未接收当前选项的data参数,直接使用icd_name、icd_code会因变量未定义报错,同时item渲染的HTML存在语法缺失,修正后:

render: {
    option: function(data) {
        return `<div class="py-2 d-flex">
                    <div>
                        <div class="mb-1">
                            <span class="h4">${data.icd_name}</span>
                        </div>
                        <span class="h4">${data.icd_code}</span>
                    </div>
                </div>`;
    },
    item: function(data) {
        return `<div class="py-2 d-flex">
                    <div>
                        <div class="mb-1">
                            <span class="h4">${data.icd_name}</span>
                        </div>
                        <div class="description">${data.icd_code}</div>
                    </div>
                </div>`;
    }
},

3. 后端添加查询过滤逻辑

当前后端忽略前端传入的q查询参数,直接返回全部15527条数据,既不符合远程搜索逻辑,也会引发性能问题。修改后端代码,根据关键词过滤结果并限制返回条数:

public function getData(Request $request){
    $query = $request->input('q', '');
    $users = ICD10Code::project(["_id" => 0])
        ->where('icd_name', 'like', "%{$query}%")
        ->orWhere('icd_code', 'like', "%{$query}%")
        ->limit(50) // 限制单次返回条数,降低传输压力
        ->get(['icd_code','icd_name']);
    
    return response()->json($users->toArray()); // 使用Laravel原生JSON响应,更规范
}

二、性能优化示例的适用性

针对15527条的庞大数据集,Tom-Select的性能优化方案完全适用,主要优化措施如下:

  • 后端分页/限流:通过limit()限制单次返回条数,避免一次性传输大量数据,减少前端渲染压力。
  • 前端请求防抖:为load函数添加防抖逻辑,避免用户输入过程中频繁发起请求:
    function debounce(func, delay) {
        let timeoutId;
        return function(...args) {
            clearTimeout(timeoutId);
            timeoutId = setTimeout(() => func.apply(this, args), delay);
        };
    }
    
    load: debounce(function(query, callback) {
        var url = new_opd1 + '?q=' + encodeURIComponent(query); // 转义查询参数,避免特殊字符问题
        fetch(url)
            .then(response => response.json())
            .then(json => callback(json))
            .catch(() => callback());
    }, 300),
    
  • 启用结果缓存:在Tom-Select配置中添加cache: true,缓存已查询过的结果,重复输入相同关键词时直接复用缓存:
    cache: true,
    
  • 简化渲染结构:如果非必要,可将h4标签替换为更轻量的span,减少DOM节点数量,提升渲染速度。
  • 关闭冗余功能:若不需要选项动画,可配置animate: false,降低性能开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:50:24