Page React 元件

Framework7 中的 Page 與您在思考網頁時所指的意義相同。Page 是用來顯示和操作內容的主要元件。

Page React 元件代表 Framework7 的 Page

Page 元件

包含以下元件

Page 屬性

屬性類型預設值說明
<Page> 屬性
name字串頁面名稱
messagesContent布林值如果你在裡面使用 訊息 元件,請啟用以新增必要的額外樣式
pageContent布林值true啟用時會自動在裡面新增 page-content 元素。當你需要為分頁使用幾個 page-content 元素時,禁用此功能會很有用
tabs布林值如果你使用 Page 作為 分頁 包裝器,請啟用
loginScreen布林值如果你在頁面內使用 登入畫面,請啟用以新增必要的額外樣式
noSwipeback布林值停用當前頁面的滑動返回功能(僅影響 iOS 主題)
withSubnavbar布林值如果你在頁面內有次要導覽列,請啟用
noNavbar布林值如果你使用常見的導覽列版面,並且需要針對此頁面隱藏常見的導覽列(或使用其他導覽列),請啟用(僅影響 iOS 主題)
noToolbar布林值如果你使用常見的工具列/分頁列版面,並且需要針對此頁面隱藏工具列(或使用其他工具列),請啟用
hideBarsOnScroll布林值在頁面捲動時隱藏導覽列和工具列
hideNavbarOnScroll布林值在頁面捲動時隱藏導覽列
hideToolbarOnScroll布林值在頁面捲動時隱藏工具列
ptr布林值啟用 下拉更新
ptrDistance數字自訂下拉更新觸發距離。預設值(如果未指定)為 44px。
ptrPreloader布林值true如果你想使用自訂下拉更新預載元件,請停用
ptrBottom布林值false啟用從底部下拉更新
ptrMousewheel布林值false啟用使用滑鼠滾輪下拉更新(適用於桌面應用程式)。僅適用於 PTR 頂部
infinite布林值啟用 無限捲動
infiniteTop布林值在頁面頂部啟用無限捲動
infiniteDistance數字從頁面底部(以像素為單位)觸發無限捲動事件的距離。預設值(如果未指定)為 50(像素)
infinitePreloader布林值true如果你想使用自訂無限捲動預載元件,請停用
<PageContent> 屬性
tab布林值如果你使用 page-content 作為分頁,請啟用
tabActive布林值如果當前分頁處於活動狀態,請啟用
ptr
ptrDistance
ptrPreloader
ptrBottom
ptrMousewheel
infinite
infiniteTop
infiniteDistance
infinitePreloader
hideBarsOnScroll
hideNavbarOnScroll
hideToolbarOnScroll
messagesContent
loginScreen
<Page> 屬性相同

頁面事件

事件說明
<Page> 事件
pageMounted當具有 keepAlive 路徑的頁面掛載/附加到 DOM 時,將觸發事件
pageInit在 Framework7 初始化必要的頁面元件和導覽列後,將觸發事件
pageReinit如果導航到已初始化的頁面,將觸發此事件。
pageBeforeIn當所有內容都初始化完畢,並且頁面已準備好轉換為可視狀態(轉換到活動/當前位置)時,將觸發事件
pageAfterIn頁面轉場至可見後觸發事件
pageBeforeOut頁面即將轉場至不可見前觸發事件
pageAfterOut頁面轉場至不可見後觸發事件
pageBeforeUnmount含有 keepAlive 路由的頁面即將卸載/從 DOM 分離時觸發事件
pageBeforeRemove頁面即將從 DOM 中移除前觸發事件。如果您需要分離一些事件/銷毀一些外掛程式以釋放記憶體,此事件會非常有用。對於 keepAlive 路由,不會觸發此事件。
pageTabShow頁面的父層 視為標籤 可見時觸發事件
pageTabHide頁面的父層 視為標籤 隱藏時觸發事件
ptrPullStart開始移動下拉更新內容時觸發事件
ptrPullMove移動下拉更新內容時觸發事件
ptrPullEnd釋放下拉更新內容時觸發事件
ptrRefresh下拉更新進入「更新中」狀態時觸發事件
ptrDone下拉更新完成並回到初始狀態(呼叫 pullToRefreshDone 方法後)觸發事件
infinite頁面捲動到達指定(在 data-distance 屬性中)距離底部時觸發事件。
<PageContent> 事件
tabShow標籤可見/啟用時觸發事件
tabHide標籤隱藏/停用時觸發事件
ptrPullStart
ptrPullMove
ptrPullEnd
ptrRefresh
ptrDone
infinite
<Page> 事件相同

頁面插槽

頁面 React 元件 (<Page>) 有額外的自訂元素插槽

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

{/* Renders to: */}

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

範例

無限捲動

infinite-scroll.jsx
import React, { useRef, useState } from 'react';
import { Navbar, Page, BlockTitle, List, ListItem } from 'framework7-react';

export default () => {
  const allowInfinite = useRef(true);
  const [items, setItems] = useState([
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
  ]);
  const [showPreloader, setShowPreloader] = useState(true);

  const loadMore = () => {
    if (!allowInfinite.current) return;
    allowInfinite.current = false;

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

      const itemsLength = items.length;

      for (let i = 1; i <= 20; i += 1) {
        items.push(itemsLength + i);
      }
      allowInfinite.current = true;
      setItems([...items]);
    }, 1000);
  };

  return (
    <Page infinite infiniteDistance={50} infinitePreloader={showPreloader} onInfinite={loadMore}>
      <Navbar title="Infinite Scroll"></Navbar>
      <BlockTitle>Scroll bottom</BlockTitle>
      <List strongIos outlineIos dividersIos>
        {items.map((item, index) => (
          <ListItem title={`Item ${item}`} key={index}></ListItem>
        ))}
      </List>
    </Page>
  );
};

下拉更新

pull-to-refresh.jsx
import React, { useState } from 'react';
import { Navbar, Page, List, ListItem, BlockFooter } from 'framework7-react';

export default () => {
  const songs = ['Yellow Submarine', "Don't Stop Me Now", 'Billie Jean', 'Californication'];
  const authors = ['Beatles', 'Queen', 'Michael Jackson', 'Red Hot Chili Peppers'];
  const [items, setItems] = useState([
    {
      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',
    },
  ]);
  const loadMore = (done) => {
    setTimeout(() => {
      const picURL = `https://cdn.framework7.io/placeholder/abstract-88x88-${
        Math.floor(Math.random() * 10) + 1
      }.jpg`;
      const song = songs[Math.floor(Math.random() * songs.length)];
      const author = authors[Math.floor(Math.random() * authors.length)];
      items.push({
        title: song,
        author,
        cover: picURL,
      });
      setItems([...items]);

      done();
    }, 1000);
  };
  return (
    <Page ptr ptrMousewheel={true} onPtrRefresh={loadMore}>
      <Navbar title="Pull To Refresh"></Navbar>
      <List mediaList strongIos dividersIos outlineIos>
        {items.map((item, index) => (
          <ListItem key={index} title={item.title} subtitle={item.author}>
            <img slot="media" src={item.cover} width="44" style={{ borderRadius: '8px' }} />
          </ListItem>
        ))}
        <BlockFooter>
          <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>
        </BlockFooter>
      </List>
    </Page>
  );
};