VUE實現Studio管理後臺(五):手風琴式摺疊組件(Accordion)

来源:https://www.cnblogs.com/idlewater/archive/2020/03/06/12425091.html
-Advertisement-
Play Games

作為一個有目標的人(目標是做一個好用的Bootstrap可視化編輯器,第一個版本已經實現,演示地址:https://vular.cn/rxeditor/,代碼地址:https://github.com/vularsoft/rxeditor),工作比較積極,思維也比較活躍,睡眠相對較少。今早6:30就 ...


作為一個有目標的人(目標是做一個好用的Bootstrap可視化編輯器,第一個版本已經實現,演示地址:https://vular.cn/rxeditor/,代碼地址:https://github.com/vularsoft/rxeditor),工作比較積極,思維也比較活躍,睡眠相對較少。今早6:30就起床了,吃早飯前,實現了一個手風琴式摺疊組件,具體效果如下:

一般情況,這樣的控制項有兩種表現形式:

1、排他展開,也就是一次只有一個項目展開,其它閉合,類似QQ的好友分組。

2、隨意展開,不拍它,可以同時展開多個

只實現第二種方式,相對比較容易,每個子項目控制自己的狀態就可以,不用跟其它項目交互。我的目標式做一個控制項,兩種方式都支持,通過屬性參數multiple確定是否可以同時展開多個。

添加新的文件跟目錄:

跟上次實現Tabs控制項一樣,有一個通用的子組件:CollapsibleItem,基於這個組件實現摺疊組件:SimpleAccordion。如果以後像實現其它風格的摺疊組件,可以共用CollapsibleItem組件。根據我個人的習慣,首先設想這個組件的使用方式,應該是這樣:

<SimpleAccordion :multiple='true'> 
    <CollapsibleItem>
    <template #heading>標題1</template>
    <template #body>內容1....</template>
    </CollapsibleItem>
    <CollapsibleItem>
    <template #heading>標題2</template>
    <template #body>內容2....</template>
    </CollapsibleItem>
</SimpleAccordion>

按照這樣的需求,先寫SimpleAccordion 的模板代碼:

<template>
  <div class="simple-accordion">
    <slot></slot>
  </div>
</template>

看起來非常簡單,接下來再寫CollapsibleItem的模板代碼:

<template>
  <div class="collapsible-item" :class="!isActive ? 'item-collapse' : ''">
    <div class="item-heading" @click="click">
      <slot name="heading"></slot>
    </div>
    <div class="item-body">
      <slot name="body"></slot>
    </div>
  </div>
</template>

兩個slot分別對應每個摺疊項的標題跟內容。如果該項被摺疊的話,那麼放置css class: item-collapse。標題容器DIV接收click事件。腳本代碼:

export default {
  name: 'CollapsibleItem',
  props: {
    selected: { default: false}
  },
  data() {
    return {
      isActive: false
    };
  },

  methods: {
    click() {
      this.$emit('itemClick', this)
    }
  },
    
  mounted() {
    this.isActive = this.selected;
  }
}

其他部分跟tabs控制項一樣,並不難理解,需要註意的是click方法,這個方法接收到滑鼠點擊事件後,在分發給它的父組件,本例中父組件就是SimpleAccordion。

 

再看SimpleAccordion的腳本代碼:

export default {
  name: 'SimpleAccordion',
  props: {
    multiple: { default: false}
  },
  data() {
    return {items: [] }
  },
  created() {
    this.items = this.$children
  },
  mounted () {
    this.items.forEach(item=>{
      item.$on('itemClick', this.itemClick)
    })
  },
  methods: {
    itemClick(clickedItem) {
      clickedItem.isActive = !clickedItem.isActive
      if(!this.multiple){
        this.items.forEach(item => {
          if(item !== clickedItem){
            item.isActive = false
          }
        })
      }
    }
  }
}

在mounted的方法中,在所有的子項上註冊事件“itemClick”,這個事件在子組件中分發。事件處理方法itemClick根據需要,激活相應的項目。

這樣這個控制項就完成了,對應的CSS:

.simple-accordion{
    flex: 1;
    width: 100%;
    overflow: auto;
    height: 0;
    display: flex;
    flex-flow: column;
    margin-top: 2px;
  }
  .simple-accordion .collapsible-item{
    display: flex;
    flex-flow: column;
    width: 100%;
  }
  .simple-accordion .item-heading{
    display: flex;
    flex-flow: row;
    flex-wrap: wrap;
    align-items: center;
    font-size: 12px;
    color:#f0f1ef;
    padding-left: 10px;
    padding-top:10px;
    padding-bottom:10px;
    padding-right:20px;
    position: relative;
    border-top:#484848 solid 1px;
    border-bottom:#282828 solid 1px;
    cursor: default;
  }

  .simple-accordion .item-heading:hover{
    background: #383838;
  }

  .simple-accordion .collapsible-item .item-heading span{
    margin-right: 5px;
  }

  .simple-accordion .collapsible-item .item-heading small{
    white-space:nowrap;
    color: #aaa;
    font-size: 11px;
  }


  .simple-accordion .collapsible-item .item-heading::after{
    position: absolute;
    content: '';
    width: 0; 
    height: 0;
    top: calc(50% -1px);
    right: 19px;
    border-width: 4px;
    border-style: solid;
    border-color: #f0f1ef transparent transparent  transparent;
  }

  .simple-accordion .item-body{
    border-top:#282828 solid 1px;
    padding: 10px;
  }

  .simple-accordion .collapsible-item.item-collapse .item-heading::after{
    position: absolute;
    content: '';
    width: 0; 
    height: 0;
    top: calc(50% -1px);
    right: 17px;
    border-width: 4px;
    border-style: solid;
    border-color:transparent transparent  transparent #f0f1ef;
  }

  .simple-accordion .collapsible-item.item-collapse .item-body{
    display: none;
  }

  .simple-accordion .item-body .element{
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    cursor: move;
    color: #c2c2c2;
    font-size: 13px;
    padding:5px 5px;
    margin:3px;
    display: flex;
    flex-flow: row;
    justify-content: space-between;
    align-items: center;
  }

  .simple-accordion .item-body .element:hover{
    color: #75b325;
    box-shadow: 2px 2px 5px 0px rgba(0, 0, 0, 0.4); 
  }
View Code

做這個控制項時,碰到了一些細小問題,調整了項目的CSS,其中比較重要的有以下幾點:

1、視窗拖動時,拖動把手會被擠沒,在把手的CCS中添加:

  flex-shrink: 0;

這樣可以避免handle被擠小擠沒

 

2、SimpleAccordion寬度設為100%,他會把父組件WidgetTabs撐大,失去拖放效果。後來追蹤到是WidgetTabs的父元素沒有設置寬度,從widgettabs到固定寬度的父容器,全部設置寬度100%:

.left-inner{

  width:100%;

}

.top-area{

  width:100%;

}

 

3、用於顯示展開閉合的箭頭,使用css繪製,具體繪製原理,請自行百度。

 

整個項目在這個歷史節點的代碼,請到我的Github上查看:https://github.com/vularsoft/studio-ui

找到該歷史節點的方法:

RXEditor是一個Boostrap代碼可視化編輯工具,本系列記錄了該軟體的開發過程,有問題的朋友請在ithub上給我留言。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 準備: —安裝RegExpBuddy軟體——專門測試正則表達式是否正確的軟體 —或是找一個正則表達式線上測試網站 1.正則表達式——Regular Expression 什麼是: 正則表達式,是專門描述字元串中字元出現規則的表達式。 為什麼: 因為程式不認識人類語言中的辭彙,所以才需要程式員用正則表 ...
  • 1.下載node.js http://nodejs.cn/download/ 推薦下載 .mis安裝包,下一步下一步... 安裝完後,通過cmd控制台輸入node -v 彈出版本號即成功 2.通過node.js中內置的npm(包/依賴)插件來下載其他開發所需的環境 註意:如設置了代理限制,可通過cm ...
  • 文檔流: 普通流:上至下,左至右 浮動流:元素添加了float:; 定位流:添加了定位屬性 定位 position:; static 預設值 absolute 絕對定位(脫離文檔流,不占位;預設參考瀏覽器零點) relative 相對定位(占據文檔流,占位置;參考自身載入在頁面中的位置) fixed ...
  • $(document).keyup(function(event){ //鍵盤按下觸法 console.log("Key: "+event.keyCode); if(event.ctrlKey && event.keyCode 67){ console.log('ctrl+V'); }}); ...
  • 我們可以使用以下命令來查看當前的 Node 版本: node -v 接下來創建我的第一個node.js應用 server.js var http=require("http");//引入http模塊 //創建伺服器 http.createServer(function(request,respons ...
  • pagination分頁組件不支持 string的數據類型,解決問題的方法是,對傳給pagination的數據進行 Number處理下 同理,發現 element ui 也是這樣,還有下拉列表的value綁定為數值的話,做編輯操作v-model 對應的參數 (介面獲取)也要由Number處理 ...
  • 這次介紹的控制項相對比較簡單,滑鼠懸停時顯示彈出內容,效果如下: 為了增加靈活性,用slot實現,調用時的代碼: <MouseOverPop class="toolbox-element"> <template #heading> <div class="element-title"> 服務 </di ...
  • 我是在安裝 electron-vue 時遇到的報錯信息,報錯圖片如下 運行安裝模板時出現報錯,究其原因是因為 vue 的問題,而不是 electron ,具體解決方法如下: 必須要以管理員身份運行 終端 ,不然會報錯。 密令: get-ExecutionPolicy set-ExecutionPol ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...