精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Vue3問題:如何實現組件拖拽實時預覽功能?

開發 前端
實現一個CMS內容管理系統,在后臺進行內容編輯,在官網更新展示內容。關于后臺的編輯功能,大致分為兩部分:組件拖拽預覽、組件內容編輯實時預覽。

本文主要內容分三部分,第一部分是需求分析,第二部分是實現步驟,第三部分是問題詳解。

如果您只需要解決問題,請閱讀第一、二部分即可。

如果您有更多時間,進一步學習問題相關知識點,請閱讀至第三部分。

1、需求分析

實現一個CMS內容管理系統,在后臺進行內容編輯,在官網更新展示內容。

關于后臺的編輯功能,大致分為兩部分:組件拖拽預覽、組件內容編輯實時預覽。

對于組件拖拽預覽,用戶可以在含有各種功能組件的列表中,選擇需要的組件進行拖拽。將組件拖拽到預覽畫布中后,可以在畫布中預覽組件的內容。

對于組件內容編輯實時預覽,用戶可以點擊編輯按鈕,顯示對應組件的內容編輯信息。當修改組件內容時,在畫布中可以實時預覽組件的變化。

2、實現步驟

(1)關于拖拽組件庫的選擇

關于拖拽組件庫,在github上有很多,最熱門的當屬vuedraggable這個庫。

它基于Sortable.js,擁有完整的中文文檔,所以很多朋友在做拖拽功能時,都會優先考慮它。

但是,我在使用的過程中,在組件拖拽、取消組件拖拽這里,遇到了一些小問題。不知道是我操作的問題,還是庫本身存在BUG,所以最終沒有選用它。

于是我發現了,一個更加好用的拖拽庫vue-draggable-next。

它的出現是參考了vuedraggable這個庫,所以說很多用法很相似,但是使用起來較之更加友善。總結為一個詞,自由。

下面我們的拖拽功能實現,就是利用了vue-draggable-next這個庫。

如果你對拖拽底層原理感興趣,并且有空余時間,勞請閱至第三部分拖拽原理總結。

(2)拖拽功能代碼實例

模版和邏輯中代碼都分為了三部分:組件列表、預覽畫布、內容編輯。

布局時,樣式根據需求自定義,此處只是提供了功能的基本邏輯實現。

使用時,關于拖拽組件的需求,根據文檔中提供的屬性和事件的描述,靈活配置完善。

vue-draggable-next庫文檔地址:https://github.com/anish2690/vue-draggable-next。

安裝依賴:

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

模板代碼:

<template>
<div style="display: flex;cursor: pointer;">
<!-- 組件列表 左側 -->
<div style="width:30vw;padding:30px;height:300px;border: 1px solid #000;text-align: center">
<h1>組件列表</h1>
<VueDraggableNext :list="componentNameList" :group="{ name: 'people', pull: 'clone', put: false }" :sort="false">
<div v-for="element in componentNameList" :key="element.name">
<div style="padding: 10px;background: #ccc;margin-bottom: 10px">
<el-button> {{ element.name }}</el-button>
</div>
</div>
</VueDraggableNext>
</div>

<!-- 預覽畫布 中間 -->
<div style="width:30vw;padding:30px;height:300px;border: 1px solid #000;text-align: center">
<h1>預覽畫布</h1>
<VueDraggableNext :list="componentList" group="people" :sort="false">
<div v-for="(element, index) in componentList" :key="element.name">
<div>
<el-button @click="changeComponent(element)" size="small">編輯</el-button>
<el-button @click="deleteComponent(index)" size="small">刪除</el-button>
</div>
<component :is="element.component" :details="element.details"></component>
</div>
</VueDraggableNext>
</div>

<!-- 內容編輯 右側 -->
<div style="width:30vw;padding:30px;height:300px;border: 1px solid #000;text-align: center">
<h1>內容編輯</h1>
<div v-for="(nowDetails, index) in nowComponentDetail.details" :key="index">
{{ nowDetails.key }}: <el-input clearable v-model="nowDetails.value" />
</div>
</div>
</div>

</template>

邏輯代碼:

<script setup>
import {markRaw, reactive, ref, watch, nextTick} from "vue";
// 引入需要拖拽的組件
import About from "@/views/AboutView.vue"
// 引入拖拽庫
import { VueDraggableNext } from "vue-draggable-next";

// 組件列表數據
const componentNameList = [
{
// 組件ID
componentId:0,
// 組件名
name:'關于組件',
// 組件描述
description: '關于組件',
// 組件信息
component: markRaw(About),
// 組件需要編輯內容
details: About.props.details.default
},
{
componentId:1,
name:'關于組件1',
description: '關于組件1',
component:markRaw(About),
details: About.props.details.default
},
];
// 預覽畫布數據
let componentList = reactive([]);

watch(componentList, () => {
console.log(componentList, 'componentList')
})
// 畫布中刪除的點擊事件
const deleteComponent = (index) => {
componentList.splice(index, 1);
};

// 內容編輯數據
let nowComponentDetail = ref({});

// 畫布中編輯的點擊事件
const changeComponent = (element) => {
nowComponentDetail.value = element;
};
</script>

(3)功能組件代碼實例(參考)

此處提供了組件列表中,任意功能組件的編寫實例,組件的具體功能根據需求自定義。

特別注意,組件Props中details對象屬性的結構寫法,要靈活應用。

模版代碼:

<template>
<div style="padding: 10px;background: pink;margin-bottom: 10px">
{{ props.details.content }}
</div>
</template>

邏輯代碼:

<script setup>
import { defineProps } from "vue";

const props = defineProps({
details: {
type: Object,
default: {
content: {
key: '內容',
value: "我是About",
},
}
}
})
</script>

3、問題詳解

(1)拖拽實現的底層原理

拖拽的實現原理可以簡單描述為以下幾個步驟:

  • 觸發拖拽:通過監聽鼠標或觸摸事件,當用戶按下鼠標左鍵或觸摸屏幕時,表示開始拖拽操作。
  • 記錄拖拽信息:在拖拽開始時,記錄拖拽起始位置(鼠標或觸摸點的坐標),以及需要拖拽的元素的初始位置(相對于文檔的坐標)。
  • 更新拖拽元素位置:在拖拽過程中,通過監聽鼠標移動或觸摸滑動事件,計算鼠標或觸摸點的當前位置,并根據鼠標或觸摸點的位置變化,更新拖拽元素的位置。這可以通過修改元素的 CSS 屬性(如 left 和 top)或使用 CSS 變換(如 translateX 和 translateY)來實現。
  • 處理拖拽結束:當用戶釋放鼠標左鍵或觸摸結束時,表示拖拽結束。此時可以執行一些操作,如更新拖拽元素的最終位置、觸發事件或回調函數等。

以下是拖拽實現的基本原理代碼實例:

// 獲取拖拽元素
const draggableElement = document.getElementById('draggable');

// 記錄拖拽起始位置和拖拽元素的初始位置
let startX, startY, initialX, initialY;

// 監聽鼠標按下事件
draggableElement.addEventListener('mousedown', dragStart);
draggableElement.addEventListener('touchstart', dragStart);

// 監聽鼠標移動事件
document.addEventListener('mousemove', drag);
document.addEventListener('touchmove', drag);

// 監聽鼠標釋放事件
document.addEventListener('mouseup', dragEnd);
document.addEventListener('touchend', dragEnd);

// 拖拽開始事件處理程序
function dragStart(event) {
event.preventDefault();

if (event.type === 'touchstart') {
startX = event.touches[0].clientX;
startY = event.touches[0].clientY;
} else {
startX = event.clientX;
startY = event.clientY;
}

initialX = draggableElement.offsetLeft;
initialY = draggableElement.offsetTop;
}

// 拖拽事件處理程序
function drag(event) {
event.preventDefault();

if (event.type === 'touchmove') {
const currentX = event.touches[0].clientX - startX;
const currentY = event.touches[0].clientY - startY;
draggableElement.style.left = initialX + currentX + 'px';
draggableElement.style.top = initialY + currentY + 'px';
} else {
const currentX = event.clientX - startX;
const currentY = event.clientY - startY;
draggableElement.style.left = initialX + currentX + 'px';
draggableElement.style.top = initialY + currentY + 'px';
}
}

// 拖拽結束事件處理程序
function dragEnd() {
// 執行拖拽結束后的操作
}

(2)關于vue-draggable-next 庫的功能總結

vue-draggable-next 庫特點和功能的補充說明:

  • 基于 Vue 3:vue-draggable-next 是為 Vue.js 3 版本設計的拖拽庫,充分利用了 Vue 3 的響應式系統和組合式 API。
  • 輕量級和簡單易用:該庫的代碼量較少,易于理解和使用。它提供了一組簡單的指令和組件,可以輕松地將拖拽功能集成到 Vue.js 應用程序中。
  • 支持多種拖拽模式:vue-draggable-next 支持多種拖拽模式,包括自由拖拽、列表拖拽、網格拖拽等。您可以根據需求選擇適合的拖拽模式。
  • 自定義拖拽樣式和行為:該庫允許您自定義拖拽元素的樣式和行為。您可以定義拖拽時的樣式、占位符元素、限制拖拽的范圍等。
  • 事件和回調支持:vue-draggable-next 提供了一組事件和回調函數,可以在拖拽過程中監聽和處理各種事件。例如,您可以監聽拖拽開始、拖拽結束、拖拽元素排序等事件,并執行相應的操作。
  • 支持觸摸設備:該庫對觸摸設備提供了良好的支持,可以在移動設備上實現流暢的拖拽交互。
責任編輯:姜華 來源: 今日頭條
相關推薦

2021-12-02 05:50:35

Vue3 插件Vue應用

2024-02-27 08:27:18

元素拖拽Vue3拼圖驗證

2024-02-01 09:10:04

頁面引導工具Vue3

2024-03-27 08:28:31

元素拖拽API文件上傳

2024-01-03 08:20:40

2024-08-13 09:26:07

2023-12-18 09:58:46

微信掃碼支付Vue3

2023-11-20 08:29:33

Vue微信掃碼授權登錄

2024-01-08 08:50:19

Vue3級聯菜單數據懶加載

2022-07-27 08:40:06

父子組件VUE3

2023-11-28 09:03:59

Vue.jsJavaScript

2024-04-18 08:53:15

Vue3數字動畫

2021-08-27 08:38:10

CSS 技巧 resize

2022-03-10 11:04:04

Vue3Canvas前端

2022-07-29 11:03:47

VueUni-app

2020-12-01 08:34:31

Vue3組件實踐

2024-06-20 12:17:17

前端Vue3

2024-03-19 08:35:30

Vue3添加水印維護版權標識

2009-12-29 18:09:00

Silverlight

2021-05-18 07:51:37

Suspense組件Vue3
點贊
收藏

51CTO技術棧公眾號

av漫画在线观看| 中文字幕在线亚洲三区| 亚洲第一在线播放| 成人羞羞网站| 91精品在线免费| 久久99中文字幕| 国产对白叫床清晰在线播放| 捆绑调教一区二区三区| 欧美国产中文字幕| 国产精品毛片一区二区| 9999精品| 色综合久久综合| 亚洲国产精品女人| 中文字幕 自拍| 国产91亚洲精品久久久| 亚洲综合一二区| 亚洲春色综合另类校园电影| 亚洲精品无amm毛片| 日韩成人av影视| 性金发美女69hd大尺寸| www.99re6| 五月天亚洲一区| 日韩午夜av电影| 老司机午夜av| 182在线视频观看| 亚洲天堂精品视频| 亚洲mv在线看| 天堂在线免费av| 国产高清精品在线| 国产一区红桃视频| 激情视频网站在线观看| 国产一区二区中文| 久久久精品亚洲| 影音先锋男人在线| 久久av电影| 亚洲精品美女久久| 女教师高潮黄又色视频| 亚洲一区二区三区久久久| 在线观看一区二区视频| 国产高清av在线播放| 在线免费观看a视频| 中文字幕一区二区三区不卡 | 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 中文字幕高清一区| 欧美日韩国产不卡在线看| 粉嫩av一区二区夜夜嗨| 国产精品99久| 亚洲一区国产精品| 国产又大又黄的视频| 日韩福利视频导航| 国产成人欧美在线观看| 91久久国产综合久久91| 国产视频一区三区| 5566日本婷婷色中文字幕97| 日韩精品无码一区二区| 日韩午夜av| 97香蕉超级碰碰久久免费的优势| 朝桐光av在线| 午夜电影亚洲| 久久久久久久国产| 国产又大又黑又粗免费视频| 亚洲麻豆av| 91精品国产免费久久久久久| 男女视频免费看| 国产精品毛片在线看| 欧美性受xxxx黑人猛交| 国产一级片网址| 99xxxx成人网| 人人做人人澡人人爽欧美| 天天干天天干天天操| 老司机午夜精品视频| 欧美中文字幕在线视频| 成人h动漫精品一区二区下载| 久久久久久黄| 国产精品日日摸夜夜添夜夜av| 亚洲视屏在线观看| 经典三级在线一区| 国产成人精品免费视频大全最热| 韩国av永久免费| 91丨九色丨尤物| 日韩免费三级| 超碰在线caoporn| 亚洲一二三区视频在线观看| 日韩精品xxxx| jvid一区二区三区| 日韩精品在线网站| 男人天堂av电影| 久久影院一区| 国自在线精品视频| 波多野结衣av无码| 国产精品一品视频| 蜜桃传媒视频麻豆第一区免费观看| 国产在线观看免费网站| 亚洲天堂久久久久久久| 女人和拘做爰正片视频| 日韩一级特黄| 亚洲精品国产欧美| 亚洲怡红院在线观看| 1024日韩| 国产免费一区视频观看免费| 成人免费公开视频| 中文字幕第一区二区| 4444亚洲人成无码网在线观看| 女人高潮被爽到呻吟在线观看| 欧美色综合影院| 91精品啪在线观看国产| 第一会所sis001亚洲| 欧美国产欧美亚洲国产日韩mv天天看完整 | 91超碰中文字幕久久精品| 亚洲在线精品视频| 久久嫩草精品久久久久| 欧美人与动牲交xxxxbbbb| 成人黄色免费短视频| 欧美videossexotv100| 午夜影院黄色片| 妖精视频成人观看www| 91久久精品国产91性色| 日本黄在线观看| 亚洲一区二区三区视频在线| 五月婷婷丁香综合网| 日本欧美韩国国产| 欧美区在线播放| 亚洲性生活大片| 久久夜色精品国产噜噜av| 99视频精品全部免费看| 国产精品亲子伦av一区二区三区| 亚洲精品国偷自产在线99热| caoporn91| 麻豆精品国产91久久久久久| 美女被啪啪一区二区| 人人澡人人添人人爽一区二区| 欧美日韩国产综合久久 | 亚洲欧美另类图片小说| 亚洲一二三区av| 伊人久久大香线蕉综合网站| 国产做受69高潮| 亚洲av无码乱码在线观看性色 | 久久综合成人网| 国产一区激情在线| 中文字幕一区综合| 亚洲tv在线| 久久精品电影网| 一二三四区在线| 欧美国产1区2区| 亚洲精品一二三四五区| 国产欧美日韩精品一区二区三区 | 亚洲电影二区| 日韩一区二区福利| 一区二区 亚洲| 国产精品毛片高清在线完整版| 国产激情在线观看视频| 九九亚洲视频| 国产精品99久久久久久白浆小说| 欧美日韩影视| 色综合天天综合网天天狠天天| 人妻丰满熟妇av无码久久洗澡| 亚洲青色在线| 免费一区二区三区| 欧美电影免费观看网站| 亚洲人线精品午夜| 中文字幕第99页| 成人欧美一区二区三区白人| 亚洲精品性视频| 亚洲蜜桃视频| 俄罗斯精品一区二区| 黄色在线观看视频网站| 日韩av在线电影网| 欧美日韩一级黄色片| 中文字幕精品—区二区四季| 亚洲精品乱码久久久久久动漫| 亚洲91中文字幕无线码三区| 91手机在线播放| 岛国av在线网站| 亚洲精品av在线| 日本免费在线观看视频| 日本一二三四高清不卡| 欧美xxxxxbbbbb| 亚洲日本欧美| 欧美日本亚洲| 亚瑟国产精品| 91黄色8090| 91网在线播放| 欧美xxxxx牲另类人与| 欧美一级片免费在线观看| 国产亚洲1区2区3区| 免费网站在线观看黄| 狠狠久久婷婷| 日韩理论片在线观看| 91国内精品| 国产v综合ⅴ日韩v欧美大片| 久久日韩视频| 精品呦交小u女在线| 夜夜嗨aⅴ一区二区三区| 亚洲一区二区三区美女| 99久久99久久精品免费看小说.| 国产精品一二二区| 日本wwww视频| 久久久综合色| 精品综合在线| 国产日韩欧美中文在线| 91国内免费在线视频| 免费在线看a| 日韩精品中文字幕久久臀| 中文字幕+乱码+中文乱码91| 亚洲电影在线免费观看| 亚洲女人毛茸茸高潮| av色综合久久天堂av综合| 亚洲精品久久久中文字幕| 99av国产精品欲麻豆| 强伦女教师2:伦理在线观看| 日日狠狠久久偷偷综合色| 91午夜理伦私人影院| 精品3atv在线视频| 久久久欧美一区二区| 蜜桃视频网站在线| 亚洲日本aⅴ片在线观看香蕉| 精品国自产在线观看| 欧美性大战久久久| 日韩熟女精品一区二区三区| 亚洲美女在线国产| 成人免费视频入口| 91麻豆免费看| 国产精品手机在线观看| 国内精品久久久久影院一蜜桃| 免费在线观看的毛片| av成人激情| 精品久久久久久无码中文野结衣| 北条麻妃国产九九九精品小说| 国产三级精品在线不卡| 欧美h版在线观看| 国产在线999| 国产精品伊人| 国产精品美女呻吟| 成人日韩在线观看| 国产91在线播放九色快色| 国产精品25p| 97在线视频免费| 草草影院在线| 欧美精品久久久久a| 国产三区在线观看| 不卡毛片在线看| 高h视频在线观看| 久久九九亚洲综合| 久久精品视频免费看| 日韩在线高清视频| 免费观看成人高潮| 久久亚洲电影天堂| v片在线观看| 九九热99久久久国产盗摄| 中文字幕中文字幕在线十八区| 久久这里只有精品99| 成人影欧美片| 欧美成人午夜视频| 在线观看a级片| 久久久久久久久网站| 爱啪视频在线观看视频免费| 亚州国产精品久久久| 免费h在线看| 日韩美女免费观看| 久久av日韩| 91亚洲va在线va天堂va国 | 色屁屁草草影院ccyy.com| 国产亚洲精品精华液| 日韩不卡av在线| 国产精品免费视频网站| 紧身裙女教师波多野结衣| 一区二区三区欧美视频| 国产91av视频| 欧美性猛交xxx| 国产在线一级片| 欧美高清视频www夜色资源网| 国产精品久久久久久久一区二区 | 国产精品无码2021在线观看| 亚洲午夜久久久久久久| 精品黄色免费中文电影在线播放 | 美国黄色小视频| 亚洲成人动漫av| 波多野结衣在线观看一区| 欧美视频一区二区三区四区 | 国产视频精品免费播放| 成a人v在线播放| 欧美激情免费视频| 刘亦菲一区二区三区免费看| 国产精品激情自拍| 亚洲精品一区二区三区在线| 久久99热只有频精品91密拍| 日本午夜一区| 和岳每晚弄的高潮嗷嗷叫视频| 每日更新成人在线视频| 亚洲制服中文字幕| 91片黄在线观看| 老熟妇高潮一区二区三区| 亚洲国产aⅴ天堂久久| 一区二区视频播放| 亚洲国产第一页| 麻豆传媒视频在线观看免费| 午夜精品福利视频| 欧美日韩视频免费看| 国外成人免费视频| 五月精品视频| 激情网站五月天| 东方欧美亚洲色图在线| 日本人亚洲人jjzzjjz| 午夜久久久影院| 国产精品视频一二区| 亚洲欧美国产高清va在线播| www.欧美日本韩国| 国产精品视频免费在线观看| 第四色在线一区二区| 伊人久久大香线蕉av一区| 国产精品最新自拍| 自拍视频第一页| 中日韩av电影| 色老头在线视频| 亚洲国产高清自拍| 四季久久免费一区二区三区四区| 国产精品第二页| 青青久久av| 中文精品无码中文字幕无码专区 | 久久黄色一级视频| 中文字幕在线免费不卡| 天天干天天操天天操| 亚洲福利视频网站| 调教一区二区| 91久久国产综合久久91精品网站 | 日韩在线视频国产| 欧美一区 二区 三区| 久久99热只有频精品91密拍| 精品999日本| 国产又黄又嫩又滑又白| 中文字幕一区二区三区视频| 波多野结衣家庭主妇| 亚洲欧美中文字幕| 亚洲国产欧美日本视频| 国产综合色一区二区三区| 亚洲激情成人| 色悠悠在线视频| 亚洲超丰满肉感bbw| 丰满肥臀噗嗤啊x99av| 欧美丰满片xxx777| 日本在线视频一区二区三区| 欧美日韩在线免费观看视频| 蜜桃传媒麻豆第一区在线观看| 久久精品无码一区| 91国内精品野花午夜精品| 国产有码在线| 国产精品免费久久久久影院| 极品美女一区二区三区| 欧美黄色一级片视频| 国产欧美精品一区二区三区四区| 超碰在线观看91| 中文字幕亚洲一区在线观看| 成人福利一区二区| 一区二区在线观看网站| 激情综合色播五月| 日韩女优一区二区| 亚洲福利视频在线| 欧美大胆性生话| 亚洲自拍偷拍二区| 久草这里只有精品视频| 欧美黄色aaa| 亚洲国产精久久久久久| 成人欧美一区二区三区的电影| 欧美日韩喷水| 日韩av二区在线播放| 来吧亚洲综合网| 日韩精品最新网址| 老司机深夜福利在线观看| 欧日韩一区二区三区| 青青草伊人久久| 国产老头老太做爰视频| 精品国产免费一区二区三区香蕉 | 国产精品天天狠天天看 | 国产精品网站免费| 久久精品一区二区| 国产露脸91国语对白| 久久久亚洲成人| 国产剧情在线观看一区| 邪恶网站在线观看| 亚洲一区二区视频在线观看| 丝袜视频国产在线播放| 国产精品老女人精品视频| 综合激情一区| 免费在线观看成年人视频| 欧美色网站导航| 丁香高清在线观看完整电影视频| 麻豆av一区二区| 韩国理伦片一区二区三区在线播放| 久久精品视频6| 这里只有精品视频在线| 99ri日韩精品视频| 成年人小视频网站| 亚洲电影在线免费观看| 3p视频在线观看| 国内视频一区二区| 精品亚洲aⅴ乱码一区二区三区| 日韩精品在线免费看| 在线日韩欧美视频| 精品少妇3p| 久久久久久久久久久久久久久国产|