当前位置:首页 > JavaScript

js实现多个表联动搜索

2026-03-01 21:49:29JavaScript

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

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

使用纯JavaScript实现

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

// 假设有三个下拉框: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的响应式特性可以更简洁地实现:

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实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…