情况

  • 顶部返回,在header.vue公用组件中使用 this.$router.go(-1)
  • 安卓:点击返回按钮:登录页,项目选择页,首页等几个一级页面要求提示用户是否退出app;确定,退出;取消:不做操作;
  • iOS:还未处理

预期

在一个公用js文件中使用编写一个函数(phoneOperate(isTopPage)):让app在点击手机返回按钮的时候默认返回上级,在一级页面单独处理让用户在点击的时候做提示.

phoneOperate(isTopPage){
let that = this
isTopPage = isTopPage || false;
if(isTopPage){
that.$confirm('是否要退出app','操作提示')
.then((){ plus.runtime.quit()})
.catch((){return;})
} else {
that.$router.go(-1);
}
}

情况1

  1. app.vue组件中调用phoneOperate(isTopPage)实现所有页面点击手机返回键,返回上级页面

结果

app.vue组件在最开始初始化一次;之后加载一级页面的.vue组件时,是不会再次渲染的,因此所有的页面(包括一级页面)都只是会执行首次进入app时的条件.而在一级页面改写过返回按钮后进入非一级页面,因为没有对所有非一级页面改写返回按钮,所有页面都将继续执行一级页面的逻辑.

情况2

因为app.vue中调用所有所有其他.vue组件,即其他所有组件都是app.vue组件的子组件.能不能利用父子组件传值改变全局变量(isTopPage)的值

结果2

大概是入口组件的特殊性 app.vue组件中的组件不能够识别到app.vue中的处理函数.so,无用功..........................

情况3

不知道具体有什么简单的办法,那就使用体力劳动了:每一页面都去执行一个函数,让他们都去覆写一遍点击返回按钮的函数.泪奔┭┮﹏┭┮,想哭的心,像玻璃碎片...............

phone.js

import {
Indicator,
Toast
} from 'mint-ui'
let o = {
stopBack() {
let that = this;
plus.key.removeEventListener('backbutton',function(){});
plus.key.addEventListener("backbutton", function() {
Indicator.close();
that.$confirm('确定要退出程序吗?','操作提醒',{
confirmButtonText: '退出',
cancelButtonText: '取消'
}).then(() => {
plus.runtime.quit()
}).catch(() => {
return
})
}, false)
},
back(beforeBack) { // 点击手机`返回`按钮,非主页面返回上级;如果有返回前处理执行,如果前处理没有返回,或返回!true不再执行返回事件
plus.key.removeEventListener('backbutton',function(){});
plus.key.addEventListener("backbutton", function() {
let cross = false;
Indicator.close();
if(beforeBack){
cross = beforeBack()
}
if(cross){
history.go(-1);
}
}, false)
}
} window.phone = o;
export default o;

一级页面执行如下代码

import phone './phone.js'
...
created: function() {
let that = this;
document.addEventListener('plusready',function(){
phone.stopBack.call(that);
})
}

非一级页面执行如下代码

import phone './phone.js'
...
created: function() {
document.addEventListener('plusready',function(){
phone.back;
})
}

结果3(只会执行一次)

在登录页面加载完成后,会执行phone.stopBack.call(that),但是在切换到别的页面后,不会再执行非一级页面组件中的

created: function() {
document.addEventListener('plusready',function(){
phone.back;
})
}

最终状态

在将phone.js改写,将其中的phone对象添加到Vue对象的原型上,能够在所有组件中直接调用phone对象.

phone.js

import Vue from 'vue'
import {
Indicator,
Toast
} from 'mint-ui'
let o = {
stopBack() {
let that = this;
plus.key.removeEventListener('backbutton',function(){});
plus.key.addEventListener("backbutton", function() {
Indicator.close();
that.$confirm('确定要退出程序吗?','操作提醒',{
confirmButtonText: '退出',
cancelButtonText: '取消'
}).then(() => {
plus.runtime.quit()
}).catch(() => {
return
})
}, false)
},
back(beforeBack) { // 点击手机`返回`按钮,非主页面返回上级;如果有返回前处理执行,如果前处理没有返回,或返回!true不再执行返回事件
plus.key.removeEventListener('backbutton',function(){});
plus.key.addEventListener("backbutton", function() {
let cross = false;
Indicator.close();
if(beforeBack){
cross = beforeBack()
if(cross){
history.go(-1);
}
}else{
history.go(-1);
}
}, false)
}
} window.phone = o; // 挂载到window上
Vue.prototype.phone = o;
export default o;

组件中的处理

在入口组件(非app.vue,本例为login.vue)中.

created: function() {
let that = this;
document.addEventListener('plusready',function(){ // 这里必须得鉴定plusready事件,否则会提示plus没有定义
phone.stopBack.call(that); // 点击手机`返回`按钮
})
}

在首页/我的/聊天这几个和二级页面有关联的一级页面中的处理


/*created*/mounted: function() { // 这里必须用mounted,是因为页面1关闭和页面2打开的节点是:页面2先created,页面1再destroyed,接着页面1mounted
let that = this;
// document.addEventListener('plusready',function(){
// phone.stopBack.call(that);
// })
// 上面注释掉的代码会因为无法监听到`plusready`事件而不能够重写手机的`backButton`事件 phone.stopBack.call(that); // 点击手机`返回`按钮
},
destroyed(){
phone.back()
}

注意:本例中login->项目选择->首页的模式下,login和项目选择组件中是不需要在组件摧毁的时候覆写backButton的,因为首页也是一级页面需要提示.但是和首页平行的几个页面(聊天/我的)需要再组件摧毁的时候单独处理成默认的返回上级,这是因为它们往往会直接进入二级页面,而在二级页面中需要点击返回按钮返回上级的操作.

Vue单页面应用打包app处理返回按钮的更多相关文章

  1. vue单页面应用打包后相对路径、绝对路径相关问题

    原文链接:  vue单页面应用打包后相对路径.绝对路径相关问题展开       在项目开发过程中,在部署过程中,用到了反向代理,这就要求前端代码中不能使用绝对路径.但是我们知道,一般情况下,通过web ...

  2. vue单页面打包文件大?首次加载慢?按需加载?是你打开方式不对

    部署各vue项目,走了一遍坑.... vue单页面应用刷新404 找到nginx多网站配置文件:类似nginx/sites-available/www.baidu.com server { liste ...

  3. [转] 2017-11-20 发布 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新

    目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷新,后退不刷新,类似app般的用户体验.注: 此处的刷新特指当进入此页面时,触发ajax请求,向服务器获取数据.不刷新特指当进入此 ...

  4. 另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新

    目的:vue-cli构建的vue单页面应用,某些特定的页面,实现前进刷新,后退不刷新,类似app般的用户体验.注: 此处的刷新特指当进入此页面时,触发ajax请求,向服务器获取数据.不刷新特指当进入此 ...

  5. 关于处理移动端Vue单页面及其内嵌兼容问题

    关于处理移动端Vue单页面及其内嵌兼容问题 question:由于最近转移了以前的H5项目,重构使用Vue单页面,导致部分手机内嵌或在微信浏览器中无法浏览,或者无法使用ajax请求:手机机型千变万化, ...

  6. 处理 Vue 单页面应用 SEO 的另一种思路

    vue-meta-info 官方地址: monkeyWangs/vue-meta-info (设置vue 单页面meta info信息,如果需要单页面SEO,可以和 prerender-spa-plu ...

  7. Vue单页面骨架屏实践

    github 地址: VV-UI/VV-UI 演示地址: vv-ui 文档地址:skeleton 关于骨架屏介绍 骨架屏的作用主要是在网络请求较慢时,提供基础占位,当数据加载完成,恢复数据展示.这样给 ...

  8. Vue 单页面应用 SEO SPA single page application advantages and disadvantages

    处理 Vue 单页面应用 SEO 的另一种思路 - muwoo - 博客园 https://www.cnblogs.com/tiedaweishao/p/7493971.html SPA网站SEO完美 ...

  9. 在不使用ssr的情况下解决Vue单页面SEO问题

    遇到的问题: 近来在写个人博客的时候遇到了大家可能都会遇到的问题 Vue单页面在SEO时显得很无力,尤其是百度不会抓取动态脚本 Vue-Router配合前后端分离无法让meta标签在蜘蛛抓取时动态填充 ...

随机推荐

  1. 通过myclipse建立一个简单的Hibernate项目(PS:在单元测试中实现数据的向表的插入)

    Hibernate的主要功能及用法: Ⅰ.Hibernate封装了JDBC,使Java程序员能够以面向对象的思想对数据库进行操作 Ⅱ.Hibernate可以应用于EJB的J2EE架构,完成数据的持久化 ...

  2. Entity Framework Core For MySql查询中使用DateTime.Now的问题

    背景 最近一直忙于手上澳洲线上项目的整体迁移和升级的准备工作,导致博客和公众号停更.本周终于艰难的完成了任务,借此机会,总结一下项目中遇到的一些问题. EF Core一直是我们团队中中小型项目常用的O ...

  3. [ch02-02] 非线性反向传播

    系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 2.2 非线性反向传播 2.2.1 提出问题 在上面的线 ...

  4. PHP中echo与print语句的实例教程

    在 PHP 中,有两种基本的输出方法:echo 和 print. echo与print的差异 echo能够输出一个以上的字符串. print只能输出一个字符串,并始终返回 1. 提示:echo 比 p ...

  5. Git及Github

    目录 Git及Github的使用 Git的基本介绍 Git命令行操作 1.设置签名 2.创建本地库 3.仓库初始化 4.状态查看 5.添加文件 6.提交文件 7.历史记录 8.前进后退 9.删除文件 ...

  6. linuxshell编程之数组和字符串处理工具

    数组:存放多个元素的连续内存空间. 声明数组:bash-4以后支持除默认的0,1,2……还可以自定义索引格式,此类数组称之为“关联数组” 声明索引数组:declare -a NAME 声明关联数组:d ...

  7. RobotFramework自动化测试框架-Selenium Web自动化(三)关于在RobotFramework中如何使用Selenium很全的总结(下)

    本文紧接着RobotFramework自动化测试框架-Selenium Web自动化(二)关于在RobotFramework中如何使用Selenium很全的总结(上)继续分享RobotFramewor ...

  8. Java并发之synchronized关键字深度解析(一)

    前言 近期研读路神之绝世武学,徜徉于浩瀚无垠知识之海洋,偶有攫取吉光片羽,惶恐未领略其精髓即隐入岁月深处,遂急忙记录一二,顺备来日吹cow之谈资.本小系列为并发之亲儿子-独臂狂侠synchronize ...

  9. LESSON 5 - Markov Sources

    1.      Markov sources The state of the Markov chain is used to represent the “memory” of the source ...

  10. MySQL 库、表、记录、相关操作(1)

    库.表.记录.相关操作(1) 数据库配置 # 通过配置文件统一配置的目的:统一管理 服务端(mysqld) .客户端(client) # 配置了 mysqld(服务端) 的编码为utf8,那么再创建的 ...