ShareSheet 共有パネル - Vant 4
📤 ShareSheet 共有パネル
🎯 紹介
下部から表示される共有パネル。各共有チャネルの操作ボタンを表示し、共有ロジック自体は含みません。コンテンツ共有・友達招待・保存・コピーなどで利用し、単行・複数行のオプション表示をサポートします。
📦 導入
以下の方法でコンポーネントをグローバル登録します。詳細はコンポーネント登録を参照してください。
import { createApp } from'vue'; import { ShareSheet } from'vant'; const app = createApp(); app.use(ShareSheet);🎯 コード例
🚀 基本用法
options 属性で共有オプションを定義します。各オプションは名前とアイコンを持つオブジェクトです。クリック時に select イベントが発火し、共有ロジックを処理できます。
<template>
<van-cell title="共有パネルを表示" is-link @click="showShare = true" />
<van-share-sheet
v-model:show="showShare"
title="今すぐ友達に共有"
:options="options"
@select="onSelect"
/>
</template>import { ref } from 'vue';
import { showToast } from 'vant';
export default {
setup() {
const showShare = ref(false);
const options = [
{ name: 'WeChat', icon: 'wechat' },
{ name: 'Weibo', icon: 'weibo' },
{ name: 'リンクをコピー', icon: 'link' },
{ name: 'ポスターを共有', icon: 'poster' },
{ name: 'QRコード', icon: 'qrcode' },
];
const onSelect = (option) => {
showToast(`${option.name}に共有しました`);
showShare.value = false;
};
return {
options,
onSelect,
showShare,
};
},
};📱 複数行のオプション表示
共有オプションが多い場合は複数行で表示できます。options を二次元配列にし、各子配列が1行を表します。
<template>
<van-cell title="複数行の共有オプション" is-link @click="showShare = true" />
<van-share-sheet
v-model:show="showShare"
title="共有方法を選択"
:options="options"
@select="onSelect"
/>
</template>import { ref } from 'vue';
import { showToast } from 'vant';
export default {
setup() {
const showShare = ref(false);
const options = [
[
{ name: 'WeChat', icon: 'wechat' },
{ name: 'モーメンツ', icon: 'wechat-moments' },
{ name: 'Weibo', icon: 'weibo' },
{ name: 'QQ', icon: 'qq' },
],
[
{ name: 'リンクをコピー', icon: 'link' },
{ name: 'ポスターを共有', icon: 'poster' },
{ name: 'QRコード', icon: 'qrcode' },
{ name: 'ミニプログラムコード', icon: 'weapp-qrcode' },
],
];
const onSelect = (option) => {
showToast(`${option.name}を選択しました`);
showShare.value = false;
};
return {
options,
onSelect,
showShare,
};
},
};🎨 カスタムアイコン
独自の共有アイコンを使いたい場合は、内蔵アイコンに加えてカスタム画像も指定できます。icon に画像 URL を設定してください。
<template>
<van-cell title="カスタムアイコン共有" is-link @click="showShare = true" />
<van-share-sheet
v-model:show="showShare"
title="共有アイコンをカスタム"
:options="options"
@select="onSelect"
/>
</template>import { ref } from 'vue';
import { showToast } from 'vant';
export default {
setup() {
const showShare = ref(false);
const options = [
{
name: '炎の共有',
icon: 'https://fastly.jsdelivr.net/npm/@vant/assets/custom-icon-fire.png',
},
{
name: '稲妻の共有',
icon: 'https://fastly.jsdelivr.net/npm/@vant/assets/custom-icon-light.png',
},
{
name: '水滴の共有',
icon: 'https://fastly.jsdelivr.net/npm/@vant/assets/custom-icon-water.png',
},
];
const onSelect = (option) => {
showToast(`${option.name}で共有しました`);
showShare.value = false;
};
return {
options,
onSelect,
showShare,
};
},
};📝 説明を表示
共有オプションをより詳しく表示できます。description でパネルに説明文を追加し、各オプションにも description を設定して特徴を説明できます。
<template>
<van-cell title="説明付き共有パネル" is-link @click="showShare = true" />
<van-share-sheet
v-model:show="showShare"
title="素敵な内容を共有"
description="好みの共有方法を選び、より多くの人に届けましょう"
:options="options"
@select="onSelect"
/>
</template>import { ref } from 'vue';
import { showToast } from 'vant';
export default {
setup() {
const showShare = ref(false);
const options = [
{ name: 'WeChat', icon: 'wechat' },
{ name: 'Weibo', icon: 'weibo' },
{
name: 'リンクをコピー',
icon: 'link',
description: 'クリップボードにコピー'
},
{ name: 'ポスターを共有', icon: 'poster' },
{ name: 'QRコード', icon: 'qrcode' },
];
const onSelect = (option) => {
showToast(`${option.name}で共有します`);
showShare.value = false;
};
return {
options,
onSelect,
showShare,
};
},
};📖 API
🎛️ Props
| 属性名 | 説明 | 型 | デフォルト |
|---|---|---|---|
| v-model:show | 🎭 共有パネルの表示(双方向バインディング) | boolean | false |
| options | 📋 共有オプション一覧(単行/複数行レイアウト対応) | Option[] | [] |
| title | 🏷️ 上部タイトル | string | - |
| cancel-text | ❌ キャンセルボタン文言(空文字で非表示) | string | '取消' |
| description | 📝 タイトル下の説明文 | string | - |
| duration | ⏱️ アニメーション時間(秒)。0 で無効化 | number | string | 0.3 |
| z-index | 📚 パネルの z-index | number | string | 2000+ |
| round | 🔘 角丸枠を表示するか | boolean | true |
| overlay | 🎭 背景オーバーレイを表示するか | boolean | true |
| overlay-class | 🎨 オーバーレイのカスタムクラス | string | Array | object | - |
| overlay-style | 🎨 オーバーレイのカスタムスタイル | object | - |
| lock-scroll | 🔒 背景スクロールをロックするか | boolean | true |
| lazy-render | 🚀 表示時にのみ内容をレンダリングするか | boolean | true |
| close-on-popstate | 🔙 ページバック時に自動で閉じるか | boolean | true |
| close-on-click-overlay | 👆 オーバーレイクリックで閉じるか | boolean | true |
| safe-area-inset-bottom | 📱 下部セーフエリア適応を有効化するか | boolean | true |
| teleport | 🎯 マウント先のノードを指定 | string | Element | - |
| before-close | 🚪 閉じる前のコールバック。false で閉じるのを阻止 | (action: string) => boolean | Promise<boolean> | - |
📋 Option データ構造
options はオブジェクト配列です。各オブジェクトが共有オプションを表します:
| キー名 | 説明 | 型 |
|---|---|---|
| name | 📝 共有チャネル名 | string |
| description | 💬 共有オプションの説明 | string |
| icon | 🎨 アイコン(内蔵アイコンまたは画像 URL) | string |
| className | 🎭 共有オプションのカスタムクラス名 | string |
🎯 Events
| イベント名 | 説明 | コールバック引数 |
|---|---|---|
| select | 🎯 共有オプションをクリック時に発火 | option: Option, index: number |
| cancel | ❌ キャンセルボタンをクリック時に発火 | - |
| open | 🚀 パネルを開いたときに発火 | - |
| close | 🔚 パネルを閉じたときに発火 | - |
| opened | ✅ パネルを開き、アニメーション終了後に発火 | - |
| closed | ✅ パネルを閉じ、アニメーション終了後に発火 | - |
| click-overlay | 👆 オーバーレイをクリック時に発火 | event: MouseEvent |
🎨 Slots
| 名称 | 説明 |
|---|---|
| title | 🏷️ 上部タイトルのカスタマイズ |
| description | 📝 説明文のカスタマイズ |
| cancel | ❌ キャンセルボタンのカスタマイズ |
📝 型定義
コンポーネントは以下の型定義をエクスポートし、TypeScript での開発を容易にします:
import type {
ShareSheetProps,
ShareSheetOption,
ShareSheetOptions
} from 'vant';🎨 テーマカスタマイズ
🎛️ スタイル変数
コンポーネントは以下の CSS 変数を提供しており、カスタムスタイルに使用できます。使用方法については ConfigProvider コンポーネント を参照してください。
| 名称 | デフォルト値 | 説明 |
|---|---|---|
| --van-share-sheet-header-padding | var(--van-padding-sm) var(--van-padding-md) var(--van-padding-base) | 🔲 ヘッダー領域の内側余白 |
| --van-share-sheet-title-color | var(--van-text-color) | 🎨 タイトル文字色 |
| --van-share-sheet-title-font-size | var(--van-font-size-md) | 📝 タイトル文字サイズ |
| --van-share-sheet-title-line-height | var(--van-line-height-md) | 📏 タイトル行の高さ |
| --van-share-sheet-description-color | var(--van-text-color-2) | 🎨 説明文字色 |
| --van-share-sheet-description-font-size | var(--van-font-size-sm) | 📝 説明文字サイズ |
| --van-share-sheet-description-line-height | 16px | 📏 説明文字の行の高さ |
| --van-share-sheet-icon-size | 48px | 🎨 共有アイコンサイズ |
| --van-share-sheet-option-name-color | var(--van-gray-7) | 🎨 オプション名の色 |
| --van-share-sheet-option-name-font-size | var(--van-font-size-sm) | 📝 オプション名の文字サイズ |
| --van-share-sheet-option-description-color | var(--van-text-color-3) | 🎨 オプション説明の色 |
| --van-share-sheet-option-description-font-size | var(--van-font-size-sm) | 📝 オプション説明の文字サイズ |
| --van-share-sheet-cancel-button-font-size | var(--van-font-size-lg) | 📝 キャンセルボタン文字サイズ |
| --van-share-sheet-cancel-button-height | 48px | 📏 キャンセルボタンの高さ |
| --van-share-sheet-cancel-button-background | var(--van-background-2) | 🎨 キャンセルボタンの背景色 |
よくある質問
共有ロジックはどう実装する?
アプリやブラウザごとに共有 API や方法は異なります。そのため ShareSheet コンポーネントは共有ロジックを提供しません。業務に合わせて実装してください。
WeChat 内共有
WeChat は共有 API を提供していないため、右上の共有から行うよう案内してください。
アプリ内共有
JSBridge を通じてネイティブアプリの SDK を呼び出し共有します。
ポスターや QR コードの共有
画像は Popup コンポーネントでレイヤー表示し、保存して共有するよう案内してください。
📚 関連ドキュメント
🎭 レイヤーコンポーネント
- ActionSheet アクションパネル - 📋 下部から表示される操作メニュー。共有パネルに類似
- Popup ポップアップ - 🎪 汎用ポップアップコンテナ。共有パネルの基盤
- Dialog ダイアログ - 💬 モーダルダイアログ。確認・提示機能を提供
🎨 表示コンポーネント
- Icon アイコン - 🎨 豊富なアイコンライブラリ。共有オプションの視覚的識別に
- Cell セル - 📱 リスト項目コンポーネント。共有オプションの構築に利用
- Grid グリッド - 🔲 複数オプションの表示に適したグリッドレイアウト
🔧 ツールコンポーネント
- ConfigProvider グローバル設定 - ⚙️ グローバル設定プロバイダ。テーマスタイルの統一管理
- Overlay オーバーレイ - 🎭 背景オーバーレイ効果を提供
- Toast トースト - 💡 操作フィードバックを表示する軽量コンポーネント