Vue拖拽組件列表實現(xiàn)動態(tài)頁面配置功能
需求描述
最近在做一個后臺系統(tǒng),有一個功能產(chǎn)品需求是頁面分為左右兩部分,通過右邊的組件列表來動態(tài)配置左邊的頁面視圖,并且左邊由組件拼裝起來的視圖,可以實現(xiàn)上下拖拽改變順序,也可以刪除。
根據(jù)這個需求我做了下面這個demo。
功能分解
- 右邊的組件列表,可以通過拖拽克隆到左邊,拖拽結(jié)束后右邊組件列表數(shù)量不會減少
- 左邊的組件可以展開或收起
- 左邊的組件可以上下拖拽,刪除,但不可向右邊拖拽
- 左邊組件拖拽過程中不改變其展開和收起狀態(tài)
demo截圖

代碼地址
vue-draggable-list
代碼預(yù)覽
<template>
<div class="row">
<div class="col-5">
<h3>組件配置頁面展示</h3>
<draggable
tag="el-collapse"
class="dragArea list-group"
:list="list2"
group="comp"
@change="log"
>
<el-collapse
class="list-group-item left"
v-for="(element,index) in list2"
:key="index"
v-model="activeNames"
@change="handleChange"
>
<el-collapse-item :name="element.id">
<template slot="title">
<span>{{element.name}}</span>
<i class="el-icon-circle-close" @click.stop="deleteItem(index)"></i>
</template>
<div>{{ element.content }}</div>
</el-collapse-item>
</el-collapse>
</draggable>
</div>
<div class="col-5">
<h3>可用組件列表</h3>
<draggable
class="dragArea list-group"
:list="list1"
:group="{ name: 'comp', pull: 'clone', put: false }"
@change="log"
>
<div class="list-group-item" v-for="element in list1" :key="element.id">{{ element.name }}</div>
</draggable>
</div>
</div>
</template>
<script>
import draggable from "vuedraggable";
export default {
name: "clone",
display: "Clone",
order: 2,
components: {
draggable
},
data() {
return {
list1: [
{ name: "組件1", id: 1, content: "內(nèi)容內(nèi)容內(nèi)容。。。。" },
{ name: "組件2", id: 2, content: "內(nèi)容內(nèi)容內(nèi)容。。。。" },
{ name: "組件3", id: 3, content: "內(nèi)容內(nèi)容內(nèi)容。。。。" },
{ name: "組件4", id: 4, content: "內(nèi)容內(nèi)容內(nèi)容。。。。" },
{ name: "組件5", id: 5, content: "內(nèi)容內(nèi)容內(nèi)容。。。。" },
{ name: "組件6", id: 6, content: "內(nèi)容內(nèi)容內(nèi)容。。。。" },
{ name: "組件7", id: 7, content: "內(nèi)容內(nèi)容內(nèi)容。。。。" }
],
list2: [],
activeNames: [],
count: 0
};
},
methods: {
log: function(evt) {
console.log(evt);
if (evt.added) {
this.count += 1;
const item = evt.added.element;
const idx = this.list2.findIndex(e => e.id === item.id);
let temp = JSON.parse(JSON.stringify(this.list2));
temp[idx].id = this.count;
this.list2 = temp;
}
},
handleChange: function() {},
deleteItem: function(index) {
this.list2.splice(index, 1);
}
}
};
</script>
總結(jié)
以上所述是小編給大家介紹的Vue拖拽組件列表實現(xiàn)動態(tài)頁面配置功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
- Vue 可拖拽組件Vue Smooth DnD的使用詳解
- vue拖拽組件 vuedraggable API options實現(xiàn)盒子之間相互拖拽排序
- vue拖拽組件使用方法詳解
- Vue拖拽組件開發(fā)實例詳解
- vue 實現(xiàn)拖拽動態(tài)生成組件的需求
- vue使用Split封裝通用拖拽滑動分隔面板組件
- vue開發(fā)拖拽進度條滑動組件
- vue draggable resizable 實現(xiàn)可拖拽縮放的組件功能
- 利用Vue-draggable組件實現(xiàn)Vue項目中表格內(nèi)容的拖拽排序
- Vue組件Draggable實現(xiàn)拖拽功能
- Vue實現(xiàn)可拖拽組件的方法
相關(guān)文章
vite2打包的時候vendor-xxx.js文件過大的解決方法
vite2是一個非常好用的工具,只是隨著代碼的增多,打包的時候?vendor-xxxxxx.js?文件也越來越大,本文主要介紹了vite2打包的時候vendor-xxx.js文件過大的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
Vue.js設(shè)計與實現(xiàn)無限遞歸學(xué)習(xí)總結(jié)
這篇文章主要為大家介紹了Vue.js設(shè)計與實現(xiàn)無限遞歸學(xué)習(xí)總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
vue項目使用高德地圖時報錯:AMap?is?not?defined解決辦法
這篇文章主要給大家介紹了關(guān)于vue項目使用高德地圖時報錯:AMap?is?not?defined的解決辦法,"AMap is not defined"是一個錯誤提示,意思是在代碼中沒有找到定義的AMap,需要的朋友可以參考下2023-12-12

