一、TabBar处理
1、在view文件创建一个layout文件 来布局页面
<template>
<div class="layout-container">组件布局</div>
</template>
<script>
export default {
name: 'LayoutIndex',
components: {},
props: {},
data () {
return {}
},
computed: {},
watch: {},
created () {},
mounted () {},
methods: {}
}
</script>
<style scoped lang="less">
</style>
2、在路由配置页面配置路径
{
path: '/',
name: 'layout',
component: () => import('@/views/layout')
}
3、添加底部标签栏
在vant文档中找到tarbar标签栏选择想要的样式进行应用
<van-tabbar class="layout-tabbar" route> <van-tabbar-item to="/">
<i slot="icon" class="toutiao toutiao-shouye"></i>
<span class="text">首页</span> </van-tabbar-item>
<van-tabbar-item to="/qa"> <i slot="icon" class="toutiao toutiao-wenda">
</i> <span class="text">问答</span> </van-tabbar-item>
<van-tabbar-item to="/video">
<i slot="icon" class="toutiao toutiao-shipin"></i> <span class="text">视 频</span> </van-tabbar-item>
<van-tabbar-item to="/my">
<i slot="icon" class="toutiao toutiao-wode"></i> <span class="text">我的</span> </van-tabbar-item> </van-tabbar>
tips:slot插槽来显示自己的icon
在样式调整大小
.layout-container {
.layout-tabbar {
i.toutiao {
font-size: 40px;
}
span.text {
font-size: 20px;
}
}
}
4、配置默认子路由
记得把父级路由的name去掉,否则会报错哦
{
path: '/',
// name: 'layout',
component: () => import('@/views/layout'),
children: \[
{
path: '', // 默认子路由
name: 'home',
component: () => import('@/views/home')
},
{
path: 'qa',
name: 'qa',
component: () => import('@/views/qa')
},
{
path: 'video',
name: 'video',
component: () => import('@/views/video')
},
{
path: 'my',
name: 'my',
component: () => import('@/views/my')
}
]
}
]
这样,点击组件就可以看到对应的页面了
二、个人中心的登录状态设置
$router.push()可以点击跳转
未登录的用户
1、先定义一个类名
<div class="my-container">
<div class="top">
</div>
</div>
2、添加头部样式背景
.my-container .top{
height: 361px;
background-image: url(../../assets/banner.png);
background-size: cover;
}
<div class="my-container">
<div class="top not-login">
<div class="login-btn" @click="$router.push('/login')">
<img class="img-mobile" src="转存失败,建议直接上传图片文件 ../../assets/mobile.png" alt="转存失败,建议直接上传图片文件">
<span class="text">登录/注册</span>
</div>
</div>
</div>
4、NavBar组件为登录界面添加×的退出按钮 来实现登录与不登录的切换
<van-nav-bar class="page-nav-bar" title="登录">
<van-icon slot="left" name="cross" @click="$router.back()"></van-icon>
</van-nav-bar>
5、设置用户的头像网名等个人信息
已经登录的用户
<div class="top user">
<div class="base-info">
<div class="left">
<van-image
class="image-touxiang"
src="https://img01.yzcdn.cn/vant/cat.jpeg"
round
/>
<span class="id-text">XX</span>
</div>
<div class="right">
<van-button size="small" type="default" round="">编辑信息</van-button>
</div>
</div>
6、设置头像下方个人的浏览头条、关注、粉丝数、获赞数等信息
<div class="data-status">
<div class="data-item">
<span class="count">8</span>
<span class="text">头条</span>
</div>
<div class="data-item">
<span class="count">66</span>
<span class="text">关注</span>
</div>
<div class="data-item">
<span class="count">88</span>
<span class="text">粉丝</span>
</div>
<div class="data-item">
<span class="count">88</span>
<span class="text">获赞</span>
</div>
三、grid窗格导航
1、vant组件库找到对应组件并且应用
2、图标显示用插槽 要在文字区域加上slot="text" 才会显示图标哦
<van-grid :column-num="2"> <van-grid-item>
<i slot="icon" class="iconfont icon-shoucang"></i>
<span slot="text" class="text">收藏</span> </van-grid-item>
<van-grid-item> <i slot="icon" class="iconfont icon-lishi"></i>
<span slot="text" class="text">历史</span>
</van-grid-item>
</van-grid>
四、处理登录状态显示
1、判断现在是否有用户登录 是的话就显示用户页面,否则显示未登录界面
用vuex中的mapState,在组件、界面中使用mapState获取vuex中state的数据,在计算属性中使用来获取用户的登录状态...mapState(['user'])
import { mapState } from 'vuex'
export default {
name: 'MyIndex',
components: {},
props: {},
data () {
return {}
},
computed: {
...mapState(['user'])
},
watch: {},
created () {},
mounted () {},
methods: {}
}
2、用v-if v-else来实现转换
<div class="top user" v-if="user">//已经登录的
<div class="top not-login" v-else >//未登录的
别忘记退出按钮也要加上!
<span v-if="user" style="color: #e05757; ;">退出登录</span></van-button>
3、点击登录页面跳转到用户页面
简单的方法: this.$router.back()
五、显示用户退出
vant中的popup属性,点击弹出提示
<van-cell is-link >消息通知</van-cell>
<van-cell is-link>小智同学</van-cell>
<van-cell v-if="user"
class="logout-cell"
@click="onLogout"
clickable
title="退出登录"
/>
调用函数:
methods: {
onLogout () {
this.$dialog.confirm({
title: '确认退出吗?'
}).then(() => {
console.log('确认退出')
}).catch(() => {
console.log('确认取消')
})
}
}
在确认退出是,情况本地存储的用户信息
methods: {
onLogout () {
this.$dialog.confirm({
title: '确认退出吗?'
}).then(() => {
this.$store.commit('setUser', null)
}).catch(() => {
console.log('确认取消')
})
}
}
六、展示用户的信息
1、封装接口
export const getUserInfo = () => {
return request({
method: 'GET',
url: '/v1_0/user',
headers: {
Authorization: `Bearer ${store.state.user.token}`
}
})
}
2、请求获取数据
引入
import { getUserInfo } from '@/api/user'
先判断用户是否登录了
data () {
return {
userInfo: {}
}
}
created () {
// 如果用户登录了,请求加载
if (this.user) {
this.loadUserInfo()
}
}
成功获取用户的信息
async loadUserInfo () {
try {
const { data } = await getUserInfo()
this.userInfo = data.data
console.log(data)
} catch (err) {
this.$totast('获取数据失败,请稍后重试')
}
}
3、接口必须授权才可以访问,否则会出现401
headers: {
Authorization: `Bearer ${store.state.user.token}`
}
七、Token优化
请求拦截器来优化(因为token会在很多场景用到,项目中的接口除了登录之外大多数都需要提供 token 才有访问权限。)
GitHub - axios/axios: Promise based HTTP client for the browser and node.js 找到 Interceptors部分
优化后:
request.interceptors.request.use(function (config) {
// Do something before request is sent
// config :本次请求的配置对象
// config 里面有一个属性:headers
// 解构
const { user } = store.state
if (user && user.token) {
config.headers.Authorization = `Bearer ${user.token}`
}
// 一定要返回配置对象,不然请求出不去
return config
}, function (error) {
// Do something with request error
return Promise.reject(error)
})