页面 React 组件
Framework7 中的页面与您思考网页时的含义相同。页面是显示和操作内容的主要组件。
页面 React 组件表示 Framework7 的Page。
页面组件
包括以下组件
Page
- 主要页面元素PageContent
- 额外的内部页面内容元素
页面属性
属性 | 类型 | 默认值 | 说明 |
---|---|---|---|
<Page> 属性 | |||
name | 字符串 | 页面名称 | |
messagesContent | boolean | 如果您在其中使用消息组件以便添加所需额外样式,则启用此功能 | |
pageContent | boolean | true | 当启用时,它将在内部自动添加page-content 元素。当需要为标签使用一些page-content元素时,这对于禁用非常有用 |
标签 | boolean | 如果您使用页面作为标签包装器,请启用 | |
登录屏幕 | boolean | 如果您在页面内部使用登录屏幕,请启用以添加所需的额外样式 | |
noSwipeback | boolean | 禁用当前页面的滑动返回功能(仅影响 iOS 主题) | |
withSubnavbar | boolean | 如果您页面中有子导航栏,请启用 | |
noNavbar | boolean | 如果您使用通用的导航栏布局并且需要针对该页面隐藏通用的导航栏(或使用另一个导航栏),请启用(仅影响 iOS 主题) | |
noToolbar | boolean | 如果您使用通用的工具栏/选项卡栏布局并且需要针对该页面隐藏工具栏(或使用另一个工具栏),请启用 | |
hideBarsOnScroll | boolean | 在页面滚动时隐藏导航栏和工具栏 | |
hideNavbarOnScroll | boolean | 在页面滚动时隐藏导航栏 | |
hideToolbarOnScroll | boolean | 在页面滚动时隐藏工具栏 | |
ptr | boolean | 启用下拉刷新 | |
ptrDistance | 数字 | 自定义下拉刷新触发距离。默认情况下(如果未指定),它为 44px。 | |
ptrPreloader | boolean | true | 如果您想使用自定义下拉刷新预加载元素,请禁用 |
ptrBottom | boolean | false | 从底部启用下拉刷新 |
ptrMousewheel | boolean | false | 启用使用鼠标滚轮下拉刷新(适用于桌面应用程序)。仅适用于 PTR 顶部 |
无限 | boolean | 启用无限滚动 | |
infiniteTop | boolean | 启用页面顶部的无限滚动 | |
infiniteDistance | 数字 | 触发无限滚动事件的距离(以像素为单位)。默认情况下(如果未指定),它是 50 (px) | |
infinitePreloader | boolean | true | 如果您想使用无限滚动的自定义预加载,请禁用 |
<PageContent> 属性 | |||
选项卡 | boolean | 如果您使用 page-content 作为选项卡,请启用 | |
tabActive | boolean | 如果当前选项卡处于活动状态,请启用 | |
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>
)有其他槽用于自定义元素
default
- 如果启用page-content
属性(默认情况下),则元素将作为“page-content”的子元素插入fixed
- 元素将作为“page”的直接子元素插入,位于“page-content”前
<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>
);
};