ページ Vue コンポーネント

Framework7 における「ページ」は、Web ページについて考えるときと同じ意味を持ちます。ページは、コンテンツを表示および操作するためのメインのコンポーネントです。

ページ Vue コンポーネントは、Framework7 のページを表します。

ページコンポーネント

以下のコンポーネントが含まれています

ページプロパティ

プロパティデフォルト説明
<f7-page> プロパティ
name文字列ページ名
messages-content真偽値メッセージコンポーネントを内部で使用する場合に必要な追加スタイルを適用するために有効化します
page-content真偽値true有効にすると、内部にpage-content要素が自動的に追加されます。タブのために複数の page-content 要素を使用する必要がある場合に無効化すると便利です
tabs真偽値ページをタブラッパーとして使用する場合は有効にします
login-screen真偽値ページ内でログイン画面を使用する場合に必要な追加スタイルを適用するために有効化します
no-swipeback真偽値現在のページのswipeback機能を無効にします(iOSテーマのみに影響します)
with-subnavbar真偽値ページ内にサブナビバーがある場合は有効にします
no-navbar真偽値共通のナビバーレイアウトを使用しており、このページで共通のナビバーを非表示にする(または別のナビバーを使用する)必要がある場合は有効にします(iOSテーマのみに影響します)
no-toolbar真偽値共通のツールバー/タブバーレイアウトを使用しており、このページでツールバーを非表示にする(または別のツールバーを使用する)必要がある場合は有効にします
hide-bars-on-scroll真偽値ページスクロールでナビバーとツールバーを非表示にします
hide-navbar-on-scroll真偽値ページスクロールでナビバーを非表示にします
hide-toolbar-on-scroll真偽値ページスクロールでツールバーを非表示にします
ptr真偽値プルリフレッシュを有効にします
ptr-distance数値プルリフレッシュのトリガー距離をカスタム設定します。デフォルト(指定されていない場合)は 44px です。
ptr-preloader真偽値trueカスタムのプルリフレッシュプリローダー要素を使用する場合は無効にします
ptr-bottom真偽値false下からのプルリフレッシュを有効にします
ptr-mousewheel真偽値falseマウスホイールでプルリフレッシュを有効にします(デスクトップアプリの場合)。PTR上部でのみ動作します
infinite真偽値無限スクロールを有効にします
infinite-top真偽値ページ上部の無限スクロールを有効にします
infinite-distance数値無限スクロールイベントをトリガーするためのページ下部からの距離(px単位)。デフォルト(指定されていない場合)は 50 (px) です。
infinite-preloader真偽値trueカスタムの無限スクロールプリローダーを使用する場合は無効にします
<f7-page-content> プロパティ
tab真偽値page-contentをタブとして使用する場合は有効にします
tab-active真偽値現在のタブがアクティブな場合に有効にします
ptr
ptr-distance
ptr-preloader
ptr-bottom
ptr-mousewheel
infinite
infinite-top
infinite-distance
infinite-preloader
hide-bars-on-scroll
hide-navbar-on-scroll
hide-toolbar-on-scroll
messages-content
login-screen
<f7-page> プロパティと同じ

ページイベント

イベント説明
<f7-page> イベント
page:mountedkeepAliveルートを持つページがDOMにマウント/アタッチされるとトリガーされます
page:initFramework7がページのコンポーネントとナビバーの初期化に必要な処理を完了するとトリガーされます
page:reinitすでに初期化されたページに移動した場合にトリガーされます
page:beforeinすべての初期化が完了し、ページがビューに切り替える(アクティブ/現在の位置に移動する)準備ができたときにトリガーされます
page:afterinページがビューに切り替わった後にトリガーされます
page:beforeoutページがビューから切り替わる直前にトリガーされます
page:afteroutページがビューから切り替わった後にトリガーされます
page:beforeunmountkeepAliveルートを持つページがDOMからアンマウント/デタッチされる直前にトリガーされます
page:beforeremoveページがDOMから削除される直前にトリガーされます。このイベントは、メモリを解放するために一部のイベントをデタッチしたり、プラグインを破棄する必要がある場合に非常に役立ちます。このイベントは、keepAliveルートではトリガーされません。
page:tabshowページの親であるビューをタブとして可視になった場合にトリガーされます
page:tabhideページの親であるビューをタブとして非表示になった場合にトリガーされます
ptr:pullstartプルリフレッシュコンテンツの移動を開始したときにトリガーされます
ptr:pullmoveプルリフレッシュコンテンツの移動中にトリガーされます
ptr:pullendプルリフレッシュコンテンツを離したときにトリガーされます
ptr:refreshプルリフレッシュが「リフレッシュ中」状態になったときにトリガーされます
ptr:doneプルリフレッシュが完了し、初期状態に戻った後にトリガーされます(pullToRefreshDoneメソッドの呼び出し後)
infiniteページスクロールが下端からの指定された(data-distance属性に指定された)距離に到達したときにトリガーされます。
<f7-page-content> イベント
tab:showタブが可視/アクティブになったときにトリガーされます
tab:hideタブが非表示/非アクティブになったときにトリガーされます
ptr:pullstart
ptr:pullmove
ptr:pullend
ptr:refresh
ptr:done
infinite
<f7-page> イベントと同じ

ページスロット

ページ Vue コンポーネント(<f7-page>)には、カスタム要素用の追加スロットがあります

<f7-page>
  <div slot="fixed">Fixed element</div>
  <p>Page content goes here</p>
</f7-page>

<!-- Renders to: -->

<div class="page">
  <div>Fixed element</div>
  <div class="page-content">
    <p>Page content goes here</p>
  </div>
</div>

無限スクロール

infinite-scroll.vue
<template>
  <f7-page
    infinite
    :infinite-distance="50"
    :infinite-preloader="showPreloader"
    @infinite="loadMore"
  >
    <f7-navbar title="Infinite Scroll"></f7-navbar>
    <f7-block-title>Scroll bottom</f7-block-title>
    <f7-list strong-ios outline-ios dividers-ios>
      <f7-list-item
        v-for="(item, index) in items"
        :key="index"
        :title="`Item ${item}`"
      ></f7-list-item>
    </f7-list>
  </f7-page>
</template>
<script>
import { f7Navbar, f7Page, f7BlockTitle, f7List, f7ListItem } from 'framework7-vue';

export default {
  components: {
    f7Navbar,
    f7Page,
    f7BlockTitle,
    f7List,
    f7ListItem,
  },
  data() {
    return {
      items: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
      allowInfinite: true,
      showPreloader: true,
    };
  },
  methods: {
    loadMore() {
      const self = this;
      if (!self.allowInfinite) return;
      self.allowInfinite = false;

      setTimeout(() => {
        if (self.items.length >= 200) {
          self.showPreloader = false;
          return;
        }

        const itemsLength = self.items.length;

        for (let i = 1; i <= 20; i += 1) {
          self.items.push(itemsLength + i);
        }

        self.allowInfinite = true;
      }, 1000);
    },
  },
};
</script>

プルリフレッシュ

pull-to-refresh.vue
<template>
  <f7-page ptr :ptr-mousewheel="true" @ptr:refresh="loadMore">
    <f7-navbar title="Pull To Refresh"></f7-navbar>
    <f7-list media-list strong-ios dividers-ios outline-ios>
      <f7-list-item
        v-for="(item, index) in items"
        :key="index"
        :title="item.title"
        :subtitle="item.author"
      >
        <template #media>
          <img :src="item.cover" width="44" style="border-radius: 8px" />
        </template>
      </f7-list-item>

      <f7-block-footer>
        <p>
          Just pull page down to let the magic happen.<br />Note that pull-to-refresh feature is
          optimised for touch and native scrolling so it may not work on desktop browser.
        </p>
      </f7-block-footer>
    </f7-list>
  </f7-page>
</template>
<script>
import { f7Navbar, f7Page, f7List, f7ListItem, f7BlockFooter } from 'framework7-vue';

export default {
  components: {
    f7Navbar,
    f7Page,
    f7List,
    f7ListItem,
    f7BlockFooter,
  },
  data() {
    return {
      items: [
        {
          title: 'Yellow Submarine',
          author: 'Beatles',
          cover: 'https://cdn.framework7.io/placeholder/abstract-88x88-1.jpg',
        },
        {
          title: "Don't Stop Me Now",
          author: 'Queen',
          cover: 'https://cdn.framework7.io/placeholder/abstract-88x88-2.jpg',
        },
        {
          title: 'Billie Jean',
          author: 'Michael Jackson',
          cover: 'https://cdn.framework7.io/placeholder/abstract-88x88-3.jpg',
        },
      ],
      songs: ['Yellow Submarine', "Don't Stop Me Now", 'Billie Jean', 'Californication'],
      authors: ['Beatles', 'Queen', 'Michael Jackson', 'Red Hot Chili Peppers'],
    };
  },
  methods: {
    loadMore(done) {
      const self = this;

      setTimeout(() => {
        const picURL = `https://cdn.framework7.io/placeholder/abstract-88x88-${
          Math.floor(Math.random() * 10) + 1
        }.jpg`;
        const song = self.songs[Math.floor(Math.random() * self.songs.length)];
        const author = self.authors[Math.floor(Math.random() * self.authors.length)];

        self.items.push({
          title: song,
          author,
          cover: picURL,
        });

        done();
      }, 1000);
    },
  },
};
</script>