多级select联动

本文介绍如何使用ReactJS和ES6实现多级联动选择效果。重点在于数据处理,通过定义一个对象,以优先级为key,存储过滤后的selectList。在onChange事件中调用筛选操作。代码实现中遇到的问题通过断点调试解决,更多详情可查看GitHub项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看如下题目:

给定的configList(初始化一配置的优先级默认数据) 和 selectList(下拉选择框的选项列表)
每次添加一个新的优先级选项,需要过滤掉前面所有已选的内容。

也是为了互斥,满足优先级的需求。(毕竟同一个选项,不可以同时存在多个优先级。)

所以,其实只要把初始化数据处理好,写好对应的方法,后续下拉列表 onChange 时,调用即可。

我的思路是:定义一个对象,把优先级,作为对象的key,过滤完已选值 剩余的 selectList 作为value。

obj = {
    1: selectList,
    2: selectList1,
    3: selectList2
}

类似上面这种,大致比较复杂的应该就是数据处理了。我的代码如下:

interface configProps {
  level: number;
  code: string;
}
interface selectListProps { // 这里替换下字段哈,和昨天的题目有些许差异,但问题不大
  code: string;
  codeCn: string;
}

export const dealConfig = (configList: configProps[], selectList: selectListProps[]) => {
  const selectObj: any = {};
  const selectNameArr: any = []; // 用来保存之前优先级已选的内容,用来过滤selectList
  configList.forEach((config: any) => {
    let level = config.level;
    if (level == 1) selectObj[level] = selectList;
    else selectObj[level] = addlevel(selectNameArr, selectList);
    // 把前面优先级的 选择项保存下来
    selectNameArr.push(config.code);
  });
  return selectObj;
};

// 过滤已选则的filedList
export function addlevel(selectNameArr: any, selectList: selectListProps[]) {
  let newselectList = [...selectList];
  // 过滤已选值,返回新的selectList
  newselectList = newselectList.filter((item: selectListProps, index: number) => {
    return selectNameArr.indexOf(item.code) == -1;
  });
  return newselectList;
}

核心的就这个筛选操作,其他的都比较简单。看下 selectCom 的简单抽离

    const SelectCom = (code: any, level: any) => {
      // fieldListObj 就是上面 dealConfig 方法的返回值
      const selectListArr = selectListObj[level];
      return (
        <Select
          defaultValue={code}
          onChange={(val) => selectListChange(val, level)}
          className="selectComponent"
        >
          {selectListArr?.map((item: any, index: number) => {
            return (
              <Option value={item.code} key={`${item.code}-${index}`}>
                {item.codeCn}
              </Option>
            );
          })}
        </Select>
      );
    };

其余操作就比较简单啦, 其余操作的源码,点击 阅读原文 就可以查看,在github的项目中~

原本思路也不是很清晰,只有大致方向,具体实现,也是在代码编写的过程中,落实了细节。遇到的个别问题,用断点调试的方式,找出问题,快速解决。

今天的技术分享到此结束~,欢迎交流你的思路和解法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值