页面 React 组件

Framework7 中的页面与您思考网页时的含义相同。页面是显示和操作内容的主要组件。

页面 React 组件表示 Framework7 的Page

页面组件

包括以下组件

页面属性

属性类型默认值说明
<Page> 属性
name字符串页面名称
messagesContentboolean如果您在其中使用消息组件以便添加所需额外样式,则启用此功能
pageContentbooleantrue当启用时,它将在内部自动添加page-content元素。当需要为标签使用一些page-content元素时,这对于禁用非常有用
标签boolean如果您使用页面作为标签包装器,请启用
登录屏幕boolean如果您在页面内部使用登录屏幕,请启用以添加所需的额外样式
noSwipebackboolean禁用当前页面的滑动返回功能(仅影响 iOS 主题)
withSubnavbarboolean如果您页面中有子导航栏,请启用
noNavbarboolean如果您使用通用的导航栏布局并且需要针对该页面隐藏通用的导航栏(或使用另一个导航栏),请启用(仅影响 iOS 主题)
noToolbarboolean如果您使用通用的工具栏/选项卡栏布局并且需要针对该页面隐藏工具栏(或使用另一个工具栏),请启用
hideBarsOnScrollboolean在页面滚动时隐藏导航栏和工具栏
hideNavbarOnScrollboolean在页面滚动时隐藏导航栏
hideToolbarOnScrollboolean在页面滚动时隐藏工具栏
ptrboolean启用下拉刷新
ptrDistance数字自定义下拉刷新触发距离。默认情况下(如果未指定),它为 44px。
ptrPreloaderbooleantrue如果您想使用自定义下拉刷新预加载元素,请禁用
ptrBottombooleanfalse从底部启用下拉刷新
ptrMousewheelbooleanfalse启用使用鼠标滚轮下拉刷新(适用于桌面应用程序)。仅适用于 PTR 顶部
无限boolean启用无限滚动
infiniteTopboolean启用页面顶部的无限滚动
infiniteDistance数字触发无限滚动事件的距离(以像素为单位)。默认情况下(如果未指定),它是 50 (px)
infinitePreloaderbooleantrue如果您想使用无限滚动的自定义预加载,请禁用
<PageContent> 属性
选项卡boolean如果您使用 page-content 作为选项卡,请启用
tabActiveboolean如果当前选项卡处于活动状态,请启用
ptr
ptrDistance
ptrPreloader
ptrBottom
ptrMousewheel
无限
infiniteTop
infiniteDistance
infinitePreloader
hideBarsOnScroll
hideNavbarOnScroll
hideToolbarOnScroll
messagesContent
登录屏幕
<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 方法后)触发事件
无限当页面滚动达到指定(在 data-distance 属性中)到底部的距离时触发事件。
<PageContent> 事件
tabShow当标签可见/激活时,触发事件
tabHide当标签隐藏/未激活时,触发事件
ptrPullStart
ptrPullMove
ptrPullEnd
ptrRefresh
ptrDone
无限
<Page> 事件相同

页面槽

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>
  );
};