Vue进阶之Vue无代码可视化项目(七)

avatar
作者
猴君
阅读量:1

Vue无代码可视化项目

右侧栏配置——配置面板

右侧栏配置主要是表单相关的内容,表单处理是开发中用的特别多的场景;今天从架构师的视角来看下这个表单怎么设计,动态表单、复杂表单、表单联动。

  • src
    • components
    • RightPanel.vue

components/RightPanel.vue

先将左侧栏复制一份粘到右侧栏上

<script setup lang="ts"> import {      Lightning, Share } from '@icon-park/vue-next' import {       ref } from 'vue';  import {      SmoothDndContainer} from '@/components/SmoothDnd/SmoothDndContainer' import {      SmoothDndDraggable} from '@/components/SmoothDnd/SmoothDndDraggable'  type Mode = 'outline'|'blocks'|null const mode = ref<Mode>(null)  const toggleMode = (newMode:Mode) => {         if(newMode === mode.value){           mode.value = null   }else{           mode.value = newMode   } } </script>  <template>   <div class="left-panel-wrapper">     <div class="left-panel-left">       <div class="btn" :class="{active:mode==='outline'}" @click="()=>toggleMode('outline')">         <Lightning />       </div>       <div class="btn" :class="{active:mode==='blocks'}" @click="()=>toggleMode('blocks')">         <Share />       </div>     </div>     <!-- 接入动画 -->     <transition name="app-left-panel-drawer">       <div class="left-panel-content" v-show="mode">           {   {mode}}           <!-- 面板中使用SmoothDnd -->           <SmoothDndContainer class="block-group"            behaviour="copy"           tag="div"  group-name="blocks"            @drag-start="(e,v)=>console.log(e,v)"            @drag-leave="(e,v)=>console.log(e,v)"           @drop="(e)=>console.log('drop',e)"           :get-child-payload="(index:number)=>index+1"           >             <SmoothDndDraggable v-for="i in 10" :key="i">               <div class="block-item">{   {i}}</div>             </SmoothDndDraggable>           </SmoothDndContainer>        </div>     </transition>   </div> </template>  <style scoped> .left-panel-wrapper {         display: flex;   height: 100%;   background-color: #f5f5f5;   border: 1px solid #e8e8e8; } .left-panel-left{         display: flex;   padding:0 10px;   flex-direction: column;   align-items: center;   width: 50px;   height: 100%;   background-color: #e8e8e8; } .btn{         width: 32px;   height: 32px;   display: flex;   justify-content: center;   align-items: center;   cursor: pointer;   border-radius: 6px;   margin-top:20px;   /* &:hover{     background-color: #f5f5f5;   } */ } .btn:hover{         background-color: #f5f5f5; } /* 被激活时候的特定样式 */ .btn.active{         background-color: rgb(0,196,83);   color: #fff; } .left-panel-content{         flex: 1;   width: 280px;   height: 100%;   background-color: #f5f5f5;   overflow: hidden; }  /* 下面我们会解释这些 class 是做什么的 */ .app-left-panel-drawer-enter-active, .app-left-panel-drawer-leave-active {         transition: width 0.1s cubic-bezier(0.3, 0.1, 0.3, 1); }  .app-left-panel-drawer-enter-from, .app-left-panel-drawer-leave-to {         width: 0; }  .app-left-panel-drawer-content {         width: calc(var(--panel-width) - 60px);   height: 100%;   padding: 16px; }  .block-item{         width: 40px;   height: 40px;   background-color: #fff;   border: 1px solid #e8e8e8;   margin-bottom: 8px;   display: flex;   justify-content: center;   align-items: center;   font-size: 14px;   transition:background-color 0.3s

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!