You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为下拉菜单绑定CRUD功能:层级职位UI实现需求

嘿,刚好做过类似的职位层级联动需求,给你一套最简原生实现方案,不用折腾任何前端框架,直接就能对接你现有的Java CRUD接口:

核心思路

用原生HTML的<select>元素做层级联动,每一步选择完成后,调用你的Java接口获取下一级的可选数据,动态渲染到对应的下拉框中。这种方案零依赖、代码量少,完全符合“最简UI”的要求。

具体实现步骤

1. 基础页面结构(HTML)

先搭好下拉框的骨架,初始只激活第一个“职位”下拉,后面的类型、规格下拉默认禁用,等上一级选择后再解锁:

<div class="job-selector">
  <div>
    <label>选择职位:</label>
    <select id="jobSelect" onchange="onJobSelect()">
      <option value="">请选择职位</option>
    </select>
  </div>
  
  <div style="margin-top: 10px;">
    <label>选择职位类型:</label>
    <select id="typeSelect" disabled onchange="onTypeSelect()">
      <option value="">请先选择职位</option>
    </select>
  </div>
  
  <div style="margin-top: 10px;">
    <label>选择职位规格:</label>
    <select id="specSelect" disabled>
      <option value="">请先选择职位类型</option>
    </select>
  </div>
</div>

2. 联动逻辑(JavaScript)

写几个简单的函数,对接你的Java接口,实现数据拉取和下拉框渲染:

// 页面加载时先加载所有职位
window.onload = function() {
  loadJobs();
};

// 加载所有职位选项
function loadJobs() {
  // 调用你的Java getJob列表接口,这里假设是GET请求
  fetch('/api/jobs')
    .then(response => response.json())
    .then(jobs => {
      const jobSelect = document.getElementById('jobSelect');
      // 清空默认选项(保留提示)
      jobSelect.innerHTML = '<option value="">请选择职位</option>';
      // 循环添加职位选项
      jobs.forEach(job => {
        const option = document.createElement('option');
        option.value = job.id;
        option.textContent = job.name;
        jobSelect.appendChild(option);
      });
    })
    .catch(error => console.error('加载职位失败:', error));
}

// 职位选择后,加载对应职位类型
function onJobSelect() {
  const jobId = document.getElementById('jobSelect').value;
  const typeSelect = document.getElementById('typeSelect');
  
  if (!jobId) {
    // 未选择职位时,重置类型和规格下拉
    typeSelect.disabled = true;
    typeSelect.innerHTML = '<option value="">请先选择职位</option>';
    document.getElementById('specSelect').disabled = true;
    document.getElementById('specSelect').innerHTML = '<option value="">请先选择职位类型</option>';
    return;
  }
  
  // 调用你的Java接口,根据职位ID获取类型列表
  fetch(`/api/jobs/${jobId}/types`)
    .then(response => response.json())
    .then(types => {
      typeSelect.disabled = false;
      typeSelect.innerHTML = '<option value="">请选择职位类型</option>';
      types.forEach(type => {
        const option = document.createElement('option');
        option.value = type.id;
        option.textContent = type.name;
        typeSelect.appendChild(option);
      });
      // 重置规格下拉
      document.getElementById('specSelect').disabled = true;
      document.getElementById('specSelect').innerHTML = '<option value="">请先选择职位类型</option>';
    })
    .catch(error => console.error('加载职位类型失败:', error));
}

// 职位类型选择后,加载对应规格
function onTypeSelect() {
  const typeId = document.getElementById('typeSelect').value;
  const specSelect = document.getElementById('specSelect');
  
  if (!typeId) {
    specSelect.disabled = true;
    specSelect.innerHTML = '<option value="">请先选择职位类型</option>';
    return;
  }
  
  // 调用你的Java接口,根据类型ID获取规格列表
  fetch(`/api/job-types/${typeId}/specs`)
    .then(response => response.json())
    .then(specs => {
      specSelect.disabled = false;
      specSelect.innerHTML = '<option value="">请选择职位规格</option>';
      specs.forEach(spec => {
        const option = document.createElement('option');
        option.value = spec.id;
        option.textContent = spec.name;
        specSelect.appendChild(option);
      });
    })
    .catch(error => console.error('加载职位规格失败:', error));
}

3. 对接你的Java CRUD接口说明

你需要根据自己的实际接口调整以下几点:

  • 接口地址:把代码里的/api/jobs/api/jobs/${jobId}/types换成你实际的接口路径
  • 数据格式:确保接口返回的是JSON数组,每个元素包含id(作为选项值)和name(作为显示文本),如果你的字段名不同,比如是jobIdjobName,记得修改JS里的对应字段
  • 请求方式:如果你的接口是POST请求,需要调整fetch的参数,添加method: 'POST'和对应的请求体

4. 可选的极简优化(不增加复杂度的前提下)

  • 加载状态:可以在发起请求时给下拉框加个“加载中...”的临时选项
  • 空数据处理:如果某层级没有数据,显示<option value="">无可用选项</option>并保持禁用状态

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

火山引擎 最新活动