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自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 Vue.js
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
vue的hash值原理也是table切换实例代码
Dec 14 Vue.js
vue 递归组件的简单使用示例
Jan 14 Vue.js
详解实现vue的数据响应式原理
Jan 20 Vue.js
用vite搭建vue3应用的实现方法
Feb 22 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
关于vue中如何监听数组变化
Apr 28 Vue.js
vue3获取当前路由地址
Feb 18 Vue.js
浅谈Vue的computed计算属性
Mar 21 Vue.js
Axios代理配置及封装响应拦截处理方式
Apr 07 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 15 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 cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
php win下Socket方式发邮件类
2009/08/21 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
页面中body onload 和 window.onload 冲突的问题的解决
2009/07/01 Javascript
JS与框架页的操作代码
2010/01/17 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
D3.js封装文本实现自动换行和旋转平移等功能
2016/10/14 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
python 解决函数返回return的问题
2020/12/05 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
xml有哪些解析技术?区别是什么
2016/04/26 面试题
班组长安全生产职责
2013/12/16 职场文书
医药个人求职信范文
2014/01/29 职场文书
搞笑创意广告语
2014/03/17 职场文书
合作意向书模板
2014/03/31 职场文书
学校节能减排方案
2014/06/13 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
学校学期工作总结
2015/08/13 职场文书
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript