使用antd中Transfer穿梭框实现小组成员的增删

穿梭框左边栏为未分组的学生,右边栏为该小组学生, 选择左边学生移进右边即为添加学生到该组,右边移入左边即为从组中删除学生(可以选择多个学生进行操作)

实现的效果如下:

穿梭框使用

首先要对得到的数据进行处理,使得mockData中的数据为未分组的学生和该小组下已有的学生,targetKeys为mockData中已分组学生的key,从而保证穿梭框中显示的结果为左边为未分组的学生,右边为该该小组下的学生。(具体的数据处理过程以实际数据为准)

getMock = () => {
    const { ClassManagementModel: { studentData, divisionMember }, DataId } = this.props;
    console.log(DataId);  // 所点击小组划分下的数据
    console.log(divisionMember); // 该划分下所有小组已经分组的成员
    const targetKeys = [];
    const mockData = [];

    // divisionMember中去除DataId对应的数据
    const filteredMember = divisionMember.filter(name => !DataId.userList.some(item => item.username === name));
    console.log(filteredMember);

    // 去掉filteredMember中的名字
    const filteredStudentList = Object.values(studentData.list)
      .filter(student => !filteredMember.includes(student.realName));

    console.log(filteredStudentList);

    filteredStudentList.forEach((student, index) => {
      console.log(student);
      student.key =index.toString()
      mockData.push(student)
      if (DataId.userList.some(item => item.username === student.realName)) {
        targetKeys.push(student.key);
      }
    });

    console.log(mockData);
    console.log(targetKeys);
    this.setState({
      mockData,
      targetKeys,
    });
  };
  filterOption = (inputValue, option) => option.realName.indexOf(inputValue) > -1;

  handleChange = (nextTargetKeys, direction, moveKeys) => {
    console.log('targetKeys: ', nextTargetKeys);
    console.log('direction: ', direction);
    console.log('moveKeys: ', moveKeys);
    this.setState({
      targetKeys: nextTargetKeys ,
      direction:direction,
      moveKeys:moveKeys
    });
  };

  handleSearch = (dir, value) => {
    console.log('search:', dir, value);
  };

 点击提交时,根据direction的方向来得到是添加还是删除学生,然后调用对应的接口

  handleMockSubmit=()=>{
    const {dispatch, DataId,groupId, pagination} = this.props;
    const { direction, moveKeys,mockData } = this.state;
    console.log(direction, moveKeys);
    const selectedData = mockData.filter(item => moveKeys.includes(item.key));
    console.log(selectedData);
    console.log();
    switch (direction){
      case 'left':  // 删除学生
        console.log(1111);
        dispatch({
          type: 'ClassManagementModel/delDivisionMember',
          payload: {
            data: {
              groupId:groupId,
              selectedData
            },
            pagination
          }
        })
        break;

      case 'right':  // 添加学生
        console.log(2222);
        dispatch({
          type: 'ClassManagementModel/addDivisionMember',
          payload: {
            data: {
              divisionId:DataId.divisionId,
              groupId:groupId,
              selectedData
            },
            pagination
          }
        })
        break;

      default:
        break;

    }
  }

 调用此组件:

<Transfer
   listStyle={{
     width: 250,
     height: 300,
   }}
   dataSource={mockData}
   showSearch
   filterOption={this.filterOption}
   targetKeys={targetKeys}
   onChange={this.handleChange}
   onSearch={this.handleSearch}
   render={item => item.realName}
/>

 API属性如下:

参数

说明

类型

默认值

dataSource

数据源,其中的数据将会被渲染到左边一栏中,targetKeys 中指定的除外。

TransferItem[]

[]

filterOption

收 inputValue option 两个参数,当 option 符合筛选条件时,应返回 true,反之则返回 false

(inputValue, option): boolean

targetKeys

显示在右侧框数据的 key 集合

string[]

[]

listStyle

两个穿梭框的自定义样式

object|({direction: 'left'|'right'}) => object

onChange

选项在两栏之间转移时的回调函数

(targetKeys, direction, moveKeys): void

onSearch

搜索框内容时改变时的回调函数

(direction: 'left'|'right', value: string): void

-

render

每行数据渲染函数,该函数的入参为 dataSource 中的项,返回值为 ReactElement。或者返回一个普通对象,其中 label 字段为 ReactElement,value 字段为 title

(record) => ReactNode

direction

渲染列表的方向

'left' | 'right'

showSearch

是否显示搜索框

boolean

false

参考文档:

antd官网

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值