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 で Priority Queue を実装する

目次1. 優先キューの紹介2. 優先キューのカプセル化1. 優先キューの紹介通常のキューに要素が挿入...

Vueはシンプルなスライダー検証を実装する

この記事の例では、Vueスライダー検証の実装を共有しています。コードは次のとおりです。 <テン...

JS クロスドメイン ソリューション React 構成 リバース プロキシ

クロスドメインソリューションjsonp (get をシミュレート) CORS (クロスオリジンリソー...

Linux で PyCurl のエラーを解決する方法

「curl-config を実行できませんでした」の解決策 pycurl のダウンロード/解凍 (p...

Linux システム修復モード (シングル ユーザー モード)

目次序文1. シングルユーザーモードでの一般的なバグ修正2. シングルユーザーモードでシステムパスワ...

Linux で killall コマンドを使用してプロセスを終了する 8 つの例

Linux コマンドラインには、プロセスを強制終了するためのコマンドが多数用意されています。たとえば...

Alibaba CloudにMySQLをインストールする方法の詳細な説明

軽量のオープンソース データベースである MySQL は、エンタープライズ レベルのアプリケーション...

Linux で yum と入力した後に -bash: /usr/bin/yum: No such file or directory という問題を解決する方法

Linuxでyumを入力すると、プロンプトが表示されます: -bash: /usr/bin/yum:...

最も単純な ErrorBoundary コンポーネントをカプセル化して、React 例外を処理する

序文React 16から、子コンポーネントで発生したエラーを捕捉し、エラーログを記録し、ダウングレー...

JS を使用して航空機戦争の小さなゲームを実装する

この記事の例では、参考のために航空機戦争ゲームを実装するためのJSの具体的なコードを共有しています。...

npm グローバル モジュールのデフォルトのインストール パスを変更するためにノードのインストールをカスタマイズする手順

node を D ドライブにインストールしましたが、C ドライブのスペースを占有したくなかったため、...

MySQL での or ステートメントの使用例

1. MySQL での or 構文の使用、および MySQL 構文で or を使用する際の注意点。 ...

データベース管理における 19 の MySQL 最適化方法

MySQL データベースを最適化すると、データベースの冗長性を削減できるだけでなく、データベースの実...

HTML で Flash を読み込む方法 (2 つの実装方法)

最初の方法: CSSコード:コードをコピーコードは次のとおりです。 .b970-a{幅:970px;...

MySQLで時間別データと最後の時間別データの差をクエリするアイデアの詳細な説明

1. はじめに要件は、特定の時間範囲内で、1 時間ごとのデータと前の 1 時間ごとのデータの差と比率...