目录
在完善小程序效果时,想新增一个当用户没有登录时 点击跳转到某个页面实现交易啊,或者添加什么功能时,检验有没有登录 若没有的话 ,就让用户 跳转登录页面并且可以回跳至当前页面
登录成功之后再返回之前的页面
核心实现思路:在自动跳转到登录页面成功之后,把返回页面的信息存储到 vuex 中,从而方便登录成功之后,根据返回页面的信息重新跳转回去。
返回页面的信息对象,主要包含 { type, from } 两个属性,其中 type 表示以哪种方式导航回之前的页面;from 表示之前页面的 url 地址;
就是需要把那个地址存起来
在 user.js自己创建的
- export default {
-
- namespaced: true,
-
- state:() => ({
-
- A: {
- //跳转回页面的路径
- //页面的类型
- }
-
- }),
-
- mutations: {
-
- updateA(state, obj) {
- state.A= obj
- console.log(state.A)
- }
- }
- }
把 A存起来后, 假设登录页面为 B 当前页面为 C
此时在 C页面
- import { mapMutations } from 'vuex'
-
-
- methods: {
-
- ...mapMutations('user.js中自己创建的名字', ['updateA']),
-
- //判断是否登录
- if (!this.token) {
- //console.log('1');
- let n = 3
- uni.$showMsg(`请登录后进行结算,页面将于${n}秒后跳转到登录页面`)
- //倒计时跳转到登录 别忘了 在 data 里面定义 timer 为 null
- let timer = setInterval(() => {
- n--
- if (n === 0) {
- //清空定时器
- clearInterval(timer)
- //跳转页面
- uni.switchTab({
- url: '/pages/my/my',
- success: () => {
- //设置A参数
- // 调用 vuex 的 updateA方法,把跳转信息存储到 Store 中
- this.updateA({
- // 从哪个页面跳转过去的
- from: '/pages/C/C',
- // 跳转的方式
- type: 'switchTab'
- })
- }
- })
- return
- }
- //打开弹窗
- uni.$showMsg(`请登录后进行结算,页面将于${n}秒后跳转到登录页面`)
- }, 1000)
- return
- }
-
- }
-
这里的判断有没有token token的话,通常在我们登录的时候就存起来了
那这里取token就很简单了,但这里有两种方式取
第一种
- import { mapState } from 'vuex'
-
- computed: {
- ...mapState('名字', ['token'])
- },
第二种就是
uni.getStorageSync('token')
B页面
通过 mapState 和 mapMutations 辅助方法,将 vuex 中需要的数据和方法,映射到当前页面中使用
- // 按需导入辅助函数
- import { mapMutations, mapState } from 'vuex'
-
- export default {
- computed: {
- // 调用 mapState 辅助方法,把 m_user 模块中的数据映射到当前用组件中使用
- ...mapState('名字', ['A']),
- },
- methods: {
- // 调用 mapMutations 辅助方法,把 m_user 模块中的方法映射到当前组件中使用
- ...mapMutations('名字', [ 'updateA']),
-
-
- // 调用登录接口,换取永久的 token
- async login() {
- // 省略其它代码...
-
- // 判断 vuex 中的 A是否为
- // 如果不为 null,则登录成功之后,需要重新导航到对应的页面
- this.navigateBack()
- }
-
- // 返回登录之前的页面
- navigateBack() {
- // 判断A 不为 空 且 导航方式为 switchTab
- if (this.A&& this.A.type=== 'switchTab') {
- // 调用小程序提供的 uni.switchTab() API 进行页面的导航
- uni.switchTab({
- // 要导航到的页面地址
- url: this.A.from,
- // 导航成功之后,把 vuex 中的 A对象重置为 空
- complete: () => {
- this.updateA(null)
- }
- })
- }
- }
- },
- }
- //自动跳转回C页面-不是所有的登录都需自动跳转,只有在C页面进行一定功能需跳转到登录页面时,才需要跳转回去
-
- 这里直接在
-
- async login() {
-
-
- ....其他的业务代码
-
- if (Object.keys(this.A).length !== 0) {
- let param = {
- url: this.A.from,
- success: () => {
- //清空A
- this.A({})
- }
- }
- //判断要返回的页面类型
- if (this.A.type === 'switchTab') {
- uni.switch(param)
- } else {
- uni.navigateTo(param)
- }
- }
-
- }
我试过这个方法,有个弊端,虽说能跳转回去,但没有数据,还需传值。。
后来我觉得麻烦,就跟后端的大哥讨论过这个问题,后经讨论决定在首页的时候,让用户必须登录,若没有登录就让跳转到登陆页
后给我弄了一个状态码,若首页出现这个状态码,就让用户去登录,
不成想 之前完成的,回跳原页面,这个方法,用不到,索性就写篇文章记录下
- uni.switchTab({
- url: '/pages/my/my',
- success: () => {
- //设置A参数
- // 调用 vuex 的 updateA方法,把跳转信息存储到 Store 中
- this.updateA({
- // 从哪个页面跳转过去的
- from: '/pages/C/C',
- // 跳转的方式
- type: 'switchTab'
- })
- }
- })
若 跳转的 from 页面(也就是当前页面)不是 在 pages 页面下的 而是分包下的
那 前面的 uni.switchTab 则要改为 uni.navigateTo ,后面的type 也要 改为 navigateTo
上面的 if 判断 也要改为 下面的
- if (this.A.type === 'navigateTo ') {
- uni.navigateTo(param)
- } else {
- uni.navigateTo(param)
- }
其实嘛,我觉得,还是在首页让后端给个状态码,检测有没有登录,若没有登录的话,返回状态码去登录,那若还是不登录,就只展示首页内容,不让用户点击进入