当前位置:首页 > JavaScript

js实现多个表联动搜索

2026-03-01 21:49:29JavaScript

实现多个表联动搜索的方法

联动搜索通常涉及多个数据表之间的关联查询,通过JavaScript可以实现前端的数据过滤和联动效果。以下是几种常见的实现方式:

使用纯JavaScript实现

通过事件监听和数据过滤实现联动:

js实现多个表联动搜索

// 假设有三个下拉框:countrySelect, citySelect, districtSelect
const countryData = [
  {id: 1, name: '中国'},
  {id: 2, name: '美国'}
];

const cityData = [
  {id: 1, countryId: 1, name: '北京'},
  {id: 2, countryId: 1, name: '上海'},
  {id: 3, countryId: 2, name: '纽约'}
];

const districtData = [
  {id: 1, cityId: 1, name: '朝阳区'},
  {id: 2, cityId: 1, name: '海淀区'},
  {id: 3, cityId: 2, name: '浦东新区'}
];

// 初始化国家下拉框
countrySelect.innerHTML = countryData.map(c => `<option value="${c.id}">${c.name}</option>`).join('');

// 国家变化时更新城市
countrySelect.addEventListener('change', function() {
  const countryId = parseInt(this.value);
  const filteredCities = cityData.filter(city => city.countryId === countryId);

  citySelect.innerHTML = filteredCities.map(c => `<option value="${c.id}">${c.name}</option>`).join('');
  citySelect.dispatchEvent(new Event('change'));
});

// 城市变化时更新区县
citySelect.addEventListener('change', function() {
  const cityId = parseInt(this.value);
  const filteredDistricts = districtData.filter(district => district.cityId === cityId);

  districtSelect.innerHTML = filteredDistricts.map(d => `<option value="${d.id}">${d.name}</option>`).join('');
});

使用Vue.js实现联动

利用Vue的响应式特性可以更简洁地实现:

js实现多个表联动搜索

new Vue({
  el: '#app',
  data: {
    countries: [
      {id: 1, name: '中国'},
      {id: 2, name: '美国'}
    ],
    cities: [
      {id: 1, countryId: 1, name: '北京'},
      {id: 2, countryId: 1, name: '上海'},
      {id: 3, countryId: 2, name: '纽约'}
    ],
    districts: [
      {id: 1, cityId: 1, name: '朝阳区'},
      {id: 2, cityId: 1, name: '海淀区'},
      {id: 3, cityId: 2, name: '浦东新区'}
    ],
    selectedCountry: null,
    selectedCity: null
  },
  computed: {
    filteredCities() {
      return this.selectedCountry 
        ? this.cities.filter(c => c.countryId === this.selectedCountry)
        : [];
    },
    filteredDistricts() {
      return this.selectedCity
        ? this.districts.filter(d => d.cityId === this.selectedCity)
        : [];
    }
  }
});

使用React实现联动

React中可以通过状态管理实现类似效果:

function Cascader() {
  const [country, setCountry] = useState(null);
  const [city, setCity] = useState(null);

  const filteredCities = cityData.filter(c => c.countryId === country);
  const filteredDistricts = districtData.filter(d => d.cityId === city);

  return (
    <div>
      <select onChange={e => setCountry(Number(e.target.value))}>
        {countryData.map(c => <option value={c.id}>{c.name}</option>)}
      </select>

      <select onChange={e => setCity(Number(e.target.value))}>
        {filteredCities.map(c => <option value={c.id}>{c.name}</option>)}
      </select>

      <select>
        {filteredDistricts.map(d => <option value={d.id}>{d.name}</option>)}
      </select>
    </div>
  );
}

使用AJAX实现动态加载

对于大数据量,可以采用异步加载方式:

// 获取城市数据
function getCities(countryId) {
  return fetch(`/api/cities?countryId=${countryId}`)
    .then(res => res.json());
}

// 获取区县数据
function getDistricts(cityId) {
  return fetch(`/api/districts?cityId=${cityId}`)
    .then(res => res.json());
}

countrySelect.addEventListener('change', async function() {
  const cities = await getCities(this.value);
  citySelect.innerHTML = cities.map(c => `<option value="${c.id}">${c.name}</option>`).join('');
});

citySelect.addEventListener('change', async function() {
  const districts = await getDistricts(this.value);
  districtSelect.innerHTML = districts.map(d => `<option value="${d.id}">${d.name}</option>`).join('');
});

实现注意事项

  1. 数据关联要确保外键关系正确,避免出现无效关联
  2. 对于大数据量考虑分页或异步加载方案
  3. 清空下级选择时要触发相应的事件
  4. 可以添加默认选项如"请选择"提升用户体验
  5. 考虑添加加载状态指示器改善异步操作体验

以上方法可以根据具体项目需求和技术栈选择合适的实现方案。联动搜索的核心在于监听上级选择变化,然后根据选择值过滤下级数据。

标签: 多个js
分享给朋友:

相关文章

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…