VUE 项目手写穿梭框

44 篇文章 0 订阅
24 篇文章 0 订阅

项目用到了穿梭框这个功能,刚开始用 Element-UI 组件库来写,没有达到预期的效果,于是就自己手撸写了一个;

先看效果:

代码附上:

    <!-- 绑定设备弹窗 -->
    <el-dialog title="绑定定位触发器" :visible.sync="jobsBoundPopup" width="30%" center>
      <!-- 穿梭框 -->
      <div class="row">
        <!--左侧-->
        <div class="col-xs-5 col-sm-5">
          <div class="panel panel-success">
            <!--标题-->
            <div class="panel-heading">
              <div class="panel-title">
                未绑定
                <!-- <span>2</span> -->
              </div>
            </div>
            <!--内容-->
            <div class="panel-body panel-height">
              <ul>
                <li v-for="(data1,index) in data_left" :key="index" @click="information(data1)">
                  <input :value="index" type="checkbox" />
                  {{data1.deviceName}}
                </li>
              </ul>
            </div>
          </div>
        </div>
        <!--中间-->
        <div class="col-xs-2 col-sm-2 transfer">
          <div class="transfer-table">
            <div class="transfer-cell el-icon-arrow-left" @click="left_move()"></div>
            <div class="transfer-cell el-icon-arrow-right" @click="right_move()"></div>
          </div>
        </div>
        <!--右侧-->
        <div class="col-xs-5 col-sm-5">
          <div class="panel panel-success">
            <!--标题-->
            <div class="panel-heading">
              <div class="panel-title">
                已绑定
                <!-- <span>2</span> -->
              </div>
            </div>
            <!--内容-->
            <div class="panel-body panel-height">
              <ul>
                <li v-for="(data2,index2) in data_right" :key="index2" @click="informations(data2)">
                  <input :value="index2" type="checkbox" />
                  {{data2.deviceName}}
                </li>
              </ul>
            </div>
          </div>
        </div>
      </div>
      <!-- <span slot="footer" class="dialog-footer">
        <el-button @click="jobsBoundPopup = false">取 消</el-button>
        <el-button type="primary" @click="jobsBoundPopupSubmit">确 定</el-button>
      </span>-->
    </el-dialog>

<script>
export default {
    data() {
        return {
              // 绑定设备
              data_left: [],
              data_right: [],
              beaconId: 0,
              sysId: 0,
              cancelBeaconId: 0, 
        }
    }
    methods:{
         // 绑定设备
    boundPopup(row) {
      console.log(row);
      this.jobsBoundPopup = true;
      this.unBound();
      this.attendanceFrom.options.sysAttendanceId = row.sysAttendanceId;
      this.sysId = row.sysAttendanceId;
      this.bound();
    },
    // 未绑定信标列表
    unBound() {
      this.$http.put("/api/noBind/KQ/list").then((res) => {
        if (res.data.status == 200) {
          this.data_left = res.data.data;
        } else {
          this.$message.error(res.data.message);
        }
      });
    },
    // 已绑定信标列表
    bound() {
      this.$http.put("/api/beacon/list", this.attendanceFrom).then((res) => {
        if (res.data.status == 200) {
          console.log(res.data.data.data);
          this.data_right = res.data.data.data;
        } else {
          this.$message.error(res.data.message);
        }
      });
    },
    information(x) {
      console.log(x);
      this.beaconId = x.beaconId;
    },
    right_move() {
      if (this.data_right.length > 0) {
        this.$message.warning("绑定中已经有数据了");
      } else {
        this.$http
          .post(`/api/bindInfo/setKQ/${this.beaconId}/${this.sysId}`)
          .then((res) => {
            if (res.data.status == 200) {
              this.bound();
              this.unBound();
              this.getRoleList();
              this.$message.success("成功");
              this.jobsBoundPopup = false;
            } else {
              this.$message.error(res.data.message);
            }
          });
      }
    },
    // 取消
    informations(u) {
      console.log(u);
      this.cancelBeaconId = u.beaconId;
    },
    left_move() {
      this.$http
        .post(`/api/bindInfo/cancelKQ/${this.cancelBeaconId}`)
        .then((res) => {
          if (res.data.status == 200) {
            this.getRoleList();
            this.bound();
            this.unBound();
            this.$message.success("成功");
            this.jobsBoundPopup = false;
          } else {
            this.$message.error(res.data.message);
          }
        });
    },
    }
}
</script>

如果大佬有其他简单的方法,欢迎私信滴滴。。。

小demo:

直接贴代码:

<template>
  <div id="my">
    <div class="container">
      <div class="row">
        <!--左侧-->
        <div class="col-xs-5 col-sm-5">
          <div class="panel panel-success">
            <!--标题-->
            <div class="panel-heading">
              <h3 class="panel-title">列表1<span>2</span></h3>
            </div>
            <!--内容-->
            <div class="panel-body panel-height">
              <ul>
                <li v-for="(data1, index) in data_left" :key="index">
                  <input
                    :value="index"
                    type="checkbox"
                    v-model="check_val_left"
                  />
                  {{ data1.name }}
                </li>
              </ul>
            </div>
          </div>
        </div>
        <!--中间-->
        <div class="col-xs-2 col-sm-2 transfer">
          <div class="transfer-table">
            <a class="transfer-cell" @click="left_move()">>></a>
            <a class="transfer-cell" @click="right_move()"><<</a>
          </div>
        </div>
        <!--右侧-->
        <div class="col-xs-5 col-sm-5">
          <div class="panel panel-success">
            <!--标题-->
            <div class="panel-heading">
              <h3 class="panel-title">列表2 <span>2</span></h3>
            </div>
            <!--内容-->
            <div class="panel-body panel-height">
              <ul>
                <li v-for="(data2, index2) in data_right" :key="index2">
                  <input
                    :value="index2"
                    type="checkbox"
                    v-model="check_val_right"
                  />
                  {{ data2.name }}
                </li>
              </ul>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
function sortNumber(a, b) {
  return b - a;
}
export default {
  data() {
    return {
      data_left: [
        { id: 1, name: "北京" },
        { id: 2, name: "上海" },
        { id: 3, name: "深圳" },
      ],
      data_right: [
        { id: 11, name: "重庆" },
        { id: 12, name: "成都" },
        { id: 13, name: "贵州" },
      ],
      check_val_left: [],
      check_val_right: [],
    };
  },
  methods: {
    left_move: function () {
      //要把这个数组排序
      this.check_val_left.sort(sortNumber);
      this.check_val_left.forEach((item, index, array) => {
        //执行代码
        //console.log(item);
        //将data_left对应索引的数据移动到右边去
        this.data_right.push(this.data_left[item]);
        //console.log(this.data_left);
        this.data_left.splice(item, 1);
      });
      //忘记把这个数组置空了
      this.check_val_left = [];
    },
    right_move: function () {
      //console.log(this.check_val_right);
      this.check_val_right.sort(sortNumber);
      this.check_val_right.forEach((item, index, array) => {
        //执行代码
        //console.log(item);
        //将data_left对应索引的数据移动到右边去
        this.data_left.push(this.data_right[item]);
        //console.log(this.data_left);
        this.data_right.splice(item, 1);
      });
      this.check_val_right = [];
    },
  },
};
</script>
<style scoped>
.row {
  display: flex;
  justify-content: space-between;
}
.panel {
  width: 200px;
  height: 300px;
  border: 1px solid #edf0f6;
  box-sizing: border-box;
  border-radius: 5px;
}
.panel-heading {
  height: 40px;
  line-height: 40px;
  padding: 0 10px;
  border-bottom: 1px solid #edf0f6;
  background-color: #f5f7fa;
}
.transfer-cell {
  width: 56px;
  height: 40px;
  color: #fff;
  text-align: center;
  line-height: 40px;
  background: #66b1ff;
  border-radius: 5px;
  margin-bottom: 10px;
  font-size: 30px;
}
.transfer-table {
  margin-top: 100px;
}
li {
  list-style: none;
  line-height: 23px;
  margin-left: 5px;
}
.transfer-cell:hover {
  cursor: pointer;
}
.col-xs-2 {
  width: 100px;
  text-align: center;
}
.panel-body {
  height: 257px;
  overflow: auto;
}
.searchPerson {
  border: 1px solid #e0e0e0;
  margin-left: 5px;
  height: 20px;
  padding: 0 5px;
  border-radius: 5px;
  outline: none;
}
</style>

 

 

 

 

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值