最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3+vuedraggable實現(xiàn)動態(tài)配置頁面

 更新時間:2023年12月30日 08:26:19   作者:喵森  
這篇文章主要為大家詳細(xì)介紹了Vue3如何利用vuedraggable實現(xiàn)動態(tài)配置頁面,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以參考一下

1、首先放上最終效果圖,整個頁面由三個區(qū)域組成:

  • 組件列表存放可以配置的組件名稱。
  • 放置列表為最終展現(xiàn)的視覺效果。
  • 組件輸入則可以動態(tài)配置內(nèi)容,最終的配置數(shù)據(jù)為此處的數(shù)據(jù)。

1、框架搭建

1.1、安裝指定版本的vuedraggable

首先安裝支持vue3版本的vuedraggable

注意:默認(rèn)安裝的vuedraggable版本為vue2.0版本,并不通用。

npm install vuedraggable@4.1.0 --save

vue3版本vuedraggable示例地址sortablejs.github.io/vue.draggable.next

vue3版本vuedraggable Git地址 github.com/SortableJS/vue.draggable.next

1.2、布局搭建

安裝完4.0版本的vuedraggable以后,就可以按下面的寫法來進(jìn)行一個簡單的布局了。

<template>
  <div>
    <div class="section-container">
      <h4>組件列表</h4>
      <draggable 
      class="components-view"
      item-key="index" 
      :list="sectionList" 
      :sort="false"
      :forceFallback="true"
      ghost-class="ghost"
      dragClass="dragClass" 
      group="vehicle-station"
      >
        <template #item="{ element, index }">
            <div class="section">{{ element.type }}</div>
        </template>
      </draggable>
    </div>
    <div class="components-container">
      <h4>放置列表</h4>
      <draggable 
      item-key="index" 
      :list="componentsList"  
      animation="300"
      :scroll="true"
      :forceFallback="false"
      ghost-class="ghost"
      dragClass="dragClass" 
      group="vehicle-station">
        <template #item="{ element, index }">
          <transition name="el-fade-in-linear">
            <div>
              <div v-if="element.type === 'input'" class="section">輸入框{{ element.data }}</div>
              <div v-if="element.type === 'textarea'" class="section">文本域</div>
            </div>
          </transition>
        </template>
      </draggable>
    </div>
    <!-- 這里存放組件 -->
    <div class="operate-container">
      <h4>組件輸入</h4>
    </div>
  </div>
</template>

需要注意的是vue3版本不再需要v-for來渲染組件,直接使用template來渲染元素,并且需要指定唯一的item-key值。

1.2、使用到的參數(shù)介紹

屬性名稱說明
groupname相同的可以互相拖拽
list拖拽的數(shù)組
item-key唯一key值,不能重復(fù)
sort控制列表是否可以排序
forceFallback默認(rèn)false,忽略HTML5的拖拽行為,因為設(shè)置了拖拽樣式,需要開啟
ghost-class目標(biāo)位置占位符的樣式
dragClass拖拽對象移動樣式
animation拖拽動畫時間
pullclone,拖拽的元素不會從列表消失,直接克隆這條數(shù)據(jù)
putfalse,禁止元素拖入

函數(shù)部分目前只需要定義數(shù)據(jù)結(jié)構(gòu)

<script setup lang="ts">
import { ref } from 'vue';
import draggable from 'vuedraggable'

interface list {
  type: string,
  name: string,
  data: any
}

const sectionList = ref<list[]>([
  {
    type: 'input',
    data: '',
    name: 'input'
  },
  {
    data: '',
    type: 'textarea',
    name: 'textarea'
  }
])

const componentsList = ref<list[]>([])
</script>

css定義一下分欄布局和拖動、占位樣式

<style scoped>
.components-view,
.components-wrap {
  height: 100%;
}

.dragClass {
  border: 1px solid red;
  border-radius: 8px;
}

.ghost {
  background-color: red !important;
}

.operate-container,
.section-container,
.components-container {
  float: left;
  padding-top: 30px;
  text-align: center;
  width: 300px;
  height: 800px;
}

.section-container {
  background-color: blanchedalmond;
}

.components-container {
  margin-left: 30px;
  background-color: rgb(184, 205, 178);
}

.operate-container {
  margin-left: 30px;
  background-color: rgb(125, 176, 228);
}

.section {
  text-align: center;
  width: 150px;
  height: 80px;
  line-height: 80px;
  margin-bottom: 30px;
  background-color: cadetblue;
  cursor: pointer;
}
</style>

至此頁面就可以正常拖拽了,僅拖拽頁面不需要用到函數(shù)操作,只需要根據(jù)配置項把頁面布局完成即可。

2、數(shù)據(jù)接入

目前只是完成了組件的添加,接下來要把組件接入。

思路是單獨定義組件數(shù)據(jù),當(dāng)輸入完成以后,根據(jù)當(dāng)前拖動的放置列表下標(biāo)來存儲數(shù)據(jù)。

2.1、為兩列拖拽元素添加拖拽結(jié)束事件

2.2、設(shè)置組件數(shù)據(jù)

組件數(shù)據(jù)和放置列表的數(shù)據(jù)是聯(lián)動的,在編輯完組件以后,數(shù)據(jù)會存儲到放置列表內(nèi)。 此時需要在拖動結(jié)束時獲取當(dāng)前拖動的放置列表下標(biāo),再把數(shù)據(jù)賦值給組件數(shù)據(jù)

  <div class="operate-container">
      <h4>組件輸入</h4>
      <div>
        <!-- TODO:輸入數(shù)據(jù)的時候要雙向綁定,賦值給editorData -->
        <input v-if="editorData.type === 'input'" type="text" v-model="editorData.data" @change="setEditorData">
        <textarea v-if="editorData.type === 'textarea'" rows="4" cols="30" v-model="editorData.data"
          @change="setEditorData"></textarea>
      </div>
    </div>
    const onEnd = (evt: any) => {
  setCurrent(evt.newIndex)
}

-----
const setCurrent = (idx: number) => {
  // 設(shè)置當(dāng)前編輯的組件數(shù)據(jù)
  editorData.value = { ...componentsList.value[idx] }
  editorIndex.value = idx
}

const setEditorData = () => {
  // 將編輯的組件數(shù)據(jù)賦值給放置列表數(shù)據(jù)
  componentsList.value[editorIndex.value] = editorData.value
}

最終實現(xiàn)效果如下,可以根據(jù)拖動的組件展示不同的組件,并且可以輸入。

2.3、處理數(shù)據(jù)重復(fù)

上一步完成以后,組件數(shù)據(jù)已經(jīng)可以保留下來了,但是無法做到數(shù)據(jù)互不沖突,無論是新添加組件,還是編輯其中一個組件,數(shù)據(jù)都是相同的。

這是因為在拖拽的時候數(shù)據(jù)都是復(fù)制的,在修改完數(shù)據(jù)以后,最左側(cè)的組件列表會接收到最新修改的數(shù)據(jù),在下一次拖動的時候就會把已經(jīng)修改的數(shù)據(jù)再次拿來使用。

目前想到的解決方案是獲取當(dāng)前拖動的組件列表下標(biāo),和當(dāng)前放置列表的下標(biāo),手動清除數(shù)據(jù)。

const onEnd = (evt: any) => {
  if (evt.target.className === 'components-view' && evt.to.className === 'components-wrap') {
    // 左側(cè)組件列表的下標(biāo)
    sectionIndex.value = evt.oldIndex
  }
  setCurrent(evt.newIndex)
}

const setCurrent = (idx: number) => {
  // 設(shè)置當(dāng)前編輯的組件數(shù)據(jù)
  editorData.value = { ...componentsList.value[idx] }
  editorIndex.value = idx
}

const setEditorData = () => {
  // 填完值以后兩側(cè)數(shù)據(jù)都發(fā)生了改變,需要重新修改數(shù)據(jù)
  // 把上一次拖動的左側(cè)列表數(shù)據(jù)清空
  sectionList.value[sectionIndex.value].data = ''
  // 將編輯的組件數(shù)據(jù)賦值給放置列表數(shù)據(jù)
  componentsList.value[editorIndex.value] = editorData.value
}

完成上述步驟以后,簡單的動態(tài)配置組件就已經(jīng)完成了,處理框架的代碼量并不大,后續(xù)可以在上面拓展新的組件,最終可以呈現(xiàn)出一個可以動態(tài)配置的頁面。

以上就是Vue3+vuedraggable實現(xiàn)動態(tài)配置頁面的詳細(xì)內(nèi)容,更多關(guān)于Vue3 vuedraggable動態(tài)配置頁面的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue2異步更新及nextTick原理詳解

    Vue2異步更新及nextTick原理詳解

    Vue2的異步更新機制是基于JavaScript的事件循環(huán)機制實現(xiàn)的。nextTick方法則是在DOM更新后執(zhí)行回調(diào)函數(shù)。本文詳細(xì)介紹了Vue2的異步更新機制和nextTick原理,對于理解Vue2的渲染機制和優(yōu)化性能有很大的幫助。
    2023-04-04
  • vue過濾器實現(xiàn)日期格式化的案例分析

    vue過濾器實現(xiàn)日期格式化的案例分析

    這篇文章主要介紹了vue過濾器實現(xiàn)日期格式化的案例分析,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • el-form的label和表單自適應(yīng)填滿一行且靠左對齊方式

    el-form的label和表單自適應(yīng)填滿一行且靠左對齊方式

    這篇文章主要介紹了el-form的label和表單自適應(yīng)填滿一行且靠左對齊方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vuex的module模塊用法示例

    vuex的module模塊用法示例

    這篇文章主要介紹了vuex的module模塊用法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • vue項目設(shè)置打包后的靜態(tài)文件訪問路徑

    vue項目設(shè)置打包后的靜態(tài)文件訪問路徑

    這篇文章主要介紹了vue項目設(shè)置打包后的靜態(tài)文件訪問路徑,vue項目的最終項目文件需要經(jīng)過打包輸出,靜態(tài)文件的訪問路徑需要在vue.config.js文件中設(shè)置,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • vue控制滾動條滑到某個位置的方法實例

    vue控制滾動條滑到某個位置的方法實例

    當(dāng)容器有滾動條時,有時需要將滾動條滑到某個位置,下面這篇文章主要給大家介紹了關(guān)于vue控制滾動條滑到某個位置的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Vue SPA 路由跳轉(zhuǎn)無法回到頂部問題排查與解決

    Vue SPA 路由跳轉(zhuǎn)無法回到頂部問題排查與解決

    本文主要介紹一下Vue SPA 路由跳轉(zhuǎn)無法回到頂部問題排查與解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • 詳解vue移動端項目代碼拆分記錄

    詳解vue移動端項目代碼拆分記錄

    這篇文章主要介紹了詳解vue移動端項目代碼拆分記錄,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Vue實現(xiàn)監(jiān)聽某個元素滾動,親測有效

    Vue實現(xiàn)監(jiān)聽某個元素滾動,親測有效

    這篇文章主要介紹了Vue實現(xiàn)監(jiān)聽某個元素滾動,親測有效!具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 使用Elemen加上lang=“ts“后編譯報錯

    使用Elemen加上lang=“ts“后編譯報錯

    本文主要介紹了使用Elemen加上lang=“ts“后編譯報錯,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論

永胜县| 固阳县| 泰安市| 安宁市| 峨山| 吉水县| 项城市| 台江县| 延长县| 房山区| 康乐县| 烟台市| 辽中县| 武乡县| 太谷县| 凤翔县| 天等县| 无为县| 临漳县| 大渡口区| 双桥区| 越西县| 凤阳县| 尖扎县| 西盟| 桂阳县| 新源县| 普格县| 平谷区| 平湖市| 石棉县| 宁夏| 资阳市| 巴马| 从化市| 天祝| 邵武市| 彭山县| 安平县| 太仓市| 七台河市|