Vue.jsはシンプルな折りたたみパネルを実装します

Vue.jsはシンプルな折りたたみパネルを実装します

この記事では、Vue.jsの具体的なコードを共有して、シンプルな折りたたみパネルを実装する例を紹介します。具体的な内容は次のとおりです。

コードは次のとおりです。

メインファイル: app.vue

<テンプレート>
  <div id="アプリ">
    <img alt="Vue ロゴ" src="./assets/logo.png">
    <崩壊>
      <collpase-item
        :title="アイテム名"
        :showAnimation="true"
        v-for="(item, i) が chapterList 内にあります"
        :key="i"
      >
        <div class="list" v-for="(it, index) in item.list" :key="index">
          {{it.name}}
        </div>
      </collpase-item>
    </折りたたむ>
  </div>
</テンプレート>

<スクリプト>
'./components/Collpase.vue' から Collpase をインポートします。
'./components/CollpaseItem.vue' から CollpaseItem をインポートします。

エクスポートデフォルト{
  名前: 'アプリ'、
  データ() {
    戻る {
      章リスト: [
        {
          名前: 'タイトル1'、
          リスト: [
            {
              名前:「はい、はい、はい、はい、はい」
            },
            {
              名前: 「ああああ」
            }
          ]
        },
        {
          名前: 'タイトル2'、
          リスト: [
            {
              名前:「はい、はい、はい、はい、はい」
            },
            {
              名前: 「ああああ」
            },
            {
              名前: 「ああああ」
            }
          ]
        }
      ]
    }
  },
  コンポーネント:
    崩壊、
    折りたたむアイテム、
  }
}
</スクリプト>

<スタイル>
#アプリ {
  フォントファミリー: Avenir、Helvetica、Arial、sans-serif;
  -webkit-font-smoothing: アンチエイリアス;
  -moz-osx-font-smoothing: グレースケール;
  テキスト配置: 中央;
  色: #2c3e50;
  上マージン: 60px;
}
</スタイル>

サブコンポーネント:

<テンプレート>
 <div class="collapse">
  <スロット />
 </div>
</テンプレート>
<スクリプト>
 エクスポートデフォルト{
  名前: 「崩壊」
  小道具: {
   アコーディオン: {
    タイプ: [ブール値、文字列],
    デフォルト: false
   }
  },
  提供する() {
   戻る {
    崩壊:これ
   }
  },
  作成された() {
   this.childrens = []
  },
  メソッド: {
   オンチェンジ() {
    アクティブアイテムを [] にする
    this.childrens.forEach((vm) => {
     (vm.isOpen)の場合{
      アクティブアイテムをプッシュします(vm.nameSync)
     }
    })
    this.$emit('change', アクティブアイテム)
   }
  }
 }
</スクリプト>
<style lang="css" スコープ>
 。崩壊 {
  幅: 100%;
  ディスプレイ: フレックス;
  フレックス: 1;
  flex-direction: 列;
 }
</スタイル>

サブコンポーネント:

<テンプレート>
 <div>
    <div :class="{ 'collapse-disabled': 無効、'collapse-cell--notdisabled': !disabled、'collapse-cell--open': isOpen、'collapse-cell--hide': !isOpen }" class="collapse-cell">
      <div :class="{ 'collapse-disabled': disabled}" class="collapse-cell__title" @click="onClick">
        <span class="collapse-cell__title-text">{{ タイトル }}</span>
        <img :class="{ 'active': isOpen, 'active-animation': showAnimation === true }" class="title-arrow" src="https://static-mumway.oss-cn-zhangjiakou.aliyuncs.com/NetworkFrontEnd/wsj/yslbq/btn_dropdown.png"/>
      </div>
      <div :class="{'collapse-cell__content--hide':!isOpen}" class="collapse-cell__content">
        <div :class="{ 'active-animation': showAnimation === true }" class="collapse-cell__wrapper" :style="{'transform':isOpen?'translateY(0)':'translateY(-50%)','-webkit-transform':isOpen?'translateY(0)':'translateY(-50%)'}">
          <スロット />
        </div>
      </div>
    </div>
  </div>
</テンプレート>

<スクリプト>
 エクスポートデフォルト{
  名前: 'UniCollapseItem',
  小道具: {
   タイトル:
    // リストタイトルタイプ: 文字列、
    デフォルト: ''
   },
   名前: {
    // 一意の識別子タイプ: [数値、文字列],
    デフォルト: 0
   },
   無効:
    // 無効にするかどうか type: Boolean,
    デフォルト: false
   },
   アニメーションを表示:
    // アニメーションを表示するかどうかのタイプ: ブール値、
    デフォルト: false
   },
   開ける:
    // 展開するかどうか type: Boolean,
    デフォルト: false
   },
   親指:
    // サムネイルタイプ: 文字列、
    デフォルト: ''
   }
  },
  データ() {
   戻る {
    isOpen: 偽
   }
  },
  時計:
   開く(val) {
    this.isOpen = val
   }
  },
  挿入: ['collapse'],
  作成された() {
   this.isOpen = this.open
   this.nameSync = this.name ? this.name : this.collapse.childrens.length
   this.collapse.childrens.push(これ)
   if (String(this.collapse.accordion) === 'true') {
    if (this.isOpen) {
     lastEl = this.collapse.childrens[this.collapse.childrens.length - 2]とします。
     if (lastEl) {
      this.collapse.childrens[this.collapse.childrens.length - 2].isOpen = false
     }
    }
   }
  },
  メソッド: {
   クリック() {
    無効の場合
     戻る
    }
    if (String(this.collapse.accordion) === 'true') {
     this.collapse.childrens.forEach(vm => {
      (vm === this) の場合 {
       戻る
      }
      vm.isOpen = 偽
     })
    }
    this.isOpen = !this.isOpen
    this.collapse.onChange と this.collapse.onChange()
    this.$forceUpdate()
   }
  }
 }
</スクリプト>

<style lang="css" スコープ>
 .collapse-cell {
  flex-direction: 列;
  境界線の色: #f0f0f0;
  境界線の下の幅: 1px;
 }
 .collapse-cell--open {
  背景色: #fff;
 }
 .collapse-disabled {
  カーソル: 許可されていません !important;
 }
 .collapse-cell--hide {
  高さ: 48px;
 }
 .アクティブアニメーション{
  遷移プロパティ: transform;
  遷移期間: 0.3秒;
  遷移タイミング関数: イージー;
 }

 .collapse-cell__title {
  下境界線: 1px 実線 #f0f0f0;
  パディング: 12px 20px;
  位置: 相対的;
  ディスプレイ: フレックス;
  幅: 100%;
  ボックスのサイズ: 境界線ボックス;
  高さ: 44px;
  行の高さ: 44px;
  flex-direction: 行;
  コンテンツの両端揃え: スペースの間;
  アイテムの位置を中央揃えにします。
  カーソル: ポインタ;
 }
 .collapse-cell__title-img {
  右マージン: 10px;
 }
 .title-arrow {
  幅: 22px;
  高さ: 14px;
 }
 。アクティブ {
  変換: 回転(180度);
 }
 .collapse-cell__title-text {
  フレックス: 1;
  フォントサイズ: 16px;
  右マージン: 16px;
  空白: ラップなし;
  色: #333333;
    フォントの太さ: 太字;
  行数: 1;
  オーバーフロー: 非表示;
  テキストオーバーフロー: 省略記号;
 }
 .collapse-cell__content {
  オーバーフロー-x:非表示;
 }
 .collapse-cell__wrapper {
  ディスプレイ: フレックス;
  flex-direction: 列;
 }
 .collapse-cell__content--hide {
  高さ: 0px;
  行の高さ: 0px;
 }
</スタイル>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue ページ内の公開マルチタイプ添付画像アップロード領域と適用可能な折りたたみパネル (サンプルコード)
  • Vuejsは折りたたみパネルの拡大・縮小アニメーション効果を実現します
  • Vue折りたたみパネルコンポーネントのカプセル化

<<:  きちんとしたHTMLマークアップを使用してページを構築します

>>:  CSS中級者向けアダプティブレイアウトの5つのソリューションの詳細な説明

推薦する

JavaScript Canvas で三目並べゲームを実装

この記事では、JavaScript Canvasで三目並べゲームを実装するための具体的なコードを参考...

Linux ps および pstree コマンドの知識ポイントのまとめ

Linux の ps コマンドは Process Status の略です。 ps コマンドは、システ...

ウェブページ作成時に標準 HTML コードを使用する際のポイント

多くの Web サイト デザイナーが犯す最も一般的な間違いは、Web ページが IE で正常に表示さ...

Node.js はクライアントリクエストデータ内の中国語文字化けの問題を解決します

Node.js はクライアントリクエストデータ内の中国語文字化けの問題を解決しますコード例: var...

HTML(CSSスタイル仕様)を読む必要があります

CSS スタイル仕様1. クラスセレクター2. タグセレクター3. IDセレクター4. CSSスタイ...

Vue のスロットとフィルターの詳細な説明

目次スロットスロットとは何ですか?スロットの内容コンパイルスコープフォールバックコンテンツ名前付きス...

MySQL 8.0はJSONを扱えるようになりました

目次1. 概要2. JSON基本ツール3. JSONパス式4. JSONを検索して変更する序文:長い...

JavaScript ECharts の使用方法の説明

以前、プロジェクトを行う際に ECharts を使用しました。今日はそれをメモとして整理し、より多く...

優れたユーザー インターフェース デザインのための 37 のヒント (画像付き)

1. 複数列レイアウトではなく、単一列レイアウトを使用する1 列のレイアウトにより、全体的な状況をよ...

HTMLファイルとは何ですか?HTMLファイルを開く方法

HTML は Hypertext Markup Language の略です。現在、ほとんどの Web...

MySQLデータベースは何をするのか

MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース...

JavaScript 配列重複排除問題の詳細な研究

目次序文 👀リサーチを始めましょう🐱‍🏍オリジナル🧶 indexOf を使用した元の方法の最適化 ✍...

Mysql テーブル、列、データベースの追加、削除、変更、クエリの問題の概要

以下は私がまとめた基本的なSQL知識です。主に参考資料として、また将来の他の初心者の助けとして、私自...