登录
1 定义 my 页面的编译模式
-
勾选启动页面的路径之后,点击确定按钮:
2 实现登录和用户信息组件的按需展示
-
在
components目录中新建登录组件: -
在
components目录中新建用户信息组件: -
在
my.vue页面中,通过mapState辅助函数,导入需要的token字符串:
-
在
my.vue页面中,实现登录组件和用户信息组件的按需展示:
3 实现登录组件的基本布局
- 为
my-login组件定义如下的 UI 结构:
4 点击登录按钮获取微信用户的基本信息
需求描述:需要获取微信用户的头像、昵称等基本信息。
-
为登录的
button按钮绑定open-type="getUserInfo"属性,表示点击按钮时,希望获取用户的基本信息:<!-- 登录按钮 --> <!-- 可以从 @getuserinfo 事件处理函数的形参中,获取到用户的基本信息 --> <button type="primary" class="btn-login" open-type="getUserInfo" @getuserinfo="getUserInfo">一键登录</button> -
在
methods节点中声明getUserInfo事件处理函数如下:
5 将用户的基本信息存储到 vuex
-
在
store/user.js模块的 state 节点中,声明userinfo的信息对象如下:
- 在
store/user.js模块的 mutations 节点中,声明如下的两个方法:
- 使用
mapMutations辅助函数,将需要的方法映射到my-login组件中使用:
6 登录获取 Token 字符串
需求说明:当获取到了微信用户的基本信息之后,还需要进一步调用登录相关的接口,从而换取登录成功之后的 Token 字符串。
- 在
methods中定义getToken方法,调用登录相关的 API,实现登录的功能:
- 在
getUserInfo方法中,预调用this.getToken()方法,同时把获取到的用户信息传递进去:
7 将 Token 存储到 vuex
-
在
store/user.js模块的mutations节点中,声明如下的两个方法:
- 修改
store/user.js模块的state节点如下:
- 在
my-login组件中,把 vuex 中的updateToken方法映射到当前组件中使用:
用户信息
1 实现用户头像昵称区域的基本布局
- 在
my-userinfo组件中,定义如下的 UI 结构:
- 美化当前组件的样式:
2 渲染用户的头像和昵称
-
在
my-userinfo组件中,通过mapState辅助函数,将需要的成员映射到当前组件中使用:// 按需导入 mapState 辅助函数 import { mapState } from 'vuex' export default { computed: { // 将 m_user 模块中的 userinfo 映射到当前页面中使用 ...mapState('m_user', ['userinfo']), }, data() { return {} }, } -
将用户的头像和昵称渲染到页面中:
<!-- 头像昵称区域 --> <view class="top-box"> <image :src="userinfo.avatarUrl" class="avatar"></image> <view class="nickname">{{userinfo.nickName}}</view> </view>
3 渲染面板区域
- 在
my-userinfo组件中,定义如下的 UI 结构:
4 实现退出登录的功能
-
为第三个面板区域中的
退出登录项绑定click点击事件处理函数:<view class="panel-list-item" @click="logout"> <text>退出登录</text> <uni-icons type="arrowright" size="15"></uni-icons> </view> -
在
my-userinfo组件的methods节点中定义logout事件处理函数,清空state中的数据,使用mapMutations辅助方法,将需要用到的 mutations 方法映射到当前组件中:
三秒后自动跳转
1 三秒后自动跳转到登录页面
需求描述:在购物车页面,当用户点击 “结算” 按钮时,如果用户没有登录,则 3 秒后自动跳转到登录页面
-
在
my-settle组件的methods节点中,声明一个叫做showTips的方法,专门用来展示倒计时的提示消息:
-
在
data节点中声明倒计时的秒数:data() { return { // 倒计时的秒数 seconds: 3 } } -
改造
结算按钮的click事件处理函数,如果用户没有登录,则预调用一个叫做delayNavigate的方法,进行倒计时的导航跳转:
- 未登录就要跳转到登录页 定义
delayNavigate方法,初步实现倒计时的提示功能:
重置是防止用户未登录点击结算定时器变成负数,在0的时候就要清除定时器开始跳转
-
在
data节点中声明定时器的 Id 如下:data() { return { // 倒计时的秒数 seconds: 3, // 定时器的 Id timer: null } }
2 登录成功之后再返回之前的页面
核心实现思路:在自动跳转到登录页面成功之后,把返回页面的信息存储到 vuex 中,从而方便登录成功之后,根据返回页面的信息重新跳转回去。
返回页面的信息对象,主要包含 { openType, from } 两个属性,其中 openType 表示以哪种方式导航回之前的页面;from 表示之前页面的 url 地址;
- 在
store/user.js模块的state节点中,声明一个叫做redirectInfo的对象如下:
-
在
store/user.js模块的mutations节点中,声明一个叫做updateRedirectInfo的方法:mutations: { // 更新重定向的信息对象 updateRedirectInfo(state, info) { state.redirectInfo = info } } -
在
my-settle组件中,通过mapMutations辅助方法,把m_user模块中的updateRedirectInfo方法映射到当前页面中使用:methods: { // 把 m_user 模块中的 updateRedirectInfo 方法映射到当前页面中使用 ...mapMutations('m_user', ['updateRedirectInfo']), } -
改造
my-settle组件 methods 节点中的delayNavigate方法,当成功跳转到my 页面之后,将重定向的信息对象存储到 vuex 中:
-
在
my-login组件中,通过mapState和mapMutations辅助方法,将 vuex 中需要的数据和方法,映射到当前页面中使用 -
改造
my-login组件中的getToken方法,当登录成功之后,预调用this.navigateBack()方法返回登录之前的页面 -
在
my-login组件中,声明navigateBack方法如下:
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 20天,点击查看活动详情