视图 / 路由
视图(<div class="view">) - 是应用的一个独立的视觉部分,具有自己的设置、导航和历史记录。所以它是一种应用中的应用。这种功能允许您轻松地操作应用的每个部分。
视图布局
让我们看看查看的 HTML 结构:
<body>
<!-- app root -->
<div id="app">
<!-- view inside of panel -->
<div class="panel panel-left panel-cover">
<div class="view panel-view"> ... </div>
</div>
<!-- Your main view -->
<div class="view view-main">
<!-- View related pages -->
...
</div>
<div class="popup">
<div class="view popup-view"> ... </div>
</div>
</div>
</body>
如您所见视图可以位于应用的几乎任何部分。
主查看
您的主查看应该有额外的view-main类。为什么我们需要主查看?默认情况下,所有链接(不在任何初始化的查看中)将加载主查看中的页面。另外,如果您使用browserHistory
哈希导航,则它只对主查看的导航有效。
多视图布局
在我们有应用根目录中有多个查看的情况下,即所谓的“标签式查看”应用,我们必须用额外的<div class="views">
元素。
包裹我们的查看。仅允许一个“查看”元素!
<body>
<!-- app root -->
<div id="app">
<!-- view inside of panel -->
<div class="panel panel-left panel-cover">
<div class="view panel-view"> ... </div>
</div>
<!-- Views container -->
<div class="views tabs">
<!-- Your main view -->
<div class="view view-main tab tab-active" id="view-1">
<!-- View related pages -->
...
</div>
<!-- Another view -->
<div class="view tab" id="view-2">
<!-- View related pages -->
...
</div>
...
</div>
<div class="popup">
<div class="view popup-view"> ... </div>
</div>
</div>
</body>
视图应用方法
当我们已经有了 HTML 中的所需查看并且我们的应用已经初始化时,我们现在需要初始化我们的查看。让我们看看可用于处理查看的可用应用方法:
app.views.create(viewEl, 参数)- 初始化查看
- viewEl - 字符串或HTMLElement如果是字符串 - 查看元素的 CSS 选择器
- 参数 - 对象如果是对象 - 查看参数
- 该方法返回一个包含刚刚创建的查看实例的对象。
app.views.get(viewEl)- 通过 HTML 元素获取查看实例
- viewEl - 字符串或HTMLElement如果是字符串 - 查看元素的 CSS 选择器
- 该方法返回一个包含刚刚创建的查看实例的对象。
可能会出现需要获取当前活动查看的情况,因为除了主应用查看外,我们可能还有在打开的弹出窗口、弹出框、打开的面板、标签等中的查看。此方法允许获取当前活动/可见/“最顶部”查看的查看实例。
例如,如果您在面板中初始化了查看,并且面板当前是打开的,则此方法将返回面板的查看。或者,如果您使用带有标签栏布局的应用,其中每个标签都是查看,则此方法将返回当前活动/可见的标签查看
app.views.current- 获取当前活动/可见查看实例。
- 该方法返回一个包含刚刚创建的查看实例的对象。
视图参数
现在让我们看看需要创建查看的可用参数列表:
参数 | 类型 | 默认 | 描述 |
---|---|---|---|
name | 字符串 | 查看的名称。如果查看被命名创建,则可以通过app.views.[name] | |
main | 布尔值 | false | 指定此查看是否为主查看。如果没有传递,则将根据其元素是否具有view-main 类来决定 |
路由器 | 布尔值 | true | 设置为 false 以禁用查看路由器 |
initRouterOnTabShow | 布尔值 | false | 如果启用并且查看是标签,则它不会初始化路由器并加载初始页面,直到查看标签变为可见 |
url | 字符串 | 默认(初始)查看的 URL。如果没有指定,则等于文档 URL | |
loadInitialPage | 布尔值 | true | 当启用时,并且查看中没有子页面时。它将加载与初始 URL 匹配的初始页面 |
linksView | 字符串 对象 | 另一个查看的 CSS 选择器或初始化的查看实例对象。默认情况下,所有在初始化(仅)查看中的链接将加载此查看中的页面。这告诉链接在其他查看中加载页面。 | |
allowDuplicateUrls | 布尔值 | false | 您可以启用此参数以允许加载具有与当前“活动”页面相同的 URL 的新页面。 |
animate | 布尔值 | true | 启用页面之间的过渡 |
preloadPreviousPage | 布尔值 | true | 启用/禁用在导航深入时预加载上一页。对于“滑动返回页面”功能的正确工作应启用此功能。 |
reloadPages | 布尔值 | false | 当启用时,查看将始终重新加载当前活动页面,而不会加载新页面 |
restoreScrollTopOnBack | 布尔值 | true | 当启用时,它将在您返回到此页面时恢复页面滚动顶部 |
iosPageLoadDelay | 数字 | 0 | 新页面将被加载并插入到 DOM 中,并且在它将被过渡之前经过的延迟(以毫秒为单位)。可以稍微增加以提高性能。仅在 iOS 主题下有效 |
mdPageLoadDelay | 数字 | 0 | 新页面将被加载并插入到 DOM 中,并且在它将被过渡之前经过的延迟(以毫秒为单位)。可以稍微增加以提高性能。仅在 MD 主题下有效 |
passRouteQueryToRequest | 布尔值 | true | 当启用时,路由器将路由 URL 查询传递给请求 URL 查询(对于url 和componentUrl 路由属性)如果您有如下路由:
并且您将点击具有/somepage/?foo=barURL 的链接,则它将加载来自http://myserver/page/?foo=barurl |
passRouteParamsToRequest | 布尔值 | false | 当启用时,路由器将当前路由参数传递给请求 URL 查询(对于url 和componentUrl 路由属性)如果您有如下路由:
并且您将点击具有/user/11/posts/12/URL 的链接,则它将加载来自http://myserver/userpost/?userId=11&postId=12url |
主从 | |||
masterDetailBreakpoint | 数字 | 0 | 启用主详细信息视图的最小应用宽度(用于主路由,即具有master: true 参数中) |
masterDetailResizable | 布尔值 | false | 启用可调整大小的主详细信息布局 要指定主详细信息可调整大小的最小/最大宽度,需要在样式中的 page-master 上设置,例如:
|
reloadDetail | 布尔值 | false | 当启用时,它将在导航时重新加载每个详细信息页面 |
路由 | |||
路由 | 数组 | 当前查看的数组路由。如果指定,则将覆盖全局应用路由,并且仅在此处指定的路由对当前查看可用 | |
routesAdd | 数组 | 将要扩展全局应用路由的附加路由数组。这些附加路由仅对当前查看可用 | |
routesBeforeEnter | function(context) 数组 | 将在每次之前执行的函数(或函数数组)每个路由卸载/离开。要继续导航 route load/enter. To proceed route loading resolve 必须被调用。如果是array 然后,数组中的每个函数都必须解析才能继续。与在路由之前进入但将对每个路由有效 | |
路由之前离开 | function(context) 数组 | 将在每次之前执行的函数(或函数数组)每个路由卸载/离开。要继续导航 route unload/leave. To proceed navigation resolve 必须被调用。如果是array 然后,数组中的每个函数都必须解析才能继续。与路由之前离开但将对每个路由有效 | |
元素移除 | |||
removeElements | 布尔值 | true | 在页面过渡期间,路由器可能会从DOM中移除未使用的页面和导航栏元素。在您想手动处理元素移除或使用其他库(例如Vue或React)的情况下,禁用此功能很有用 |
removeElementsWithTimeout | 布尔值 | false | 当启用时,路由器将在超时后移除元素 |
removeElementsTimeout | 数字 | 0 | 移除元素的超时时间(如果removeElementsWithTimeout: true ) |
unloadTabContent | 布尔值 | true | 当选项卡可见时,卸载路由选项卡内容(移除选项卡内部内容)。仅适用于路由选项卡 |
组件缓存 | |||
componentCache | 布尔值 | true | 当启用时,路由器将缓存通过componentUrl |
XHR缓存 | |||
xhrCache | 布尔值 | true | 由于路由器可以使用Ajax加载页面内容,因此使用缓存是很好的,特别是如果这些页面中的内容更新不太频繁。 |
xhrCacheIgnore | 数组 | [] | 应该不缓存的URL(字符串)数组 |
xhrCacheIgnoreGetParameters | 布尔值 | false | 如果为"true",则像"about.html?id=2"和"about.html?id=3"这样的URL将被视为单个"about.html"页面并缓存 |
xhrCacheDuration | 数字 | 1000 * 60 * 10 | 应用程序将使用缓存而不是使用另一个Ajax请求加载页面,持续时间为ms(毫秒)。默认为10分钟。 |
iOS动态导航栏 | |||
iosDynamicNavbar | 布尔值 | true | 为iOS主题启用动态导航栏 |
iosAnimateNavbarBackIcon | 布尔值 | true | 此选项(当启用时)为动态导航栏左侧的返回链接图标动画提供更原生的外观。仅在您使用动态导航栏并将默认的左侧返回链接图标设置为"滑动"时才有用 |
滑动返回 | |||
iosSwipeBack | 布尔值 | true | 启用/禁用从屏幕左侧边缘滑动以返回上一页的功能。适用于iOS主题 |
iosSwipeBackThreshold | 数字 | 0 | px值。如果"触摸距离"大于此值,则将开始滑动返回操作。适用于iOS主题 |
iosSwipeBackActiveArea | 数字 | 30 | px值。屏幕左侧不可见边缘的宽度,该边缘触发滑动返回操作。适用于iOS主题 |
iosSwipeBackAnimateShadow | 布尔值 | true | 启用/禁用滑动返回操作期间的框阴影动画。您可以禁用它以提高性能。适用于iOS主题 |
iosSwipeBackAnimateOpacity | 布尔值 | true | 启用/禁用滑动返回操作期间的透明度动画。您可以禁用它以提高性能。适用于iOS主题 |
mdSwipeBack | 布尔值 | false | 启用/禁用从屏幕左侧边缘滑动以返回上一页的功能。适用于MD主题 |
mdSwipeBackThreshold | 数字 | 0 | px值。如果"触摸距离"大于此值,则将开始滑动返回操作。适用于MD主题 |
mdSwipeBackActiveArea | 数字 | 30 | px值。屏幕左侧不可见边缘的宽度,该边缘触发滑动返回操作。适用于MD主题 |
mdSwipeBackAnimateShadow | 布尔值 | true | 启用/禁用滑动返回操作期间的框阴影动画。您可以禁用它以提高性能。适用于MD主题 |
mdSwipeBackAnimateOpacity | 布尔值 | false | 启用/禁用滑动返回操作期间的透明度动画。您可以禁用它以提高性能。适用于MD主题 |
浏览器历史记录 | |||
browserHistory | 布尔值 | false | 如果您开发的是Web应用程序(不是Cordova/Capacitor或主屏幕Web应用程序),则启用哈希导航(浏览器URL将类似于" http://my-webapp.com/#!/about.html")很有用。用户还可以使用浏览器的默认后退和前进按钮在应用程序的历史记录中导航。 |
browserHistoryRoot | 字符串 | 浏览器历史记录根URL分隔符,例如" http://my-app.com/"。仅在您使用空("")时才有用browserHistorySeparator | |
browserHistoryAnimate | 布尔值 | true | 启用/禁用浏览器历史记录更改时的页面过渡 |
browserHistoryAnimateOnLoad | 布尔值 | false | 启用/禁用应用程序加载时的浏览器历史记录页面过渡 |
browserHistorySeparator | 字符串 | #! | 浏览器历史记录URL分隔符,可以更改为类似'#page/'的内容,然后您的浏览器历史记录URL将类似于" http://myapp.com/#page/about.html" |
browserHistoryOnLoad | 布尔值 | true | 禁用以忽略应用程序加载时解析浏览器历史记录URL并加载页面 |
browserHistoryInitialMatch | 布尔值 | false | Set totrue 当您的服务器配置为响应与请求的URL匹配的内容时(例如,使用服务器端渲染框架,如Nuxt.js、Next.js和其他)。在用于Framework7-React/Vue/Svelte时也必须启用。默认禁用 |
browserHistoryStoreHistory | 布尔值 | true | 当启用时(默认情况下),它将路由器历史记录存储在localStorage中,并在下次访问Web应用程序时尝试恢复它 |
browserHistoryTabs | 字符串 | 替换 | 可以是replace 或push . 当"替换"(默认情况下),它将在路由选项卡更改时替换状态,否则(如果"推入"),它将向历史记录添加每个路由选项卡更改,因此将可以使用浏览器后退按钮在选项卡之间切换 |
事件处理程序 | |||
on | 对象 | 带有事件处理程序的对象。例如:
|
注意,所有以下参数都可以在view
设置所有视图的默认值的属性。例如:
var app = new Framework7({
view: {
iosDynamicNavbar: false,
xhrCache: false,
}
});
视图方法和属性
因此,要创建视图,我们必须调用:
var view = app.views.create({ /* parameters */ })
之后我们就有其初始化的实例(如view
示例中上面的变量)以及有用的方法和属性:
属性 | |
---|---|
view.app | 链接到全局应用实例 |
view.el | 视图HTML元素 |
view.$el | 具有视图HTML元素的Dom7实例 |
view.name | 传递的视图名称name parameter |
view.main | 指示是否为主视图的布尔属性 |
view.routes | 包含可用路由的数组 |
view.history | 包含视图历史的数组 |
view.params | 包含视图初始化参数的对象 |
view.router | 视图初始化的路由器实例 |
方法 | |
视图销毁 | 销毁视图实例 |
视图.on(事件上触发, 处理程序) | 添加事件处理程序 |
视图.once(事件上触发, 处理程序) | 添加在触发后将被移除的事件处理程序 |
视图.off(事件上触发, 处理程序) | 移除事件处理程序 |
视图.off(事件上触发) | 移除指定事件的所有处理程序 |
视图.emit(事件上触发, ...args) | 在实例上触发事件 |
视图事件
视图将在视图元素上触发以下DOM事件,并在应用和视图实例上触发事件:
视图DOM事件
事件 | Target | 描述 |
---|---|---|
view:init | 视图元素<div class="view"> | 事件将在视图初始化时触发 |
view:resize | 视图元素<div class="view"> | 事件将在主从视图调整大小时触发(当masterDetailResizable 启用) |
视图实例事件
视图实例在自身实例和应用实例上触发事件。应用实例事件名称前缀为view
.
事件 | Target | 参数 | 描述 |
---|---|---|---|
init | view | (视图) | 事件将在视图初始化时触发 |
viewInit | app | ||
resize | view | (视图, 宽度) | 事件将在主从视图调整大小时触发(当masterDetailResizable 启用) |
viewResize | app |
路由器API / 方法与属性
视图的主要目的是在页面之间进行导航/路由。我们可以通过view.router
. 它有很多有用的方法和属性来控制路由和导航:
路由属性 | |
---|---|
router.app | 链接到全局应用实例 |
router.view | 链接到相关的视图实例 |
router.params | 包含路由初始化参数的对象 |
router.el | 路由的视图HTML元素 |
router.$el | 包含路由视图HTML元素的Dom7实例 |
router.currentPageEl | 当前页面的HTML元素 |
router.routes | 包含可用路由的数组 |
router.history | 包含视图路由历史的数组 |
router.cache | 包含路由/视图缓存数据的对象 |
router.currentRoute | 包含当前路由数据的对象。它具有以下属性
|
router.previousRoute | 包含先前活动路由数据的对象。与currentRoute |
router.allowPageChange | 布尔属性指示是否允许更改页面/导航 |
路由方法 | |
router.navigate(url, options) | 导航到(加载)新页面
|
router.navigate(参数,选项) | 通过参数导航到(加载)新页面。此方法允许通过其name .
例如,如果我们有以下路由:
我们可以通过调用:
如果有更复杂的路由带参数:
那么必须传递参数:
|
router.back(url, options) | 返回到上一个页面,在视图历史中向后导航
|
router.refreshPage() | 刷新/重新加载当前页面。实际上与:
|
router.clearPreviousHistory() | 清除路由上一个页面历史并从DOM中删除所有以前的页面 |
router.updateCurrentUrl(url) | 更新当前路由URL,并根据传递的URL更新router.currentRoute 属性(查询、参数、哈希等)。此方法不会加载或重新加载任何内容。它只是更改当前路由URL。 |
router.generateUrl({name, query, 参数}) | 根据给定的路由名称生成路由URL。例如,如果我们有以下路由:
那么我们可以这样获取路由的URL:
|
router.on(事件上触发, 处理程序) | 添加事件处理程序 |
router.once(事件上触发, 处理程序) | 添加在触发后将被移除的事件处理程序 |
router.off(事件上触发, 处理程序) | 移除事件处理程序 |
router.off(事件上触发) | 移除指定事件的所有处理程序 |
router.emit(事件上触发, ...args) | 在实例上触发事件 |
页面与视图之间的链接
非常不方便时使用路由方法在页面之间导航。在许多情况下,我们只需使用链接在页面之间导航。我们可以使用data-
属性指定所有参数来自动初始化:
<!-- same as router.navigate('/somepage/'); -->
<a href="/somepage/">Some Page</a>
<!-- same as router.navigate('/somepage/', {reloadCurrent: true, animate: false}); -->
<a href="/somepage/" data-animate="false" data-reload-current="true">Some Page</a>
<!-- same as router.back(); -->
<a href="#" class="back">Go back</a>
<!-- same as router.back('/home/', {force: true, ignoreCache: true}); -->
<a href="/home/" data-force="true" data-ignore-cache="true" class="back">Go back</a>
链接默认行为:
- 如果链接在未初始化的视图内部,则将在主视图加载页面
- 如果链接在已初始化的视图内部,则将在该视图加载页面(如果视图未指定在视图的
linksView
参数中)
但如果我们需要在新视图加载页面,我们可以将此视图的CSS选择器指定在链接的data-view
属性
<!-- left view -->
<div class="view view-init view-left" data-name="left">
...
<!-- will load "some-page" to main view -->
<a href="/some-page/" data-view=".view-main">Some Page</a>
...
</div>
<!-- main view -->
<div class="view view-init view-main">
...
<!-- will load "another-page" to left view -->
<a href="/another-page/" data-view=".view-left">Another Page</a>
...
</div>
如果我们需要在“当前”视图(当前活动/可见视图实例)中加载页面,我们需要设置data-view="current"
属性:
<!-- will load "another-page" in current view -->
<a href="/another-page/" data-view="current">Another Page</a>
如果我们需要阻止路由处理特定链接,我们可以给这些链接添加prevent-router
类:
<!-- This link will be ignored by router -->
<a href="/some-page/" class="prevent-router">Some Page</a>
路由器事件
路由有很多有用的事件。
路由器DOM事件
路由将为滑动返回页面触发以下DOM事件:
事件 | Target | 描述 |
---|---|---|
swipeback:move | 视图元素<div class="view"> | 事件在滑动返回移动期间触发 |
swipeback:beforechange | 视图元素<div class="view"> | 事件在您释放它时,在滑动返回动画到前一页之前触发 |
swipeback:afterchange | 视图元素<div class="view"> | 事件在您释放它时,在滑动返回动画到前一页之后触发 |
swipeback:beforereset | 视图元素<div class="view"> | 事件在您释放它时,在滑动返回动画到当前页之前触发 |
swipeback:afterreset | 视图元素<div class="view"> | 事件在您释放它时,在滑动返回动画到当前页之后触发 |
路由器实例事件
路由事件冒泡到视图实例和到应用实例,因此路由实例上触发的事件也将可在视图和应用实例上获取:
事件 | 参数 | 描述 |
---|---|---|
routeChange | (新路由, 旧路由, 路由器) | 当前路由更改时将触发事件 |
路由已更改 | (新路由, 旧路由, 路由器) | 当当前路由更改和页面过渡时将触发事件 |
路由URL更新 | (新路由, 路由器) | 当调用方法时将触发事件router.updateCurrentUrl XHR事件 |
XHR Events | ||
路由XHR开始 | (xhr, 选项) | 在路由XHR打开后和发送前将触发事件。可用于在发送前修改XHR对象。使用此回调来设置自定义头部等。作为参数接收XHR对象和导航options 对象 |
路由XHR成功 | (xhr, 选项) | 在请求成功时将触发事件。作为参数接收XHR对象和导航options 对象 |
路由XHR错误 | (xhr, 选项) | 如果请求失败将触发事件。作为参数接收XHR对象和导航options 对象 |
路由XHR完成 | (xhr, 选项) | 在请求完成时将触发事件。作为参数接收XHR对象和导航options 对象 |
滑动返回事件 | ||
滑动返回移动 | (数据) | 在滑动返回移动期间将触发事件。data 包含以下属性的对象:percentage , currentPageEl , previousPageEl , currentNavbarEl , previousNavbarEl |
滑动返回更改前 | (数据) | 在释放时将触发滑动返回动画到前一页的事件。data 包含以下属性的对象:currentPageEl , previousPageEl , currentNavbarEl , previousNavbarEl |
滑动返回更改后 | (数据) | 在释放时将触发滑动返回动画到前一页的事件。data 包含以下属性的对象:currentPageEl , previousPageEl , currentNavbarEl , previousNavbarEl |
滑动返回重置前 | (数据) | 在释放时将触发滑动返回动画到当前页的事件。data 包含以下属性的对象:currentPageEl , previousPageEl , currentNavbarEl , previousNavbarEl |
滑动返回重置后 | (数据) | 在释放时将触发滑动返回动画到当前页的事件。data 包含以下属性的对象:currentPageEl , previousPageEl , currentNavbarEl , previousNavbarEl |
页面事件 | ||
pageMounted | (页面数据) | 当新页面刚刚插入到DOM时,将触发事件。或者当具有keepAlive 路由被挂载/附加到DOM。作为参数事件接收页面数据 |
pageInit | (页面数据) | 在Router初始化所需页面的组件和导航栏后触发事件。作为参数事件接收页面数据 |
pageReinit | (页面数据) | 在导航到已初始化的页面时将触发此事件。作为参数事件接收页面数据 |
pageBeforeIn | (页面数据) | 在所有初始化完成且页面准备好过渡到视图(到活动/当前位置)时将触发事件。作为参数事件接收页面数据 |
pageAfterIn | (页面数据) | 在页面过渡到视图后触发事件。作为参数事件接收页面数据 |
pageBeforeOut | (页面数据) | 在页面即将过渡出视图前触发事件。作为参数事件接收页面数据 |
pageAfterOut | (页面数据) | 在页面过渡出视图后触发事件。作为参数事件接收页面数据 |
pageBeforeUnmount | (页面数据) | 当具有keepAlive 路由即将被卸载/从DOM中分离。作为参数事件接收页面数据 |
pageBeforeRemove | (页面数据) | 在页面将从DOM中移除前触发事件。此事件如果需要分离某些事件/销毁某些插件释放内存会非常有用。作为参数事件接收页面数据. 此事件不会为keepAlive 路由触发。 |
可路由标签事件 | ||
tabInit tabMounted | (newTabEl, tabRoute) | 可在可路由的 Tab 内容加载后触发事件。作为参数,事件处理程序接收:
|
tabBeforeRemove | (oldTabEl, newTabEl, tabRoute) | 可在可路由的 Tab 内容加载后触发事件。作为参数,事件处理程序接收:
|
可路由模态事件 | ||
模态初始化 模态挂载 | (模态El, 模态路由, 模态) | 在可路由模态内容加载并添加到DOM后触发事件。作为参数事件处理器接收:
|
模态移除前 | (模态El, 模态路由, 模态) | 在可路由模态将从DOM中移除并销毁前触发事件。作为参数事件处理器接收:
|
视图自动初始化
如果你不需要使用View API并且你的View在应用初始化时位于DOM中,那么只需添加额外的view-init
class:
<!-- Add view-init class -->
<div class="view view-init">
...
</div>
但视图参数呢。在这种情况下,我们可以将它们传递在data-
属性中。
camelCase中使用的参数,例如browserHistory
,在data-属性中应使用kebab-case作为data-browser-history
<!-- view parameters in data- attributes -->
<div class="view view-init" data-url="/" data-name="home" data-browser-history="true">
...
</div>
在这种情况下,如果你需要访问创建的View实例,你可以使用:
- 如果是主视图,我们可以使用
app.views.main
来获取主视图实例 - 否则,我们可以通过传递
name
参数来访问它app.views.home
<!-- main view -->
<div class="view view-main view-init">
...
</div>
<!-- another view -->
<div class="view view-init" data-name="home">
...
</div>
var mainView = app.views.main;
var homeView = app.views.home;
初始页面路由
初始页面也可以使用路由正确加载。在应用布局中我们必须将View留空:
<body>
<div id="app">
<div class="view view-main"></div>
</div>
</body>
在路由中,我们可以指定“home”路由,例如:
routes: [
{
path: '/',
url: './home.html'
},
...
]
而在初始化View时,我们需要指定它是默认URL:
app.views.create('.view-main', {
url: '/'
})
这样,现在在应用加载时,将加载“home.html”文件中的主页内容。
主从
主-详情模式通常用于足够宽的屏幕和平板电脑,并由两个视图组成:
- 主视图 - 是UI中包含某列表的区域。
- 详情视图 - 是显示主视图中选择的相关信息的区域。
当收起(在小屏幕上)时,在这种页面之间的导航将像普通路由一样进行。
到/从主-详情视图的导航不会发生过渡。
当主页面加载时,所有其他页面都将作为详情页面加载。要“退出”主-详情视图,建议使用reloadAll
导航参数。
要启用主-详情:
- 你需要指定
masterDetailBreakpoint
视图的参数 - 设置
master: true
属性加载,则无法正常工作在主路由上 - 此外,我们可以在主路由的
detailRoutes
属性加载,则无法正常工作中放置所有详情路由
当主-详情启用时,你可以使用以下附加类进行自定义样式:
page-master
- 将设置在主页上page-master-detail
- 将设置在每一个详情页上page-master-detail-root
- 将设置在第一个(根)详情页上navbar-master
- 将设置在主导航栏上(仅在iOS主题中)iosDynamicNavbar
启用)navbar-master-detail
- 将在每一个Detail导航栏上设置(仅在iOS主题中)iosDynamicNavbar
启用)navbar-master-detail-root
- 将在第一个(根)Detail导航栏上设置(仅在iOS主题中)iosDynamicNavbar
启用)
例如:
const mainView = app.views.create('.view-main', {
// enable master detail
masterDetailBreakpoint: 800,
routes: [
{
path: '/',
url: './pages/master.html',
// specify home route as master route
master: true,
// detail routes
detailRoutes: [
{
path: '/detail/:id/',
url: './pages/detail.html',
},
]
},
]
});
我们应该有如下内容:
自定义页面过渡
除了默认的主题特定页面过渡外,还可以创建自定义页面过渡或使用附加的过渡效果。
内置了以下附加自定义页面过渡:
f7-circle
f7-cover
f7-cover-v
f7-dive
f7-fade
f7-flip
f7-parallax
f7-push
要在特定路由上使用此类过渡,我们需要在路由选项中指定它:
routes = [
...
{
path: '/some-page/',
url: '...',
options: {
transition: 'f7-circle',
},
},
...
]
要使用自定义过渡加载现有路由,我们需要将其传递在router.navigate()
方法:
// load /some-page/ with "f7-cover" transition
router.navigate('/some-page/', { transition: 'f7-cover' })
或者我们可以直接通过data-transition
属性指定它(像指定任何其他路由选项一样):
<!-- load /some-page/ with "f7-cover" transition -->
<a href="/some-page/" data-transition="f7-cover">...</a>
除了内置的过渡外,我们还可以创建自定义的过渡。这可以通过CSS动画来完成。
当我们指定自定义页面过渡时,路由器会向其元素添加以下类(<div class="view">
)访问:
router-transition-[name]-forward
- 当导航到新页面时router-transition-[name]-backward
- 当导航到上一页(返回时)
并且它在导航前进时等待animationend
事件在page-next
上,在导航返回时等待page-current
上。
所以如果我们将我们的自定义过渡命名为my-transition
,那么它可以用以下方式指定:
.router-transition-my-transition-forward,
.router-transition-my-transition-backward {
/* Apply some styles for view element when custom transition is running */
}
.router-transition-my-transition-forward .page-current {
/* Animation when current page transforms to previous page */
animation: my-transition-current-to-prev 400ms;
}
.router-transition-my-transition-forward .page-next {
/* Animation when next page transforms to current page (new page comes into view) */
animation: my-transition-next-to-current 400ms;
}
.router-transition-my-transition-backward .page-current {
/* Animation when current page transforms to next page (going back) */
animation: my-transition-current-to-next 400ms;
}
.router-transition-my-transition-backward .page-previous {
/* Animation when previous page transforms to current page (previous page comes into view) */
animation: my-transition-prev-to-current 400ms;
}
/* Specify animations */
@keyframes my-transition-current-to-prev {
/* ... */
}
@keyframes my-transition-next-to-current {
/* ... */
}
@keyframes my-transition-current-to-next {
/* ... */
}
@keyframes my-transition-prev-to-current {
/* ... */
}
这里有一个内置f7-cover
过渡指定的示例:
.router-transition-f7-cover-forward,
.router-transition-f7-cover-backward {
background: #000;
perspective: 1200px;
}
.router-transition-f7-cover-forward .page-next {
animation: f7-cover-next-to-current 450ms forwards;
}
.router-transition-f7-cover-forward .page-current {
animation: f7-cover-current-to-prev 450ms forwards;
}
.router-transition-f7-cover-backward .page-current {
animation: f7-cover-current-to-next 450ms forwards;
}
.router-transition-f7-cover-backward .page-previous {
animation: f7-cover-prev-to-current 450ms forwards;
}
@keyframes f7-cover-next-to-current {
from {
transform: translateX(100%);
}
to {
transform: translateX(0%);
}
}
@keyframes f7-cover-current-to-next {
from {
transform: translateX(0%);
}
to {
transform: translateX(100%);
}
}
@keyframes f7-cover-current-to-prev {
from {
transform: translateZ(0);
opacity: 1;
}
to {
transform: translateZ(-300px);
opacity: 0.5;
}
}
@keyframes f7-cover-prev-to-current {
from {
transform: translateZ(-300px);
opacity: 0.5;
}
to {
transform: translateZ(0);
opacity: 1;
}
}