前端:基于vue.draggable 拖拽列表实现,并获取下标及元素.

GIF.gif
由于公司有个需求,所以学习了这个插件.演示图下面是代码块

超性感标记语言.html
<template>
  <div class="Independent">
    <div class="groupbox">
      <div @drop="ondrop(item,index)" v-for="(item, index) in list" :key="index" class="listbox">
        <!-- 卡片头 -->
        <div class="topbar">{{item.name}}</div>

        <draggable element="span" v-model="item.list" v-bind="dragOptions" @add="onadd">
          <transition-group name="no" class="list-group" tag="div">
            <li
              class="list-group-item"
              @dragend="ondragend(item,index)"
              v-for="(element,indexs) in item.list"
              :key="indexs"
            >
              <div class="liitem">
                {{element.model}}
                <span class="badge">{{indexs}}</span>
              </div>
            </li>
          </transition-group>
        </draggable>
      </div>

      <!-- 新建卡片 -->
      <div class="listbox">
        <div class="topbar">
          <i class="el-icon-circle-plus-outline" @click="addcard"></i>新建卡片
        </div>
      </div>
    </div>
    <div class="groupbox">
      <!-- 双向绑定的数据 -->
      <div class="bangding">
        <!-- <div class="list-group col-md-3">
        <pre>{{listString}}</pre>
        </div>-->
        <div v-for="(item, index) in list" :key="index" class="listdata">
          <pre>{{list[index].list}}</pre>
        </div>
      </div>

      <!-- 新建卡片 -->
    </div>
  </div>
</template>

注入灵魂.js
Draggable为基于Sortable.js的vue组件,用以实现拖拽功能。

如果没有下载draggable 请在node.js
输入神秘车牌号npm i vuedraggable --save
不推荐全局引用,需要的时候注入灵魂就行了.import draggable from 'vuedraggable'

<script>
// 注入灵魂
import draggable from "vuedraggable";
import $ from "jquery";
import "bootstrap/dist/css/bootstrap.min.css";
import "bootstrap/dist/js/bootstrap.min.js";
import { log } from "util";
export default {
  props: {},
  data() {
    return {
      list: [
        {
          name: "火象星座",
          list: [
            {
              model: "双鱼座"
            },
            {
              model: "水瓶座"
            },

            {
              model: "摩羯座"
            },
            {
              model: "射手座"
            },
            {
              model: "天蝎座"
            }
          ]
        },
        {
          name: "土象星座",
          list: [
            {
              model: "金牛座"
            },
            {
              model: "双子座"
            },
            {
              model: "白羊座"
            },
            {
              model: "金牛座"
            },
            {
              model: "巨蟹座"
            },
            {
              model: "射手座"
            }
          ]
        },
        {
          name: "风象星座",
          list: [
            {
              model: "天秤座"
            },
            {
              model: "处女座"
            },
            {
              model: "狮子座"
            }
          ]
        },
        {
          name: "水象星座",
          list: []
        }
      ],
      // editable: true,//是否能滑动
      isDragging: false,
      delayedDragging: false,
      //拖出母元素的下标
      ondragendindex: "",
      //拖入母元素的下标
      ondropindex: "",
      //拖出子列表下标
      evtoldIndex: "",
      //拖出子列表下标
      evtnewIndex: ""
      //拖入子列表下标
    };
  },
  computed: {
    // 滑动卡片配置
    dragOptions() {
      return {
        animation: 0,
        sort: false,
        store: false,
        group: "description",
        disabled: false, //是否禁止滑动
        ghostClass: "ghost",
        dragClass: "dragClass",
        chosenClass: "dragClass"
      };
    }
  },
  created() {},
  mounted() {},
  watch: {
    isDragging(newValue) {
      if (newValue) {
        this.delayedDragging = true;
        return;
      }
      this.$nextTick(() => {
        this.delayedDragging = false;
      });
    }
  },
  methods: {
    addcard(){
      this.list.push({
          name: "新建的卡牌",
          list: []
        })
        console.log(this.list);
        
    },
    //用户完成母元素拖动后触发
    ondragend(item, index) {
      // console.log("```用户完成拖出后触发```");
      // console.log('开始拖动的元素'+item);
      console.log("拖出的母元素的下标" + index);
      this.ondragendindex = index;
      console.log(this.list[this.ondropindex].list[this.evtnewIndex].model);
    },
    //监听拖入母元素的下标
    ondrop(element, index) {
      // console.log("```用户完成拖入后触发```");
      console.log("拖入母元素的下标" + index);
      this.ondropindex = index;
    },
    // 监听滑动添加时
    onadd(evt) {
      var itemEl = evt.item; // dragged HTMLElement
      evt.to; // target list
      evt.from; // previous list
      evt.oldIndex; // tag's old index within old parent
      evt.newIndex; // tag's new index within new parent
      evt.clone; // the clone tag
      evt.pullMode; // when item is in another sortable: `"clone"` if cloning, `true` if moving
      console.log("移出子列表下标" + evt.oldIndex);
      console.log("拖入子列表下标" + evt.newIndex);
      this.evtoldIndex = evt.oldIndex;
      this.evtnewIndex = evt.newIndex;
    }
  },
  components: {
    draggable
  }
};
</script>
五颜六色.less
<style scoped lang="less">
.Independent {
  .groupbox {
    white-space: nowrap;
    overflow-x: auto;
    background-color: skyblue;

    width: 1800px;
    // height: 50vh;
    margin: 0 auto;
    .listbox {
      // margin: 0px 10px;
      overflow: hidden;
      display: inline-block;
      // border-left: 1px solid black;
      // border-bottom: 1px solid black;
      box-sizing: border-box;
      box-sizing: border-box;
      width: 300px;
      height: 400px;
      background-color: skyblue;
      .topbar {
        margin: 0px 10px;
        margin-right: 16px;
        background-color: white;
        text-align: center;
        border-bottom: 1px solid skyblue;
        box-sizing: border-box;
        height: 58px;
        line-height: 58px;
        color: #666666;
        border: 1px solid #ddd;
        border-top-left-radius: 4px;
        border-top-right-radius: 4px;
      }
      .list-group {
        overflow-y: scroll;
        border-top-left-radius: 0px;
        border-top-right-radius: 0px;
        padding: 10px;
        padding-right: 8px;
        padding-top: 0px;
        height: 320px;
        box-sizing: border-box;
        // border: #666666 1px solid;
      }
      .list-group-item {
        cursor: pointer;
        background-color: #f9f9fa;
        padding: 0px 10px;

        padding-top: 10px;
        // background-color: #fff;
        // border: 0px solid #ddd;
        border-bottom: 0px solid black;
        border-top: 0px;
        :hover {
          background-color: #666666;
        }
        .liitem {
          background-color: white;
          border: 1px solid #eaeaea;
          border-left: 5px salmon solid;
          box-sizing: border-box;
          padding: 10px;
        }
      }
      // 移动样式
      .flip-list-move {
        transition: transform 0.5s;
      }

      .no-move {
        transition: transform 0s;
      }

      .ghost {
        opacity: 0.7;
        // background: #cccccc;
      }
    }
    .listdata {
      overflow: hidden;
      display: inline-block;
      // border: 1px solid black;
      box-sizing: border-box;
      width: 300px;
      min-height: 400px;
      background-color: #f9f9fa;
    }
  }
  .bangding {
    margin-top: 10px;
    display: flex;
  }
}
</style>

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

推荐阅读更多精彩内容

  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,146评论 0 1
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    柴东啊阅读 15,852评论 2 140
  • vue的Draggable拖拽:https://github.com/SortableJS/Vue.Draggab...
    梧桐芊雨阅读 7,295评论 0 0
  • 临到睡了,住在外面的弟弟居然回来,因为一直住在外面,家里的床铺都没铺好,于是大晚上的,母亲坐在被窝里,指挥着父亲...
    不相问阅读 210评论 1 4
  • 你肯定还记得你的初恋,那个笑起来温暖如春的人。 那个在你最美好的时光,带给你欢笑与泪水的人。 就如同张爱玲说的: ...
    絮絮叨叨狸阅读 304评论 2 2