Electron+Vue3+TypeScript+Vite +Vue.Draggable 完成事务拖动

原文地址:https://www.webxiu.com.cn/post/10005245

前言

[图片上传失败...(image-9665ed-1652694715737)]

有了简单的框架,下面来点实际业务相关的操作吧,集成 Vue.Draggable,将每一项任务拖拽任务到每个分类吧。

Vue.Draggable 已经提供了一些完美的示例,

[图片上传失败...(image-4cb1c4-1652694715737)]

这是 Vue.Draggable 官方提供的示例,https://sortablejs.github.io/vue.draggable.next/#/two-lists

是不是正是我们要的呢?

集成 Vue.Draggable

安装

npm install vue-draggable-next
//or
yarn add vue-draggable-next

为什么是vue-draggable-next?主要是官方的 Vue.Draggable 在我们现有的项目上有兼容问题,所以选择了它。当然不影响效果使用。

使用

新建compontents/group/group-list.vue,主要用来写每个分组拖拽控件的。

<template>
  <draggable class="list-group" 
    :list="todolist" 
    :move="onMoveCallback"
    v-bind="dragOptions"
    @change="log"
    @start="isDragging = true"
    @end="isDragging = false"
    group="people">
    <transition-group type="transition" name="flip-list">
      <div
        class="list-group-item"
        v-for="element in todolist"
        :key="element.id"
      >
        {{ element.title }}
      </div>
    </transition-group>
  </draggable>
</template>

<script>
import { VueDraggableNext } from 'vue-draggable-next'

export default {
  components: {
    draggable: VueDraggableNext
  },
  props: {
    todolist: {
      type: [Array],
      default: () => []
    },
  },
  computed: {
    dragOptions() { // 拖拽动画效果
      return {
        animation: 0,
        group: 'description',
        disabled: false,
        ghostClass: 'ghost',
      }
    },
  },
  data(){
    return {
    }
  },
  methods: {
    log: function(evt) {
      window.console.log(evt);
    },
    onMoveCallback (evt, originalEvent) {
      console.log(evt)
      // this.currentTask = evt.draggedContext.element
      // this.current = +evt.to.dataset.index
    }
  }
}
</script>

<style lang="scss">
.list-group{
  height: calc(100% - 30px);
  padding: 0 10px;
  overflow-y: auto;
}
// 拖拽动画效果
.flip-list-move {
  transition: transform 0.5s;
}
.no-move {
  transition: transform 0s;
}
.ghost {
  opacity: 0.5;
  background: #c8ebfb;
}
</style>

group="people",主要是用来组与组直接可以相互拖动,如果不加是不可以的,只能组内排序。

transition-group,是用来组内拖动动画的。

components/c-main.vue中引入group-list.vue组件,并定义好每个分组的默认数据

import groupList from './group/group-list.vue'
let group = [{
  title: '待处理',
  todolist: [{
    title: '首页搜索样式bug',
    describe: ''
  }, {
    title: '同事管理搜索结果错误',
    describe: ''
  }, {
    title: '同事管理搜索没有结果时样式错误',
    describe: ''
  }]
}, {
  title: '处理中',
  todolist: [{
    title: '个人中心头像默认为微信头像',
    describe: ''
  }]
}, {
  title: '待发布',
  todolist: [{
    title: '全局默认图片替换',
    describe: ''
  }, {
    title: '购物车没有校验库存',
    describe: ''
  }]
}, {
  title: '已发布',
  todolist: []
}, {
  title: '已完成',
  todolist: []
}, {
  title: '待观察',
  todolist: []
}]
<div class="main">
  <div class="main-group">
    <div class="group" v-for="(item, index) in group" :key="index">
      <div class="group-title">{{ item.title }}</div>
      <group-list :todolist="item.todolist"></group-list>
    </div>
  </div>
</div>

[图片上传失败...(image-d40e64-1652694715737)]

功能好像没有实现,拖动无效

初步推测应该是事项数据是通过父组件传值进去导致的,子组件拖动后,父组件重新渲染了老数据,导致又初始化了数据。

我们先在子组件里面写死数据试试。

compontents/group/group-list.vue 中,去掉父组件传值的 todolist ,先在 data 里面定义好数据。

props: {
  // todolist: {
  //   type: [Array],
  //   default: () => []
  // },
},
data(){
  return {
    todolist: [{
      id: 1,
      title: '首页搜索样式bug',
      describe: ''
    }, {
      id: 2,
      title: '同事管理搜索结果错误',
      describe: ''
    }, {
      id: 3,
      title: '同事管理搜索没有结果时样式错误',
      describe: ''
    }]
  }
}

[图片上传失败...(image-b2246a-1652694715737)]

经过测试,发现ok,对于这个问题我们怎么解决呢?

我想的解决方案是,我们数据最终会通过接口,然后通过 vuex ,来渲染数据,这样我们每次拖动,直接修改 vuex,来解决父子组件之间的通讯。数据最终也会入库,所以拖动结果发生改变时,我们也将操作数据库。

结语

本章节就到这里了,下一章节,我们的数据将放入 vuex 状态树,解决上面的拖动问题,并且,完成个人事务处理,数据存放到 localStorage,然后打包一个可以使用的exe包,供个人使用。

本项目将持续更新,希望你也持续关注。

项目地址

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容