VUE使用draggable實現(xiàn)組件拖拽
本文實例為大家分享了draggable組件拖拽實例,供大家參考,具體內(nèi)容如下
實現(xiàn)步驟
1、導入draggable依賴
npm i -S vuedraggable
2、引入draggable
import draggable from "vuedraggable"
3、注冊draggable
components: { ? ? ?draggable ? },
4、使用draggable
html頁面
<div class="col-md-3"> ? ? ? <draggable ? ? ? ? class="list-group" ? ? ? ? tag="ul" ? ? ? ? :list="this.list" ? ? ? ? v-bind="dragOptions" ? ? ? ? :move="onMove" ? ? ? ? @start="isDragging = true" ? ? ? ? @end="isDragging = false" ? ? ? > ? ? ? ? <div ? ? ? ? ? class="list-group-item" ? ? ? ? ? v-for="(item, index) in this.list" ? ? ? ? ? :key="item.value" ? ? ? ? > ? ? ? ? ? <span class="badge">{{ index }}</span> ? ? ? ? ? <span class="lefttitle"> ? ? ? ? ? ? {{ item.name }} ? ? ? ? ? </span> ? ? ? ? </div> ? ? ? </draggable> </div>
定義屬性和list
data() { ? ? return { ? ? ? list: [ ? ? ? ? { ? ? ? ? ? name: "-姓名", ? ? ? ? ? value: "name", ? ? ? ? }, ? ? ? ? { ? ? ? ? ? name: "-性別", ? ? ? ? ? value: "sex", ? ? ? ? }, ? ? ? ? { ? ? ? ? ? name: "-年齡", ? ? ? ? ? value: "age", ? ? ? ? }, ? ? ? ? { ? ? ? ? ? name: "-地址", ? ? ? ? ? value: "address", ? ? ? ? }, ? ? ? ? { ? ? ? ? ? name: "-郵箱", ? ? ? ? ? value: "mailbox", ? ? ? ? }, ? ? ? ], ? ? ? editable: true, //決定是否可拖動,為false則組件不可拖動 ? ? ? isDragging: false, ? ? }; ? },
定義移動方法
methods: { ? ? ? onMove({ relatedContext, draggedContext }) { ? ? ? const relatedElement = relatedContext.element; ? ? ? const draggedElement = draggedContext.element; ? ? ? return ( ? ? ? ? (!relatedElement || !relatedElement.fixed) && !draggedElement.fixed ? ? ? ); ? ? }, ? },
5、完整VUE代碼
<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" />設(shè)置組件可拖拽</label ? ? ? ? ? > ? ? ? ? </div> ? ? ? </div> ? ? </div> ? ? ? <div class="col-md-3"> ? ? ? <draggable ? ? ? ? class="list-group" ? ? ? ? tag="ul" ? ? ? ? :list="this.list" ? ? ? ? v-bind="dragOptions" ? ? ? ? :move="onMove" ? ? ? ? @start="isDragging = true" ? ? ? ? @end="isDragging = false" ? ? ? > ? ? ? ? <div ? ? ? ? ? class="list-group-item" ? ? ? ? ? v-for="(item, index) in this.list" ? ? ? ? ? :key="item.value" ? ? ? ? > ? ? ? ? ? <span class="badge">{{ index }}</span> ? ? ? ? ? <span class="lefttitle"> ? ? ? ? ? ? {{ item.name }} ? ? ? ? ? </span> ? ? ? ? </div> ? ? ? </draggable> ? ? </div> ? ? ? <div class="list-group col-md-3"> ? ? ? <pre>{{ listString }}</pre> ? ? </div> ? </div> </template> ? <script> import draggable from "vuedraggable"; export default { ? components: { ? ? draggable, ? }, ? data() { ? ? return { ? ? ? list: [ ? ? ? ? { ? ? ? ? ? name: "-姓名", ? ? ? ? ? value: "name", ? ? ? ? }, ? ? ? ? { ? ? ? ? ? name: "-性別", ? ? ? ? ? value: "sex", ? ? ? ? }, ? ? ? ? { ? ? ? ? ? name: "-年齡", ? ? ? ? ? value: "age", ? ? ? ? }, ? ? ? ? { ? ? ? ? ? name: "-地址", ? ? ? ? ? value: "address", ? ? ? ? }, ? ? ? ? { ? ? ? ? ? name: "-郵箱", ? ? ? ? ? value: "mailbox", ? ? ? ? }, ? ? ? ], ? ? ? list2: [], ? ? ? editable: true, //決定是否可拖動,為false則組件不可拖動 ? ? ? isDragging: false, ? ? ? delayedDragging: false, ? ? }; ? }, ? methods: { ? ? ? onMove({ relatedContext, draggedContext }) { ? ? ? const relatedElement = relatedContext.element; ? ? ? const draggedElement = draggedContext.element; ? ? ? 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); ? ? }, ? }, ? watch: { ? ? isDragging(newValue) { ? ? ? if (newValue) { ? ? ? ? this.delayedDragging = true; ? ? ? ? return; ? ? ? } ? ? ? this.$nextTick(() => { ? ? ? ? this.delayedDragging = false; ? ? ? }); ? ? }, ? }, }; </script> ? <style> .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>
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于ElementUI el-table 鼠標滾動失靈的問題及解決辦法
這篇文章主要介紹了關(guān)于ElementUI el-table 鼠標滾動失靈的問題及解決辦法,本文給大家分享問題所在原因及解決方案,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08原生JS實現(xiàn)Vue transition fade過渡動畫效果示例
這篇文章主要為大家介紹了原生JS實現(xiàn)Vue transition fade過渡動畫效果示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06一篇看懂vuejs的狀態(tài)管理神器 vuex狀態(tài)管理模式
一篇看懂vuejs的狀態(tài)管理神器,Vuex一個專為Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04在vue-cli3.0 中使用預處理器 (Sass/Less/Stylus) 配置全局變量操作
這篇文章主要介紹了在vue-cli3.0 中使用預處理器 (Sass/Less/Stylus) 配置全局變量操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08