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 相关文章推荐
解决vue页面刷新,数据丢失的问题
Nov 24 Vue.js
vue打开其他项目页面并传入数据详解
Nov 25 Vue.js
vue中利用three.js实现全景图的完整示例
Dec 07 Vue.js
vue实现图片裁剪后上传
Dec 16 Vue.js
vue element和nuxt的使用技巧分享
Jan 14 Vue.js
vue实现简易计算器功能
Jan 20 Vue.js
Vue实现摇一摇功能(兼容ios13.3以上)
Jan 26 Vue.js
vue脚手架项目创建步骤详解
Mar 02 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 Vue.js
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
vue实现简易音乐播放器
Aug 14 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
PHP中的串行化变量和序列化对象
2006/09/05 PHP
js下函数般调用正则的方法附代码
2008/06/22 PHP
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
JavaScript 动态生成方法的例子
2009/07/22 Javascript
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
vue和iview实现Scroll 数据无限滚动功能
2019/10/31 Javascript
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
Python的Django框架中settings文件的部署建议
2015/05/30 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
python三引号输出方法
2019/02/27 Python
python求最大值,不使用内置函数的实现方法
2019/07/09 Python
python实现图片中文字分割效果
2019/07/22 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
Django实现文件上传下载
2019/10/06 Python
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
《理想》教学反思
2014/02/17 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
保护环境的建议书
2014/03/12 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
2014年人事专员工作总结
2014/11/19 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
如何用python清洗文件中的数据
2021/06/18 Python
vue判断按钮是否可以点击
2022/04/09 Vue.js