vue3+typeScript穿梭框的实现示例


Posted in Vue.js onDecember 29, 2020

前言

实现功能:模仿element穿梭框的简单功能
每周分享一个vue3+typeScript的小组件,我只想分享下自己的实现思路,楼主是个菜鸡前端,记录下实现过程,说不定对你有帮助。

效果展示

预览地址

github地址

vue3+typeScript穿梭框的实现示例

开发过程

思路:用两个数组分别记录左右框框里面的值,根据复选框选中状态来实现删除增加即可

html部分

<div class="shuttle">
  <!-- 左边列表 -->
  <div class="shuttle-box">
    <div class="shuttle-box-title">
      <div>列表一</div>
      <div class="index-num">{{itemLeft.length}}</div>
    </div>
    <div class="shuttle-box-list">
      <div class="shuttle-box-item" v-for="(vo,inx) in itemLeft" :key="inx">
        <input type="checkbox" :value="inx" v-model="checkLeft" :disabled="vo.disabled" /> {{vo.label}}
      </div>
    </div>
  </div>
  <!-- 左右操作按钮 -->
  <div class="shuttle-click">
    <span @click="goLeft">←</span>
    <span @click="goRight">→</span>
  </div>
  <!-- 右边列表 -->
  <div class="shuttle-box">
    <div class="shuttle-box-title">
      <div>列表二</div>
      <div class="index-num">{{itemRight.length}}</div>
    </div>
    <div class="shuttle-box-list">
      <div class="shuttle-box-item" v-for="(vo,inx) in itemRight" :key="inx">
        <input type="checkbox" :value="inx" v-model="checkRight" :disabled="vo.disabled" /> {{vo.label}}
      </div>
    </div>
  </div>
</div>

ts部分

<script lang="ts">
import {
  defineComponent,
  reactive,
  toRefs
} from 'vue'

export default defineComponent({
  setup() {

    const data = reactive({
      itemLeft: [{
        label: '列表1的第一条数据',
        disabled: true,
      }, {
        label: '列表1的第二条数据',
        disabled: false,
      }],
      itemRight: [{
        label: '列表2的第一条数据',
        disabled: false,
      }, {
        label: '列表2的第二条数据',
        disabled: false,
      }],
      checkLeft: [],
      checkRight: [],
      goLeft: () => {
        //数组排序
        data.checkRight.sort(data.sortIndex);
        data.checkRight.forEach((item) => {
          //将itemRight对应索引的数据移动到左边去
          data.itemLeft.push(data.itemRight[item]);
          //移除
          data.itemRight.splice(item, 1);
        });
        //清空
        data.checkLeft = [];
        data.checkRight = [];
      },
      goRight: () => {
        //数组排序
        data.checkLeft.sort(data.sortIndex);
        data.checkLeft.forEach((item) => {
          //将itemLeft对应索引的数据移动到右边去
          data.itemRight.push(data.itemLeft[item]);
          //移除
          data.itemLeft.splice(item, 1);
        });
        //清空
        data.checkLeft = [];
        data.checkRight = [];
      },
      //checkbox是绑定的是的数组的索引,所以checkbox的点击的顺序不同的话索引的顺序是不同的,这样删除有可能找不到会报错,排个序从大到小删除就可以
      //这个是排序参数
      sortIndex: (a, b) => {
        return b - a;
      }
    })
    return {
      ...toRefs(data),
    }
  }
})
</script>

css部分

.shuttle {
  width: 800px;
  padding: 50px 0;
  display: flex;
  justify-content: space-between;
  //整个穿梭框
  .shuttle-box {
    width: 300px;
    height: 500px;
    border: 1px solid #ddd;
    //标题
    .shuttle-box-title {
      background: #f5f7fa;
      padding: 0 20px;
      height: 40px;
      line-height: 40px;
      display: flex;
      justify-content: space-between;
      .index-num {
        color: #909399;
        font-size: 12px;
        font-weight: 400;
      }
    }
    //列表
    .shuttle-box-list {
      padding: 20px;
      //一个列表item
      .shuttle-box-item {
        line-height: 2.0;
      }
    }
  }
  //左右穿梭按钮
  .shuttle-click {
    padding-top: 60px;
    cursor: pointer;
    span {
      padding: 5px 10px;
      display: inline-block;
      background: #409eff;
      color: #ffffff;
      margin: 0 5px;
      text-align: center;
    }
  }
}

到此这篇关于vue3+typeScript穿梭框的实现示例的文章就介绍到这了,更多相关vue3+typeScript穿梭框内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
springboot+vue实现文件上传下载
Nov 17 Vue.js
vue3.0实现点击切换验证码(组件)及校验
Nov 18 Vue.js
vue3.0+vue-router+element-plus初实践
Dec 02 Vue.js
vuex Module将 store 分割成模块的操作
Dec 07 Vue.js
Vue组件简易模拟实现购物车
Dec 21 Vue.js
Vue仿百度搜索功能
Dec 28 Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
Vue看了就会的8个小技巧
Jan 21 Vue.js
Vue过滤器(filter)实现及应用场景详解
Jun 15 Vue.js
Vue3中toRef与toRefs的区别
Mar 24 Vue.js
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
vue实现省市区联动 element-china-area-data插件
Apr 22 Vue.js
Vue.extend 登录注册模态框的实现
Dec 29 #Vue.js
vue实现简易的双向数据绑定
Dec 29 #Vue.js
vue中配置scss全局变量的步骤
Dec 28 #Vue.js
为什么推荐使用JSX开发Vue3
Dec 28 #Vue.js
Vue仿百度搜索功能
Dec 28 #Vue.js
vue中watch的用法汇总
Dec 28 #Vue.js
浅析vue中的nextTick
Dec 28 #Vue.js
You might like
Discuz! Passport 通行证整合
2008/03/27 PHP
php日历制作代码分享
2014/01/20 PHP
PHP程序员的技术成长规划
2016/03/25 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
php精度计算的问题解析
2019/06/21 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
小程序转发探索示例
2019/02/19 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
VsCode与Node.js知识点详解
2019/09/05 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
python如何使用unittest测试接口
2018/04/04 Python
Python上下文管理器用法及实例解析
2019/11/11 Python
python 实现让字典的value 成为列表
2019/12/16 Python
python扫描线填充算法详解
2020/02/19 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
python利用faker库批量生成测试数据
2020/10/15 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
一些Unix笔试题和面试题
2012/09/25 面试题
上学迟到的检讨书
2014/01/11 职场文书
中级会计职业生涯规划范文
2014/01/16 职场文书
《我的信念》教学反思
2014/02/15 职场文书