日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-01-23 17:26:34 301觀看
導讀本文主要內容分三部分,第一部分是需求分析,第二部分是實現步驟,第三部分是問題詳解。如果您只需要解決問題,請閱讀第一、二部分即可。如果您有更多時間,進一步學習問題相關知識點,請閱讀至第三部分。1、需求分析實現一個CMS

sdw28資訊網——每日最新資訊28at.com

本文主要內容分三部分,第一部分是需求分析,第二部分是實現步驟,第三部分是問題詳解。sdw28資訊網——每日最新資訊28at.com

如果您只需要解決問題,請閱讀第一、二部分即可。sdw28資訊網——每日最新資訊28at.com

如果您有更多時間,進一步學習問題相關知識點,請閱讀至第三部分。sdw28資訊網——每日最新資訊28at.com

1、需求分析

實現一個CMS內容管理系統,在后臺進行內容編輯,在官網更新展示內容。sdw28資訊網——每日最新資訊28at.com

關于后臺的編輯功能,大致分為兩部分:組件拖拽預覽、組件內容編輯實時預覽。sdw28資訊網——每日最新資訊28at.com

對于組件拖拽預覽,用戶可以在含有各種功能組件的列表中,選擇需要的組件進行拖拽。將組件拖拽到預覽畫布中后,可以在畫布中預覽組件的內容。sdw28資訊網——每日最新資訊28at.com

對于組件內容編輯實時預覽,用戶可以點擊編輯按鈕,顯示對應組件的內容編輯信息。當修改組件內容時,在畫布中可以實時預覽組件的變化。sdw28資訊網——每日最新資訊28at.com

sdw28資訊網——每日最新資訊28at.com

sdw28資訊網——每日最新資訊28at.com

2、實現步驟

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

關于拖拽組件庫,在github上有很多,最熱門的當屬vuedraggable這個庫。sdw28資訊網——每日最新資訊28at.com

它基于Sortable.js,擁有完整的中文文檔,所以很多朋友在做拖拽功能時,都會優先考慮它。sdw28資訊網——每日最新資訊28at.com

sdw28資訊網——每日最新資訊28at.com

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

于是我發現了,一個更加好用的拖拽庫vue-draggable-next。sdw28資訊網——每日最新資訊28at.com

sdw28資訊網——每日最新資訊28at.com

它的出現是參考了vuedraggable這個庫,所以說很多用法很相似,但是使用起來較之更加友善。總結為一個詞,自由。sdw28資訊網——每日最新資訊28at.com

下面我們的拖拽功能實現,就是利用了vue-draggable-next這個庫。sdw28資訊網——每日最新資訊28at.com

如果你對拖拽底層原理感興趣,并且有空余時間,勞請閱至第三部分拖拽原理總結。sdw28資訊網——每日最新資訊28at.com

(2)拖拽功能代碼實例

模版和邏輯中代碼都分為了三部分:組件列表、預覽畫布、內容編輯。sdw28資訊網——每日最新資訊28at.com

布局時,樣式根據需求自定義,此處只是提供了功能的基本邏輯實現。sdw28資訊網——每日最新資訊28at.com

使用時,關于拖拽組件的需求,根據文檔中提供的屬性和事件的描述,靈活配置完善。sdw28資訊網——每日最新資訊28at.com

vue-draggable-next庫文檔地址:https://github.com/anish2690/vue-draggable-next。sdw28資訊網——每日最新資訊28at.com

安裝依賴:sdw28資訊網——每日最新資訊28at.com

npm install vue-draggable-next//oryarn add vue-draggable-next

模板代碼:sdw28資訊網——每日最新資訊28at.com

<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>

邏輯代碼:sdw28資訊網——每日最新資訊28at.com

<script setup>import {markRaw, reactive, ref, watch, nextTick} from "vue";// 引入需要拖拽的組件import About from "@/views/AboutView.vue"http:// 引入拖拽庫import { VueDraggableNext } from "vue-draggable-next";// 組件列表數據const componentNameList = [{// 組件IDcomponentId: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)功能組件代碼實例(參考)

此處提供了組件列表中,任意功能組件的編寫實例,組件的具體功能根據需求自定義。sdw28資訊網——每日最新資訊28at.com

特別注意,組件Props中details對象屬性的結構寫法,要靈活應用。sdw28資訊網——每日最新資訊28at.com

模版代碼:sdw28資訊網——每日最新資訊28at.com

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

邏輯代碼:sdw28資訊網——每日最新資訊28at.com

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

3、問題詳解

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

拖拽的實現原理可以簡單描述為以下幾個步驟:sdw28資訊網——每日最新資訊28at.com

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

以下是拖拽實現的基本原理代碼實例:sdw28資訊網——每日最新資訊28at.com

// 獲取拖拽元素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 庫特點和功能的補充說明:sdw28資訊網——每日最新資訊28at.com

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

本文鏈接:http://m.www897cc.com/showinfo-26-66547-0.htmlVue3問題:如何實現組件拖拽實時預覽功能?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: React和Vue的生態系統有何不同?

下一篇: 想提升技術,必看的八個開源庫,都很通俗易懂

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产日韩欧美在线视频观看| 欧美日韩性生活视频| 亚洲一区影院| 亚洲欧美资源在线| 久久精品一区二区三区四区| 欧美成人精品福利| 国产精品xnxxcom| 国产日韩一区在线| 亚洲高清视频在线| 亚洲自拍电影| 免费观看在线综合色| 欧美日韩在线免费视频| 国产精品福利片| 韩国在线一区| 一区二区三区精品视频在线观看| 先锋资源久久| 欧美激情a∨在线视频播放| 国产精品视频观看| 亚洲高清资源| 午夜精品国产| 欧美激情偷拍| 国产亚洲欧美中文| 这里只有精品电影| 久久午夜国产精品| 欧美日韩免费一区二区三区视频| 国产主播一区二区| 在线中文字幕一区| 乱中年女人伦av一区二区| 国产精品久久久久婷婷| 在线成人av.com| 亚洲午夜国产成人av电影男同| 久久久之久亚州精品露出| 欧美日韩专区| 亚洲成在人线av| 午夜精品久久久久久久99水蜜桃| 欧美 日韩 国产一区二区在线视频| 国产精品一区视频网站| 亚洲精品乱码久久久久久黑人| 性欧美1819性猛交| 欧美日韩国产限制| 亚洲国产成人不卡| 欧美一区二区三区在线播放| 欧美日韩精品免费观看视频完整| 国模一区二区三区| 亚洲欧美视频| 欧美日韩情趣电影| 亚洲精品久久久久| 久久久久一区二区三区四区| 日韩一级二级三级| 久久手机免费观看| 国产亚洲亚洲| 亚洲欧美制服中文字幕| 欧美日韩国产影片| 亚洲国产午夜| 久久偷窥视频| 国产在线欧美| 欧美一区二区三区在线播放| 欧美天堂亚洲电影院在线播放| 91久久亚洲| 免费在线观看精品| 伊人久久综合| 久久精品亚洲一区二区三区浴池| 国产精品永久在线| 亚洲欧美春色| 国产精品国产三级国产普通话99 | 伊人成人在线| 久久av红桃一区二区小说| 国产精品拍天天在线| 在线综合亚洲欧美在线视频| 欧美极品色图| 亚洲国产另类 国产精品国产免费| 久久久国产精品亚洲一区 | 亚洲欧美欧美一区二区三区| 欧美色视频在线| 一本色道久久综合亚洲精品不| 欧美另类极品videosbest最新版本| 亚洲国产另类 国产精品国产免费| 久久天天躁狠狠躁夜夜av| 韩国自拍一区| 久久综合久久综合久久| 极品av少妇一区二区| 久久久夜色精品亚洲| 激情一区二区| 理论片一区二区在线| 亚洲承认在线| 欧美激情视频在线播放| 亚洲美女av网站| 欧美日韩人人澡狠狠躁视频| 99国产精品自拍| 欧美色视频日本高清在线观看| 亚洲视频一区在线| 国产精品一级久久久| 新狼窝色av性久久久久久| 国产视频一区二区在线观看| 欧美一区二区三区视频在线观看| 国产一区二区三区四区| 久久久久久亚洲综合影院红桃| 在线观看av一区| 欧美高清视频在线播放| 亚洲免费观看高清完整版在线观看熊 | 亚洲欧美日韩在线高清直播| 国产精品永久| 久久久国产亚洲精品| 亚洲国产经典视频| 欧美精品成人在线| 亚洲视频观看| 国产精品久久久久影院色老大| 性xx色xx综合久久久xx| 一区三区视频| 欧美欧美午夜aⅴ在线观看| 亚洲午夜av| 激情久久一区| 欧美精品麻豆| 午夜综合激情| 亚洲第一区在线观看| 欧美国产日本韩| 亚洲性感激情| 狠狠色2019综合网| 欧美精品videossex性护士| 亚洲夜间福利| 黄色成人在线网站| 欧美人在线视频| 午夜精品美女自拍福到在线 | 亚洲国产乱码最新视频| 欧美午夜视频在线| 久久精品国产久精国产思思| 亚洲国产欧洲综合997久久| 欧美视频在线观看视频极品| 久久riav二区三区| 亚洲日本视频| 国产精品一区二区在线观看不卡| 久久久久久久一区| 99天天综合性| 国产亚洲精品美女| 欧美激情综合五月色丁香| 小黄鸭精品密入口导航| 亚洲黄色在线观看| 国产热re99久久6国产精品| 欧美激情91| 久久精品123| 亚洲视频久久| 亚洲第一中文字幕| 国产老女人精品毛片久久| 欧美韩国一区| 欧美中文字幕第一页| 亚洲精品视频免费| 国内外成人免费激情在线视频| 欧美片在线播放| 久久久久99精品国产片| 亚洲午夜一区二区| 亚洲国产精品综合| 国产一区视频网站| 国产精品伦理| 欧美另类高清视频在线| 久久久久久久91| 亚洲一区二区伦理| 亚洲欧洲一区| 黄色资源网久久资源365| 国产精品久久久久久久久久久久 | 亚洲免费视频观看| 亚洲精品孕妇| 一区二区自拍| 国产日韩欧美三级| 欧美色欧美亚洲高清在线视频| 美女国产一区| 久久成人羞羞网站| 亚洲免费一级电影| aa级大片欧美三级| 91久久精品国产91久久性色| 国产在线麻豆精品观看| 国产精品入口| 欧美亚州韩日在线看免费版国语版| 亚洲精品综合精品自拍| 国产一区二区av| 国产精品入口福利| 欧美性大战xxxxx久久久| 欧美区视频在线观看| 欧美1区2区视频| 久久亚洲综合色| 久久成人18免费观看| 午夜综合激情| 亚洲欧美国产精品va在线观看| 夜夜精品视频一区二区| 亚洲人永久免费| 亚洲人妖在线| 91久久嫩草影院一区二区| 亚洲高清不卡| 在线日本成人| 一区免费视频| 尤物精品在线| 永久免费视频成人| 影音先锋久久资源网| 激情综合电影网| 极品中文字幕一区| 一区二区三区在线观看视频| 国产午夜精品一区二区三区欧美| 国产精品婷婷| 国产精品视频免费观看www| 国产精品欧美日韩一区| 国产精品久久久久久av下载红粉 | 国产日韩欧美一区二区| 国产日韩精品电影| 国产亚洲一区精品| 国模精品一区二区三区|