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 相关文章推荐
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
vue使用过滤器格式化日期
Jan 20 Vue.js
Vue仿Bibibili首页的问题
Jan 21 Vue.js
学习 Vue.js 遇到的那些坑
Feb 02 Vue.js
vue 数据双向绑定的实现方法
Mar 04 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
Vue-Element-Admin集成自己的接口实现登录跳转
Jun 23 Vue.js
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
详解Vue router路由
Nov 20 Vue.js
vue中this.$http.post()跨域和请求参数丢失的解决
Apr 08 Vue.js
vue+elementUI实现表格列的显示与隐藏
Apr 13 Vue.js
vue postcss-px2rem 自适应布局
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制作静态网站的模板框架
2006/10/09 PHP
php 设计模式之 工厂模式
2008/12/19 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
javascript+canvas制作九宫格小程序
2014/12/28 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
详解js获取video任意时间的画面截图
2019/04/17 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
Python 面试中 8 个必考问题
2018/11/16 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
Python检测数据类型的方法总结
2019/05/20 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
Python实现FTP文件传输的实例
2019/07/07 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
关爱女孩行动实施方案
2014/03/13 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
后天观后感
2015/06/08 职场文书
Python pandas之求和运算和非空值个数统计
2021/08/07 Python