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

实现选择客户名返回ID的端点及React滚动选择字段方案

技术实现方案:React客户选择滚动组件 + 后端接口

一、前端React实现

1. 核心组件逻辑

实现点击触发滚动选择面板,从后端拉取客户列表,选中后提交对应customer_id:

import { useState, useEffect } from 'react';

const CustomerSelector = () => {
  const [isPanelOpen, setIsPanelOpen] = useState(false);
  const [selectedCustomer, setSelectedCustomer] = useState(null);
  const [customerList, setCustomerList] = useState([]);

  // 初始化加载客户列表
  useEffect(() => {
    loadCustomerList();
  }, []);

  // 从后端获取客户数据
  const loadCustomerList = async () => {
    try {
      const response = await fetch('/api/customers');
      const data = await response.json();
      setCustomerList(data);
    } catch (error) {
      console.error('加载客户列表失败:', error);
    }
  };

  // 选中客户并提交ID到后端
  const handleSelectCustomer = async (customer) => {
    setSelectedCustomer(customer);
    setIsPanelOpen(false);
    
    try {
      await fetch('/api/submit-customer', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ customer_id: customer.id })
      });
    } catch (error) {
      console.error('提交客户ID失败:', error);
    }
  };

  return (
    <div className="customer-select-wrapper">
      {/* 触发字段 */}
      <div 
        className="select-trigger"
        onClick={() => setIsPanelOpen(!isPanelOpen)}
      >
        {selectedCustomer ? selectedCustomer.name : '点击选择客户'}
      </div>

      {/* 滚动选择面板 */}
      {isPanelOpen && (
        <div className="customer-scroll-panel">
          <div className="scrollable-list">
            {customerList.map(cust => (
              <div
                key={cust.id}
                className="customer-item"
                onClick={() => handleSelectCustomer(cust)}
              >
                {cust.name}
              </div>
            ))}
          </div>
        </div>
      )}
    </div>
  );
};

export default CustomerSelector;

2. 滚动样式实现

添加CSS实现滚动效果及基础样式(可匹配你的参考样式调整):

.customer-select-wrapper {
  position: relative;
  width: 280px;
}

.select-trigger {
  padding: 10px 14px;
  border: 1px solid #e0e0e0;
  border-radius: 6px;
  cursor: pointer;
  background: #fff;
}

.customer-scroll-panel {
  position: absolute;
  top: calc(100% + 4px);
  left: 0;
  right: 0;
  border: 1px solid #e0e0e0;
  border-radius: 6px;
  background: #fff;
  box-shadow: 0 2px 8px rgba(0,0,0,0.1);
  z-index: 99;
}

.scrollable-list {
  max-height: 220px;
  overflow-y: auto;
}

.customer-item {
  padding: 10px 14px;
  cursor: pointer;
}

.customer-item:hover {
  background-color: #f5f7fa;
}

二、后端接口实现(以Node.js/Express为例)

1. 获取客户列表接口

从customers表查询id和name字段返回给前端:

const express = require('express');
const router = express.Router();
const db = require('./database'); // 你的数据库连接实例

// GET /api/customers - 获取客户列表
router.get('/api/customers', async (req, res) => {
  try {
    const [rows] = await db.query('SELECT id, name FROM customers ORDER BY name');
    res.json(rows);
  } catch (err) {
    console.error('查询客户列表出错:', err);
    res.status(500).json({ error: '服务器内部错误' });
  }
});

2. 接收客户ID接口

将前端提交的customer_id写入关联业务表(根据你的ER图调整表名和逻辑):

// POST /api/submit-customer - 提交选中的客户ID
router.post('/api/submit-customer', async (req, res) => {
  const { customer_id } = req.body;
  
  if (!customer_id) {
    return res.status(400).json({ error: 'customer_id 不能为空' });
  }

  try {
    // 示例:写入业务关联表,替换为你的实际业务逻辑
    await db.query(
      'INSERT INTO your_business_table (customer_id) VALUES (?) ON DUPLICATE KEY UPDATE customer_id = ?',
      [customer_id, customer_id]
    );
    res.json({ success: true, message: '客户ID提交成功' });
  } catch (err) {
    console.error('提交客户ID出错:', err);
    res.status(500).json({ error: '服务器内部错误' });
  }
});

module.exports = router;

三、关键优化点

  • 数据校验:后端需额外校验customer_id是否存在于customers表,避免无效数据写入
  • 大数据量适配:客户列表超过100条时,改用虚拟滚动(如react-window)优化性能
  • 状态同步:若后端客户数据有更新,可添加前端刷新按钮或WebSocket实时同步
  • 样式定制:根据参考样式图调整滚动条、选中高亮等细节样式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:53:41