小程序的页面劫持是在网上偶尔知道的方法,感觉很流氓(但是我喜欢)。原理就是利用了对象的原型继承,在页面开始前做些自己需要的更改。

来看这个案例:

根据产品的要求,需要把小程序很多页面做成入口页,每个入口页都需要做授权验证操作。

(一开始我提出可以做出一个单独验证登录页面,所有分享页面都是这个页面,然后在根据传的参数分发到各个不同的页面,但是这个方案被否了,说是影响用户体验);那就只能在当前页面弹框。

方案一:每个页面都复制一份代码;这个方案直接就被我否掉了。

方案二:写成组件,每个页面引入组件。 这个方案的可行性可以说是很高的。

方案三:用模板加上页面劫持。(这个方案可以使公共模板和页面的联系紧密)。

相对于方案二,由于我的项目需要抽出的公共模块和页面联系紧密,所以我选择用了方案三。

下面我就来个阉割版编写过程:

  1. 新建小程序项目 hijackPage;
  2. 把该清理的多余东西都删除掉,留下一片干净的地方让我们开始涂鸦;
  3. 新建一个页面,我们要测试用,就叫做userInfo;
  4. 在根目录创建一个(template)文件夹用来存放我们的模板文件。
  5. 新建一个模板文件夹(login)。文件夹有login.wxss;login.wxml文件。
  6. 在utils文件夹(公共js文件夹)新建一个hijack_login.js文件;这个就是我们劫持页面用的文件。
  7. 在要用模板的页面引入模板,并且把页面劫持。

现在就来看看代码:

template.wxml写一个弹框用户授权:

<template name="login"> //  name 表示模板名字,在页面引入的时候用
<view class='{{showImpowerTip ? "login_box" : "hide"}}'>
<view class='login_content'>
<view class='login_c_tip'>提示</view>
<view class='login_c_txt'>你还没有授权登录哦,赶紧授权登录,就可以体验小程序啦!!</view>
<view class='login_c_click'>
<text class='login_c_btn color_999 click' catchtap='hideshowImpowerTip'>放弃</text>
<text class='login_c_btn_fg'></text>
<button class='login_c_btn color_1aad19 click' open-type="getUserInfo" bindgetuserinfo="getUser">授权</button>
</view>
</view>
</view>
</template>

Template.wxss:

.hide {
display: none;
}
.login_box {
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.4);
display: flex;
align-items: center;
justify-content: center;
}
.login_content {
width: 500rpx;
background-color: #fff;
box-sizing: border-box;
padding-top: 30rpx;
}
.login_c_tip {
font-size: 30rpx;
color: #333;
text-align: center;
}
.login_c_txt {
margin-top: 20rpx;
font-size: 26rpx;
color: #666;
text-align: center;
line-height: 44rpx;
padding: 0 40rpx;
}
.login_c_click {
display: flex;
flex-direction: row;
margin-top: 30rpx;
border-top: 2rpx solid #d7d7d7;
}
.login_c_btn {
flex: 1;
border: none;
background-color: #fff;
text-align: center;
padding: 0;
margin: 0;
height: 88rpx;
line-height: 88rpx;
font-size: 30rpx;
border-radius: 0;
}
.login_c_btn_fg {
display: inline-block;
width: 2rpx;
height: 88rpx;
background-color: #d7d7d7;
}
.login_c_btn::after {
border: none;
}
.color_1aad19{
color: #1aad19;
}
.color_999{
color: #999999;
}
.click:active {
background-color: rgba(0, 0, 0, 0.2);
}

hijack_login.js:

function hijackPage(obj) {
obj.data.showImpowerTip = false; // 是否显示用户授权提示框
obj.data.userMsg = null; // 用户信息对象if(obj.onLoad) {
var _onLoad = obj.onLoad;
obj.onLoad = function(opt) {
this.judgeImpower();_onLoad.apply(this, [opt]);
}}obj.judgeImpower = function() { // 判断用户是否授权
var that = this;
wx.getSetting({
success(res){
if(res.authSetting["scope.userInfo"]) {
that.setData({
showImpowerTip: false
})
if (!that.data.userMsg) {
wx.getUserInfo({
success: user=> {
that.setData({
userMsg: user.userInfo
})
}
})
}
}else {
that.setData({
showImpowerTip: true
})
}
}
})
}obj.getUser = function(e) { // 获取用户信息
console.log(e);
if(e.detail.userInfo) {
this.setData({
userMsg: e.detail.userInfo
})
this.judgeImpower();
}else {
this.hideshowImpowerTip();
}
}
obj.hideshowImpowerTip= function() {
this.setData({
showImpowerTip: false
})
}Page(obj); // 执行
}module.exports={
hijackPage,
}

页面中引入模板:

Index.wxml:

<view class=''>
<view class='user_box'>
<image class='user_img' src='{{userMsg.avatarUrl ? userMsg.avatarUrl : ""}}'></image>
<view class='user_name'>
<text class='{{userMsg.nickName ? "user_title" : "hide"}}'>{{userMsg.nickName ? userMsg.nickName : ""}}</text>
<button class='{{userMsg.nickName ? "hide" : "user_title"}}' open-type="getUserInfo" bindgetuserinfo="getUser">点击授权登录</button>
</view>
</view>
<view class='go_user_c'>
<text class='go_user_btn' catchtap='goUserInfo'>个人中心</text>
</view>
</view><import src="/template/login/login.wxml" /> <!--  引入模板 -->
<template is="login" data="{{showImpowerTip}}" />

hijack_login.js引入页面实现劫持:

index.js:

//index.js
//获取应用实例
var Page = require("../../utils/hiijack_login.js").hijackPage;  //  引入劫持页面
const app = getApp()Page({
data: {
},
onLoad: function () {
},
goUserInfo: function() { // 跳转到个人中心页
wx.redirectTo({
url: '/pages/userInfo/userInfo',
})
}
})

个人中心页面也同样的方法引入。(后面所有新加的页面,只要需要这样操作的,就这样引入就行了)。

那么我们就实现进入页面的时候判断是否授权,如果没有授权,那么弹框提示授权,取消授权以后,去到其他页面一样会提示授权。

微信小程序--页面劫持相关推荐

  1. 微信小程序页面间通信的5种方式

    微信小程序页面间通的5种方式 PageModel(页面模型)对小程序而言是很重要的一个概念,从app.json中也可以看到,小程序就是由一个个页面组成的. 如上图,这是一个常见结构的小程序:首页是一个 ...

  2. 微信小程序页面搜索框查询(无后台接口情况下)

    微信小程序页面搜索框查询(无后台接口情况下) 效果图: wxml <view class="container"><view class="goodsl ...

  3. 小程序向Java传值,微信小程序 页面传值详解

    微信小程序 页面传值详解 一. 跨页面传值. 1 . 用 navigator标签传值或 wx.navigator, 比如 这里将good_id=16 参数传入detail页面, 然后detail页面的 ...

  4. vue用公共组件页面传值_微信小程序页面传值、组件间通信总结

    小程序是一种新的开放能力,开发者可以快速地开发一个小程序.小程序可以在微信内被便 捷地获取和传播,同时具有出色的使用体验.对于微信小程序,前端开发应该不陌生,目前也 是非常火,很多公司都会进行开发.对 ...

  5. h5跳转小程序页面url_微信小程序页面跳转方法

    我所知道的,微信小程序页面跳转有以下方法,下面分情况说明下 一.利用小程序提供的 API 跳转: 1.简单page页面之间跳转 // 保留当前页面,跳转到应用内的某个页面,使用wx.navigateB ...

  6. 微信小程序页面跳转方法总结

    微信小程序页面跳转目前有以下方法(不全面的欢迎补充): 1. 利用小程序提供的 API 跳转: // 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面. // ...

  7. 微信小程序—页面内分享按钮用图标代替

    微信小程序-页面内分享按钮用图标代替 前言 代码 效果图 前言 张小龙不知道出于什么原因将打开客服会话.触发用户转发.打开授权设置页.打开"意见反馈"页面等功能全都挂载到butto ...

  8. 微信小程序页面跳转,url传参参数丢失问题

    微信小程序页面跳转,url传参参数丢失问题 // pages/order/purchase/index.js// 跳转到采购订单详情toPurchaseOrderDetail(e) {// conso ...

  9. 微信小程序 界面从右边滑出_微信小程序页面溢出左右滑动问题

    微信小程序 页面中view设置width:100%之后,页面右边会多出一块白区域,并且可以左右滑动,解决方法是给这个view加一个box-sizing:border-box; 欢迎使用Markdown ...

最新文章

  1. 以前5年只专注于.net,现今开始学习java.
  2. 建立名称server
  3. java连接redis无法连接,报异常RedisConnectionException
  4. python win10 桌面_Python3如何实现Win10桌面自动切换
  5. 对于SQL注入的理解
  6. Jquery实现鼠标双击Table单元格变成文本框
  7. c语言排列10个数字的大小,[求助][C语言求助]输入10个数字,并将这些数字由大到小排列...
  8. dsoframer.ocx java_dsoframer.ocx(java web 操作word) 总结一下
  9. oracle 存档终点修改,修改归档模式的存档终点 archive log list
  10. 虚短”“虚断”两板斧,搞定运算放大器 11张大图详(转)
  11. 2020中国数据智能产业图谱1.0版发布丨数据猿产业全景图
  12. Python创建网站
  13. python中turtle画小草_python 笔记 之带参数的装饰器
  14. lanyu 激活idea
  15. matlab2014b与carsim8.02联合仿真可能遇到的问题
  16. arnold如何设置鱼眼相机_【总结】如何看待默认渲染器、arnold阿诺德渲染器、Octane渲染器、Redshift等渲染器?...
  17. 1031 查验身份证 PTA
  18. 联想小新一键恢复小孔_联想小新笔记本如何一键恢复出厂设置_联想小新air恢复出厂设置教程...
  19. 以数据智能引领产业数字化,滴普科技宣布完成5000万美元A+轮融资
  20. 2018美团codeM资格赛——python代码

热门文章

  1. 华为手机显示您的手机未连接服务器,手机提示链接不到服务器
  2. 原生小程序使用 flyio,以及拦截器
  3. ZW32-12型户外柱上高压真空断路器
  4. 安霸平台gpio扩展芯片aw9523b调试
  5. 慕课Java第三季学习及笔记整理
  6. 数据结构与算法——概念
  7. 4.最早出现的计算机网络是,《计算机应用基础》o期末试卷(a卷).doc
  8. 拉卡拉的十四年和第三次成人礼
  9. 亚信安全为80%入围中国银行提供安全防护
  10. CSS实现水平居中与垂直居中