vue项目中使用vuedraggable

安装 

npm install vuedraggable

 

<template>
  <div class="fluid container">
    <div class="form-group form-group-lg panel panel-default">
      <div class="panel-heading">
        <h3 class="panel-title">拖拽组件</h3>
      </div>
      <div class="panel-body">
        <div class="checkbox">
          <label><input type="checkbox" v-model="editable">启用拖拽</label>
        </div>
        <button type="button" class="btn btn-default" @click="orderList">恢复初始排序</button>
      </div>
    </div>
	<div class="box">
		<div class="groupBox">
			<div class="col-md-3">
				<!-- 拖拽元素盒子 -->
			  <draggable class="list-group" element="ul" v-model="list" :options="dragOptions" :move="onMove" @start="isDragging=true" @end="isDragging=false">
				<transition-group type="transition" :name="'flip-list'">
				  <li class="list-group-item licommon" v-for="element in list" :key="element.order">
					<i :class="element.fixed? 'fa fa-anchor' : 'glyphicon glyphicon-pushpin'" @click=" element.fixed=! element.fixed" aria-hidden="true"></i>
					{{element.name}}
					<span class="badge">{{element.order}}</span>
				  </li>
				</transition-group>
			  </draggable>
			</div>
		 </div>
		 <div class="groupBox">
			 <div class="col-md-3">
				 <!-- 目标元素盒子 -->
			   <draggable element="span" v-model="list2" :options="dragOptions" :move="onMove">
				 <transition-group name="no" class="list-group targetUl" tag="ul">
				   <li class="list-group-item" v-for="element in list2" :key="element.order">
					 <i :class="element.fixed? 'fa fa-anchor' : 'glyphicon glyphicon-pushpin'" @click=" element.fixed=! element.fixed" aria-hidden="true"></i>
					 {{element.name}}
					 <span class="badge">{{element.order}}</span>
				   </li>
				 </transition-group>
			   </draggable>
			 </div>
		 </div>
	</div>
    <div class="arr">
		<!-- 拖拽数组 -->
		<div class="list-group col-md-3 arrcommon">
		  <pre>{{listString}}</pre>
		</div>
		<!-- 目标数组 -->
		<div class="list-group col-md-3 arrcommon">
		  <pre>{{list2String}}</pre>
		</div>
	</div>
  </div>
</template>

<script>
import draggable from "vuedraggable";
const message = [
  "詹姆斯",
  "杜兰特",
  "科比",
  "乔丹"
];

export default {
  name: "hello",
  components: {
    draggable
  },
  data() {
    return {
      list: message.map((name, index) => {
        return { name, order: index + 1, fixed: false };
      }),
      list2: [],
      editable: true,
      isDragging: false,
      delayedDragging: false
    };
  },
  methods: {
	 // 恢复初始排序,已经有拖拽到右边时无法恢复
    orderList() {
      this.list = this.list.sort((one, two) => {
        return one.order - two.order;
      });
    },
    onMove({ relatedContext, draggedContext }) {
	  // 关联元素
      const relatedElement = relatedContext.element;
	  // 拖拽元素
      const draggedElement = draggedContext.element;
	  console.log('拖拽1', relatedElement)
	  console.log('拖拽2', draggedElement)
      return (
        (!relatedElement || !relatedElement.fixed) && !draggedElement.fixed
      );
    }
  },
  computed: {
	 // 配置项
    dragOptions() {
      return {
        animation: 0,
        group: "description",
        disabled: !this.editable,
        ghostClass: "ghost"
      };
    },
    listString() {
      return JSON.stringify(this.list, null, 2);
    },
    list2String() {
      return JSON.stringify(this.list2, null, 2);
    }
  },
  watch: {
    isDragging(newValue) {
      if (newValue) {
        this.delayedDragging = true;
        return;
      }
      this.$nextTick(() => {
        this.delayedDragging = false;
      });
    }
  }
};
</script>

<style>
.box{
	display:flex;
}
.arr{
	display:flex;
}
.arr .arrcommon{
	width:50%;
	border:1px solid red;
}
.targetUl{
	display:flex;
}
.groupBox{
	border:1px solid #00FFFF;
	width:50%;
}
.groupBox li{
	list-style: none;
	height:30px;
	border:1px solid #eeeeee;
}
.flip-list-move {
  transition: transform 0.5s;
}

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

.ghost {
  opacity: 0.5;
  background: #c8ebfb;
}

.list-group {
  min-height: 20px;
}

.list-group-item {
  cursor: move;
}

.list-group-item i {
  cursor: pointer;
}
</style>

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue 3是一种流行的JavaScript框架,用于构建用户界面。Vuedraggable是一个基于Vue的拖放库,用于实现可拖动和排序的列表。下面是安装vuedraggable使用的步骤: 1. 首先,确保你已经安装了Vue 3。你可以通过以下命令来安装Vue CLI并创建一个新的Vue项目: ``` npm install -g @vue/cli vue create my-project ``` 2. 进入到项目目录,并安装vuedraggable。你可以通过以下命令来安装: ``` cd my-project npm install vuedraggable ``` 3. 在你的Vue组件引入vuedraggable。在需要使用拖放功能的组件,添加以下代码: ```javascript import draggable from 'vuedraggable'; export default { components: { draggable, }, // ... } ``` 4. 在模板使用vuedraggable。在你的模板使用`draggable`标签来包裹需要拖放的元素,如下所示: ```html <template> <div> <draggable v-model="list"> <div v-for="item in list" :key="item.id">{{ item.name }}</div> </draggable> </div> </template> ``` 在上面的例子,`list`是一个数组,用于存储拖放元素的数据。通过`v-model`指令将`list`与`draggable`组件进行绑定。 5. 在你的Vue组件定义`list`数组。在你的Vue组件,定义一个`list`数组,并初始化一些数据,如下所示: ```javascript export default { data() { return { list: [ { id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }, { id: 3, name: 'Item 3' }, ], }; }, // ... } ``` 这样,你就可以在你的Vue应用使用vuedraggable来实现拖放和排序的列表了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值