1.TabBar处理

通过分析页面,我们可以看到,首页、问答、视频、我的 都使用的是同一个底部标签栏,我们没必要在每个页面中都写一个,所以为了通用方便,我们可以使用 Vue Router 的嵌套路由来处理

父路由:一个空页面,包含一个 tabbar,中间留子路由出口
子路由:首页、问答、视频、我的

1.创建 tabbar 组件并配置路由

src/views/layout/index.vue:

<template><div class="layout-container"><!-- 子路由出口 --><router-view /><!-- /子路由出口 --><!-- 标签导航栏 --><!--route: 开启路由模式--><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><!-- /标签导航栏 --></div>
</template><script>
export default {name: 'LayoutIndex',components: {},props: {},data () {return {}},computed: {},watch: {},created () {},mounted () {},methods: {}
}
</script><style scoped lang="less">
.layout-container {.layout-tabbar {i.toutiao {font-size: 40px;}span.text {font-size: 20px;}}
}
</style>

2、然后将 layout 组件配置到一级路由

router/index.js:

{path: '/',component: () => import('@/views/layout')
}

3.分别创建首页、问答、视频、我的页面组件

4.将四个主页面配置为 tab-bar 的子路由

{path: '/',name: 'tab-bar',component: () => import('@/views/tab-bar'),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')}]
}

2.页面布局 ——顶部未登录

<template><div class="my-container"><div class="header"><imgclass="mobile-img"src="~@/assets/mobile.png"@click="$router.push('/login')"></div><div class="grid-nav"></div><van-cell title="消息通知" is-link url="" /><van-cell title="实名认证" is-link url="" /><van-cell title="用户反馈" is-link url="" /><van-cell title="小智同学" is-link url="" /><van-cell title="系统设置" is-link url="" /></div>
</template><script>
export default {name: 'MyIndex',components: {},props: {},data () {return {}},computed: {},watch: {},created () {},mounted () {},methods: {}
}
</script><style scoped lang="less">
.my-container {> .header {height: 361px;background: url("~@/assets/banner.png") no-repeat;background-size: cover;display: flex;justify-content: center;align-items: center;.mobile-img {width: 132px;height: 132px;}}
}
</style>

@click="$router.push('/login')"  点击跳转login界面

@click="$router.back()"              点击返回上一状态

在login界面设置返回按钮,回到上一状态:

    <van-nav-bar class="page-nav-bar" title="登录"><van-icon slot="left" name="cross" @click="$router.back()" /></van-nav-bar>

3.页面布局——顶部已登录状态

1.样式:

  .user-info {.base-info {height: 231px;padding: 76px 32px 23px;box-sizing: border-box;display: flex;justify-content: space-between;align-items: center;.left {display: flex;align-items: center;.avatar {width: 132px;height: 132px;border: 4px solid #fff;margin-right: 23px;}.name {font-size: 30px;color: #fff;}}}.data-stats {display: flex;.data-item {height: 130px;flex: 1;display: flex;flex-direction: column;justify-content: center;align-items: center;color: #fff;.count {font-size: 36px;}.text {font-size: 23px;}}}}

2.布局:

<div class="header user-info"><div class="base-info"><div class="left"><van-imageroundfit="cover"class="avatar"src="https://img01.yzcdn.cn/vant/cat.jpeg"/><span class="name">今日头条号</span></div><div class="right"><van-button size="mini" round>编辑资料</van-button></div></div><div class="data-stats"><div class="data-item"><span class="count">10</span><span class="text">头条</span></div><div class="data-item"><span class="count">10</span><span class="text">关注</span></div><div class="data-item"><span class="count">10</span><span class="text">粉丝</span></div><div class="data-item"><span class="count">10</span><span class="text">获赞</span></div></div></div>

4.页面布局——宫格导航

1.样式:

  .grid-nav {.grid-item {height: 141px;i.iconfont {font-size: 45px;}.icon-shoucang {color: #eb5253;}.icon-lishi {color: #ff9d1d;}span.text {font-size: 28px;}}}

2.布局:

    <van-grid class="grid-nav" :column-num="2" clickable><van-grid-item class="grid-item"><i slot="icon" class="iconfont icon-shoucang"></i><span slot="text" class="text">收藏</span></van-grid-item><van-grid-item class="grid-item"><i slot="icon" class="iconfont icon-lishi"></i><span slot="text" class="text">历史</span></van-grid-item></van-grid>

5.样式布局——其他


6.处理页面显示状态

- 未登录,展示登录按钮
- 已登录,展示登录用户信息

<!-- 已登录:用户信息 -->
<div v-if="$store.state.user" class="user-info-wrap">...
</div>
<!-- /已登录:用户信息 --><!-- 未登录 -->
<div v-else class="not-login" @click="$router.push('/login')">...
</div>
<!-- /未登录 --><!-- 退出 -->
<van-cell-group v-if="$store.state.user">...
</van-cell-group>
<!-- /退出 --><script>
import { mapState } from 'vuex'
export default {name: 'MyIndex',computed: {...mapState(['user'])}
}
</script>

底部导航栏在登录时显示我的,未登录时显示未登录

layout/index.vue:

<van-tabbar-item to="/my"><i slot="icon" class="iconfont icon-wode"></i><span class="text">{{$store.state.user ? '我的' : '未登录'}}
</span></van-tabbar-item>

登录界面登录成功跳转回原来页面:

login/index.vue:

      // 3.提交表单请求登录try {const { data } = await login(this.user)console.log('登录成功')this.$store.commit('setUser', data.data)this.$toast.success('登录成功')//登录成功跳转回原来页面this.$router.back()//back方式不严谨} catch (err) {if (err.response.status === 400) {this.$toast.fail('手机号或验证码错误')} else {//   console.log('登录失败,请稍后重试', err)this.$toast.fail('登录失败,请稍后重试')}}

7. 用户退出

1、给退出按钮注册点击事件

2、退出处理


在组件中需要使用 this.$dialog 来调用弹框组件

onLogout () {// 退出提示// 在组件中需要使用 this.$dialog 来调用弹框组件this.$dialog.confirm({title: '确认退出吗?'}).then(() => {// on confirm// 确认退出:清除登录状态(容器中的 user + 本地存储中的 user)this.$store.commit('setUser', null)}).catch(() => {// on cancelconsole.log('取消执行这里')})
}

8.展示登录用户信息

1.在 api/user.js`中添加封装数据接口

import store from '@/store'/*** 获取用户自己的信息*/
export const getUserInfo = () => {return request({method: 'GET',url: '/app/v1_0/user',// 发送请求头数据headers: {// 注意:该接口需要授权才能访问//       token的数据格式:Bearer token数据,注意 Bearer 后面有个空格Authorization: `Bearer ${store.state.user.token}`}})
}

2.在 views/my/index.vue请求加载数据

import { getUserInfo } from '@/api/user'export default {name: 'MyPage',components: {},props: {},data () {return {userInfo: {} // 用户信息}},computed: {},watch: {},created () {// 初始化的时候,如果用户登录了,我才请求获取当前登录用户的信息if (this.$store.state.user) {this.loadUser()}},mounted () {},methods: {async loadUser () {try {const { data } = await getUserInfo()this.user = data.data} catch (err) {console.log(err)this.$toast('获取数据失败')}}}
}

3、模板绑定

    <!-- 已登录 --><div v-if="user" class="header user-info"><div class="base-info"><div class="left"><van-image round fit="cover" class="avatar" :src="userInfo.photo" /><span class="name">{{ userInfo.name }}</span></div><div class="right"><van-button size="mini" round>编辑资料</van-button></div></div><div class="data-stats"><div class="data-item"><span class="count">{{ userInfo.art_count }}</span><span class="text">头条</span></div><div class="data-item"><span class="count">{{ userInfo.follow_count }}</span><span class="text">关注</span></div><div class="data-item"><span class="count">{{ userInfo.fans_count }}</span><span class="text">粉丝</span></div><div class="data-item"><span class="count">{{ userInfo.like_count }}</span><span class="text">获赞</span></div></div></div><!-- 已登录 -->

9.优化设置 Token

项目中的接口除了登录之外大多数都需要提供 token 才有访问权限。

使用请求拦截器统一添加(推荐,更方便)

在 `src/utils/request.js` 中添加拦截器统一设置 token:

/*** 请求模块*/
import axios from 'axios'
import store from '@/store'const request = axios.create({baseURL: 'http://ttapi.research.itcast.cn/' // 接口的基准路径
})// 请求拦截器
// Add a request interceptor
request.interceptors.request.use(function (config) {// Do something before request is sent// config :本次请求的配置对象// config 里面有一个属性:headersconst { user } = store.stateif (user && user.token) {config.headers.Authorization = `Bearer ${user.token}`}return config
}, function (error) {// Do something with request errorreturn Promise.reject(error)
})// 响应拦截器export default request

仿今日头条项目——个人中心相关推荐

  1. 仿今日头条项目——首页(展示文章列表)

    1.头部导航栏组件 1.使用导航栏组件 2.在导航栏组件中插入按钮 <template><div class="home-container"><!- ...

  2. 仿今日头条项目——文章详情

    1.创建组件并配置路由 1.创建 views/article/index.vue 组件 <template><div class="article-container&qu ...

  3. 仿今日头条项目——首页(文章搜索)

    1.创建组件并配置路由 1.创建 src/views/search/index.vue <template><div class="search-container&quo ...

  4. 仿今日头条项目——首页(频道编辑)

    1.频道编辑组件 1.1处理页面弹出层 在 data中添加一个数据用来控制弹层的显示和隐藏,然后在首页模板中的频道列表后面添加弹出层组件 data () {return {...isChannelEd ...

  5. Android仿今日头条的开源项目

    起因 看到众多大神纷纷有了自己的开源项目,于是自己琢磨着也想做一个开源项目来学习下,因为每次无聊必刷的app就是今日头条,评论简直比内容都精彩,所以我打算仿今日头条来练练手,期间也曾放弃过,也遇到很多 ...

  6. Android仿今日头条开源项目

    起因 看到众多大神纷纷有了自己的开源项目,于是自己琢磨着也想做一个开源项目来学习下,因为每次无聊必刷的app就是今日头条,评论简直比内容都精彩,所以我打算仿今日头条来练练手,期间也曾放弃过,也遇到很多 ...

  7. Android 仿今日头条的开源项目

    前言 看到众多大神纷纷有了自己的开源项目,于是自己琢磨着也想做一个开源项目来学习下,因为每次无聊必刷的 app 就是今日头条,评论简直比内容都精彩,所以我打算仿今日头条来练练手,期间也曾放弃过,也遇到 ...

  8. android仿今日头条个人中心页面

    android仿今日头条个人中心页面 效果图 实现步骤: 自定义ScrollView,添加一个反弹的动画 代码: package com.example.administrator.gerenzhon ...

  9. 转载 Android仿今日头条详情页实现

    转载自@ice_Anson Android仿今日头条详情页实现 源码地址: Android仿今日头条详情页实现 github源码地址 动态图 最近项目有个需求,需要实现一个和今日头条新闻详情页一样的体 ...

  10. android如何展示富文本_android高仿今日头条富文本编辑(发布文章)

    前言: 在经历了几个月的项目期限.我们遇到了前端发布文章,要用到富文本编辑的功能.在一番衡量下最终用到了richeditor-android第三方框架.实现原理就是通过webView和js实现前端富文 ...

最新文章

  1. jQuery监控页面所有ajax请求的方法
  2. 230:Borrowers
  3. 图片本地化 php,php抓取远程图片本地化函数,很好用的.喜欢的拿去
  4. webstorm小技巧
  5. 前端开发这么多年,你真的了解浏览器页面渲染机制吗?
  6. Delphi之面向对象的界面复用技术
  7. 全球地区资料json 含中英文 经纬度_含乳饮料行业发展趋势及市场化程度分析(附报告目录)...
  8. 浮动层图片鼠标指针移到自动放大
  9. server2016做文件服务器,『配置』服务器搭建 Office Online Server2016 实现文档预览 番外 错误篇...
  10. air android 通信,Android超声波通信例子
  11. Redis(三):Redis基础知识与常用命令
  12. Python3 使用requests请求,解码时出错:'utf8' codec can't decode byte 0x8b in position 1: invalid start byte...
  13. 游戏里的---Change
  14. Tesseract训练笔记
  15. 获取西刺代理IP构建代理池
  16. UISwitch的使用 - IOS
  17. RationalDMIS 2020 CAD模型坐标系转换(山涧果子)2021
  18. 火狐浏览器丢失书签,恢复无法处理备份文件的解决方案
  19. Android直播中弹幕效果实现
  20. 机械臂规划----三次样条曲线

热门文章

  1. php怎么把多个pdf拼接成一个,两张pdf合并成一页 怎么将pdf文件中的页面进行拼接?两页或多页pdf拼接...
  2. WORD文件拼版生成PDF方法
  3. 一拳超人最强之男手游辅助脚本 快速升级提高提高战力
  4. K-Java WAP浏览器
  5. JS的onpropertychange方法怎么使用?
  6. SKPlayer -- 一个超级简单好用的音乐插件+CSS+HTML+JS
  7. 中标麒麟系统安装步骤
  8. 【网易云课堂】产品运营学习
  9. Kademlia、DHT、KRPC、BitTorrent 协议、DHT Sniffer
  10. 【实用软件】picasa不能导入文件夹至其中 的问题解决