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.js桌面端自定义滚动条组件之美化滚动条VScroll
Dec 01 Vue.js
在vue中使用inheritAttrs实现组件的扩展性介绍
Dec 07 Vue.js
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
vue-router懒加载的3种方式汇总
Feb 28 Vue.js
vue前端工程的搭建
Mar 31 Vue.js
Vue如何实现组件间通信
May 15 Vue.js
vue实现锚点定位功能
Jun 29 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
解决vue中provide inject的响应式监听
Apr 19 Vue.js
vue el-table实现递归嵌套的示例代码
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怎样调用MSSQL的存储过程
2006/10/09 PHP
php上传图片类及用法示例
2016/05/11 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
jQuery 一个图片切换的插件
2011/10/09 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
学习使用bootstrap的modal和carousel
2016/12/09 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
使用jQuery实现掷骰子游戏
2019/10/24 jQuery
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
Python编程中的文件读写及相关的文件对象方法讲解
2016/01/19 Python
使用Mixin设计模式进行Python编程的方法讲解
2016/06/21 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
python安装scipy的方法步骤
2019/06/26 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
python里反向传播算法详解
2020/11/22 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
小区门卫管理制度
2014/01/29 职场文书
采购部经理岗位职责
2014/02/10 职场文书
学校节能减排倡议书
2014/05/16 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
酒店辞职书范文
2015/02/26 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
小学见习报告
2015/06/23 职场文书
运动会通讯稿600字
2015/07/20 职场文书
一文弄懂MySQL索引创建原则
2022/02/28 MySQL
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python