Skip to content

DropdownMenu ドロップダウンメニュー - Vant 4

📋 DropdownMenu ドロップダウンメニュー

🎯 紹介

ショッピングサイトを見ているとき、商品を素早く絞り込むための便利なツールが欲しくなりませんか?DropdownMenu ドロップダウンメニューコンポーネントはまさにそのような素晴らしい存在です!✨

魔法の箱のように、軽くタップするだけで様々なオプションが展開され、ユーザーは多くの選択肢の中から簡単に目的の内容を見つけることができます。商品のカテゴリ、並び替え方法、その他の絞り込み条件など、DropdownMenu は複雑な選択をシンプルで楽しいものに変えてくれます!🎪

📦 導入

以下の方法でグローバルにコンポーネントを登録します。詳細な登録方法については、コンポーネントの登録を参照してください。

js
import { createApp } from 'vue';
import { DropdownMenu, DropdownItem } from 'vant';

const app = createApp();
app.use(DropdownMenu);
app.use(DropdownItem);

🎯 コードのデモ

🔧 基本的な使い方

最もシンプルなドロップダウンメニューはブロックを積むように簡単です!オプションのデータを準備するだけで、DropdownMenu は美しく実用的なドロップダウンセレクターを表示してくれます。以下の例を見てください。とても簡単に使えますね!🎮

html
<template>
  <van-dropdown-menu>
    <van-dropdown-item v-model="value1" :options="option1" />
    <van-dropdown-item v-model="value2" :options="option2" />
  </van-dropdown-menu>
</template>

<script setup>
import { ref } from 'vue';

const value1 = ref(0);
const value2 = ref('a');
const option1 = [
  { text: '全ての商品', value: 0 },
  { text: '新商品', value: 1 },
  { text: 'イベント商品', value: 2 },
];
const option2 = [
  { text: 'デフォルトの並び替え', value: 'a' },
  { text: '評判順', value: 'b' },
  { text: '販売数順', value: 'c' },
];
</script>

🎨 メニューのカスタマイズ

標準的なオプションリストではクリエイティブなニーズを満たせない場合もありますが、心配しないでください!DropdownMenu は変幻自在なマジシャンのようで、スロット機能を使用して、ドロップダウンメニューにスイッチボタン、スライダー、さらには小さなゲームまで、あらゆるものを配置することができます!🎭

カスタムコンテンツを使用する場合は、テレビのリモコンのように、メニューの開閉を手動で制御することを忘れないでください。

html
<template>
  <van-dropdown-menu ref="menuRef">
    <van-dropdown-item ref="itemRef" title="カスタムコンテンツ">
      <!-- カスタムコンテンツ -->
      <div class="custom-content">
        <div class="custom-content__switch">
          <span>表示オプション1</span>
          <van-switch v-model="switch1" />
        </div>
        <div class="custom-content__switch">
          <span>表示オプション2</span>
          <van-switch v-model="switch2" />
        </div>
        <div class="custom-content__buttons">
          <van-button type="default" block @click="onConfirm">確認</van-button>
        </div>
      </div>
    </van-dropdown-item>
  </van-dropdown-menu>
</template>

<script setup>
import { ref } from 'vue';

const menuRef = ref(null);
const itemRef = ref(null);
const switch1 = ref(false);
const switch2 = ref(false);

const onConfirm = () => {
  itemRef.value.toggle();
  // または
  // menuRef.value.close();
};
</script>

<style>
.custom-content {
  padding: 16px;
}

.custom-content__switch {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 12px 0;
}

.custom-content__buttons {
  margin-top: 8px;
}
</style>

🌈 選択状態の色をカスタマイズ

ドロップダウンメニューにもっと個性を与えたいですか?それはメニューに違う色の新しい服を着せるようなものです!active-color 属性を使用すると、選択されたオプションに好みの色をつけることができ、インターフェース全体をブランドの雰囲気に合わせることができます。🎨

html
<template>
  <van-dropdown-menu active-color="#ee0a24">
    <van-dropdown-item v-model="value" :options="options" />
  </van-dropdown-menu>
</template>

<script setup>
import { ref } from 'vue';

const value = ref(0);
const options = [
  { text: '全ての商品', value: 0 },
  { text: '新商品', value: 1 },
  { text: 'イベント商品', value: 2 },
];
</script>

🏃‍♂️ 横スクロール

オプションが多すぎてメニューバーに収まらない場合はどうしますか?心配しないでください!DropdownMenu は横スクロール機能をサポートしています。厚いアルバムをめくるように、左右にスワイプするだけでより多くのオプションを見ることができます。swipe-threshold 属性を使用すると、このスクロール機能をいつ有効にするかをカスタマイズすることもできます!📱

html
<template>
  <van-dropdown-menu swipe-threshold="4">
    <van-dropdown-item v-model="value1" :options="option1" />
    <van-dropdown-item v-model="value2" :options="option2" />
    <van-dropdown-item v-model="value3" :options="option3" />
    <van-dropdown-item v-model="value4" :options="option4" />
    <van-dropdown-item v-model="value5" :options="option5" />
  </van-dropdown-menu>
</template>

<script setup>
import { ref } from 'vue';

const value1 = ref(0);
const value2 = ref('a');
const value3 = ref('x');
const value4 = ref(100);
const value5 = ref(true);

const createOptions = (prefix, count) => {
  return Array.from({ length: count }, (_, i) => ({
    text: `${prefix} ${i + 1}`,
    value: i,
  }));
};

const option1 = createOptions('オプションA', 3);
const option2 = createOptions('オプションB', 3);
const option3 = createOptions('オプションC', 3);
const option4 = createOptions('オプションD', 3);
const option5 = createOptions('オプションE', 3);
</script>

⬆️ 上方向に展開

ボタンが画面の下部にある場合など、メニューを上方向に展開する必要があることもあります。directionup に設定するだけで、メニューは風船のように上方向に展開されます!🎈

html
<template>
  <div style="padding: 200px 0;">
    <van-dropdown-menu direction="up">
      <van-dropdown-item v-model="value" :options="options" />
    </van-dropdown-menu>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const value = ref(0);
const options = [
  { text: '全ての商品', value: 0 },
  { text: '新商品', value: 1 },
  { text: 'イベント商品', value: 2 },
];
</script>

🚫 メニューを無効にする

一時的に特定のメニューアイテムが使用できない場合があります。これはお店の「一時的に在庫切れ」のラベルのようなものです。無効化機能を使用すると、ユーザーにこのオプションが現在選択できないことを伝え、混乱を避けることができます。

html
<template>
  <van-dropdown-menu>
    <van-dropdown-item v-model="value1" :options="option1" />
    <van-dropdown-item v-model="value2" :options="option2" disabled />
  </van-dropdown-menu>
</template>

<script setup>
import { ref } from 'vue';

const value1 = ref(0);
const value2 = ref('a');
const option1 = [
  { text: '全ての商品', value: 0 },
  { text: '新商品', value: 1 },
];
const option2 = [
  { text: 'デフォルトの並び替え', value: 'a' },
  { text: '評判順', value: 'b' },
];
</script>

API

パラメータ説明デフォルト値
active-colorメニューのタイトルとオプションの選択状態の色string#1989fa
directionメニューの展開方向、up が使用可能stringdown
z-indexメニューバーの z-index 階層number | string10
durationアニメーションの期間(秒単位)、0 に設定するとアニメーションを無効にできますnumber | string0.2
overlayマスクレイヤーを表示するかどうかbooleantrue
close-on-click-overlayマスクレイヤーをクリックした後にメニューを閉じるかどうかbooleantrue
close-on-click-outside外部要素をクリックした後にメニューを閉じるかどうかbooleantrue
swipe-thresholdスクロールのしきい値。オプションの数がしきい値を超え、合計幅がメニューバーの幅を超えると、横スクロールが可能になりますnumber | string-
auto-locate祖先要素に transform が設定されている場合、ドロップダウンメニューの位置を自動的に調整しますbooleanfalse
パラメータ説明デフォルト値
v-model現在の選択アイテムに対応する valuenumber | string-
titleメニューアイテムのタイトルstring現在の選択アイテムのテキスト
optionsオプションの配列Option[][]
disabledメニューを無効にするかどうかbooleanfalse
lazy-render初めて展開するときにのみメニューの内容をレンダリングするかどうかbooleantrue
title-classタイトルの追加クラス名string | Array | object-
teleportマウントするノードを指定します。Teleport コンポーネントの to 属性 と同等ですstring | Element-
イベント名説明コールバック引数
changeオプションをクリックして value が変更されたときにトリガーされますvalue
openメニューバーを開くときにトリガーされます-
closeメニューバーを閉じるときにトリガーされます-
openedメニューバーを開いてアニメーションが終了した後にトリガーされます-
closedメニューバーを閉じてアニメーションが終了した後にトリガーされます-
名前説明
defaultメニューの内容
titleメニューアイテムのタイトルをカスタマイズ

ref を使用して DropdownMenu インスタンスを取得し、インスタンスメソッドを呼び出すことができます。詳細については、コンポーネントインスタンスメソッドを参照してください。

メソッド名説明パラメータ戻り値
closeすべてのメニューの表示状態を閉じます--

ref を使用して DropdownItem インスタンスを取得し、インスタンスメソッドを呼び出すことができます。詳細については、コンポーネントインスタンスメソッドを参照してください。

メソッド名説明パラメータ戻り値
toggleメニューの表示状態を切り替えます。true を渡すと表示、false を渡すと非表示、パラメータを渡さないと反転しますshow?: boolean-

型定義

コンポーネントは以下の型定義をエクスポートします:

ts
import type {
  DropdownMenuProps,
  DropdownItemProps,
  DropdownItemOption,
  DropdownItemInstance,
  DropdownMenuInstance,
  DropdownMenuDirection,
} from 'vant';

DropdownMenuInstanceDropdownItemInstance はコンポーネントインスタンスの型で、次のように使用します:

ts
import { ref } from 'vue';
import type { DropdownMenuInstance, DropdownItemInstance } from 'vant';

const dropdownMenuRef = ref<DropdownMenuInstance>();
const dropdownItemRef = ref<DropdownItemInstance>();

dropdownMenuRef.value?.close();
dropdownItemRef.value?.toggle();

Option データ構造

キー名説明
textテキストstring
value識別子number | string | boolean
disabledオプションを無効にするかどうかboolean
icon左側のアイコン名または画像リンク。Icon コンポーネントの name 属性 と同等ですstring

テーマカスタマイズ

スタイル変数

コンポーネントは次の CSS 変数を提供しており、ConfigProvider コンポーネントを参照して、カスタマイズすることができます。

名称デフォルト値説明
--van-dropdown-menu-height48px-
--van-dropdown-menu-backgroundvar(--van-background-2)-
--van-dropdown-menu-shadow0 2px 12px fade(var(--van-gray-7), 12)-
--van-dropdown-menu-title-font-size15px-
--van-dropdown-menu-title-text-colorvar(--van-text-color)-
--van-dropdown-menu-title-active-text-colorvar(--van-primary-color)-
--van-dropdown-menu-title-disabled-text-colorvar(--van-text-color-2)-
--van-dropdown-menu-title-padding0 var(--van-padding-xs)-
--van-dropdown-menu-title-line-heightvar(--van-line-height-lg)-
--van-dropdown-menu-option-active-colorvar(--van-primary-color)-
--van-dropdown-menu-option-disabled-colorvar(--van-text-color-3)-
--van-dropdown-menu-content-max-height80%-
--van-dropdown-item-z-index10-

🤔 よくある質問

親要素に transform を設定すると、ドロップダウンメニューの位置が間違ってしまいますか?

ドロップダウンメニューが迷子の子供のように、不思議な位置に表示されることがあります。これは通常、DropdownMenuTabs など transform が設定されたコンポーネントの内部に配置した場合に発生します。

これは移動する電車の車両内に物を置くようなもので、座標系が変化します!CSS の fixed 位置は、ページ全体ではなく、transform が設定された親要素に対して位置を計算します。

心配しないでください!解決策は簡単です!迷子の子供に家への道を示すように、DropdownItemteleport 属性を body に設定して、メニューをページのルートに直接「テレポート」します:

html
<van-dropdown-item teleport="body" />

または、DropdownMenuauto-locate 属性を true に設定して、コンポーネントに自動的に正しい位置を見つけさせることもできます:

html
<van-dropdown-menu auto-locate="true" />

🔗 関連ドキュメント

DropdownMenu を使用する際には、次のような関連コンポーネントも役立つことがあります。これらは仲良しの友人のように、プロジェクトでよく一緒に登場します:

  • Popup ポップアップ - ドロップダウンメニューの基盤となる実装。これを理解すると、メニューの動作原理をより深く理解することができます
  • ActionSheet アクションシート - もう一つの選択方法。特にモバイル端末の下部からのポップアップ選択に適しています
  • Picker ピッカー - オプションが多く、階層関係がある場合に最適な選択肢です
  • Tab タブ - DropdownMenu とよく組み合わせて使用され、ページの分類と絞り込み機能を実現します
  • NavBar ナビゲーションバー - ドロップダウンメニューは多くの場合、ナビゲーションバーに配置され、クイックフィルタリング機能を提供します
  • Search 検索 - ドロップダウンメニューと組み合わせることで、より強力なコンテンツの絞り込み機能を提供します
  • Button ボタン - ドロップダウンメニューをトリガーするための一般的なコンポーネント
  • Icon アイコン - メニューオプションにアイコンを追加し、インターフェースをより直感的で美しくします

Vant に基づく企業向けモバイルソリューション