elementui中的穿梭框实现单选以及联动

最近做的项目中用到了elementui中的穿梭框,要求老师和学生对应的关系是一对多,老师只能是单选的,并且如果选择了已设置的老师,需要在下面的学生的穿梭框中,同步显示该老师名下的学生信息,因为穿梭框默认是支持多选的,所以在原有基础上加以改造

效果图

代码

html代码

<!--设置实习生与导师关系-->
        <el-dialog
        title="XXX实习计划导师设置"
        :visible.sync="showModal"
        width="60%">
        <span>
            <div>
                <div class="transfertitle">选择要设置的指导老师</div>
                <el-transfer 
                v-model="value1" 
                :data="teacherdata" 
                :render-content="renderFunc" @left-check-change="checkTeacher($event)"
                @change="teaChange($event)"></el-transfer>
                <div class="transfertitle">选择要设置的学生</div>
                <el-transfer :render-content="renderFunc" v-model="stuvalue" :data="studata"></el-transfer>
            </div>
        </span>
        <span slot="footer" class="dialog-footer">
            <el-button @click="showModal = false">取 消</el-button>
            <el-button type="primary" @click="showModal = false">确 定</el-button>
        </span>
        </el-dialog>

数据格式

teacherdata: [//老师数据
            {
                key: 0,
                label: `老师 A`,
                setting:'已设置',
                stuset:[1,2],
                disabled:false
            },
            {
                key: 1,
                setting:'',
                label: `老师 B`,
                stuset:[],
                disabled:false
            },
            {
                key: 2,
                setting:'',
                label: `老师 C`,
                stuset:[],
                disabled:false
            },
            {
                key: 3,
                setting:'',
                label: `老师 D`,
                stuset:[],
                disabled:false
            }
        ],
        studata: [//学生数据
            {
                key: 1,
                label: `学生 A`,
                setting:'已设置',
                disabled:false
            },
            {
                key: 2,
                label: `学生 B`,
                setting:'已设置'
            }
        ],
        stuvalue:[],//选中的学生

 js方法

        checkTeacher(e){
            //当某个老师被选中时其他老师就无法被点击
            let len = this.teacherdata.length;
            if(e.length==0){
                for(let i = 0;i<len;i++){
                    this.teacherdata[i].disabled = false;
                }
            }else{
                for(let i = 0;i<len;i++){
                    this.teacherdata[i].disabled = true;
                }
                this.teacherdata[e[0]].disabled = false
            }
                
        },
        teaChange(e) {
            let len = this.teacherdata.length;
            if(e.length!=0){
                for(let i = 0;i<len;i++){
                    if(e[0]==i){
                        this.teacherdata[i].disabled = false
                        console.log(this.teacherdata[i].stuset)
                        this.stuvalue = this.teacherdata[i].stuset.length==0?[]:this.teacherdata[i].stuset
                    }else{
                        this.teacherdata[i].disabled = true
                    }
                     
                }
            }else{
               for(let i = 0;i<len;i++){
                    this.teacherdata[i].disabled = false
                    this.stuvalue = []
                } 
            }
        },

 

 

 

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
el-elementui穿梭transfer)组件,可以通过 `filterable` 属性来开启搜索功能,但是默认情况下是单选模式,无法进行多选。如果需要实现多选功能,可以通过自定义模板来实现。 具体步骤如下: 1. 在 `el-transfer` 组件,设置 `left-default-checked` 和 `right-default-checked` 属性为 `false`,禁用默认选状态。 2. 使用 `scoped-slot` 自定义左右两侧的模板,可以参考以下代码: ```html <template slot="left-footer"> <el-checkbox-group v-model="leftChecked"> <el-checkbox label="all" @change="handleLeftCheckAllChange">Check all</el-checkbox> </el-checkbox-group> </template> <template slot="right-footer"> <el-checkbox-group v-model="rightChecked"> <el-checkbox label="all" @change="handleRightCheckAllChange">Check all</el-checkbox> </el-checkbox-group> </template> <template slot="left-item" slot-scope="{ option }"> <el-checkbox :label="option.key" v-model="leftChecked" :disabled="option.disabled">{{ option.label }}</el-checkbox> </template> <template slot="right-item" slot-scope="{ option }"> <el-checkbox :label="option.key" v-model="rightChecked" :disabled="option.disabled">{{ option.label }}</el-checkbox> </template> ``` 3. 在 `data` 定义 `leftChecked` 和 `rightChecked` 数组,以及 `handleLeftCheckAllChange` 和 `handleRightCheckAllChange` 方法,用于实现全选/全不选的功能。 4. 在 `methods` 定义 `filterMethod` 方法,用于实现搜索功能的自定义过滤方法。 5. 在 `el-transfer` 组件,设置 `:filter-method="filterMethod"`,启用自定义过滤方法。 完整代码如下所示: ```html <template> <div> <el-transfer :data="data" :filterable="true" :filter-method="filterMethod" :left-default-checked="false" :right-default-checked="false"> <template slot="left-footer"> <el-checkbox-group v-model="leftChecked"> <el-checkbox label="all" @change="handleLeftCheckAllChange">Check all</el-checkbox> </el-checkbox-group> </template> <template slot="right-footer"> <el-checkbox-group v-model="rightChecked"> <el-checkbox label="all" @change="handleRightCheckAllChange">Check all</el-checkbox> </el-checkbox-group> </template> <template slot="left-item" slot-scope="{ option }"> <el-checkbox :label="option.key" v-model="leftChecked" :disabled="option.disabled">{{ option.label }}</el-checkbox> </template> <template slot="right-item" slot-scope="{ option }"> <el-checkbox :label="option.key" v-model="rightChecked" :disabled="option.disabled">{{ option.label }}</el-checkbox> </template> </el-transfer> </div> </template> <script> export default { data() { return { data: [ { key: '1', label: 'Option 1', disabled: false }, { key: '2', label: 'Option 2', disabled: false }, { key: '3', label: 'Option 3', disabled: false }, { key: '4', label: 'Option 4', disabled: false }, { key: '5', label: 'Option 5', disabled: false }, { key: '6', label: 'Option 6', disabled: false }, { key: '7', label: 'Option 7', disabled: false }, { key: '8', label: 'Option 8', disabled: false }, { key: '9', label: 'Option 9', disabled: false }, { key: '10', label: 'Option 10', disabled: false } ], leftChecked: [], rightChecked: [] }; }, methods: { filterMethod(query, option) { return option.label.indexOf(query) > -1; }, handleLeftCheckAllChange(checked) { if (checked) { this.leftChecked = this.data.map(item => item.key); } else { this.leftChecked = []; } }, handleRightCheckAllChange(checked) { if (checked) { this.rightChecked = this.data.map(item => item.key); } else { this.rightChecked = []; } } } }; </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值