Vue.js 实战系列之实现视频类WebApp的项目开发——15. 用户信息编辑页面的实现

如果想看该实战系列的其他内容,请移步至 Vue.js 实战系列之实现视频类WebApp的项目开发

项目仓库地址,欢迎 Star


实现效果

在这里插入图片描述


功能实现

  1. 创建顶部导航条组件

    我们发现,在项目中很多地方都用到了顶部导航条,所以就可以考虑将其封装成一个高可复用性的组件来使用。

    src/common/components/index 目录下新建 Header.vue

    因为要实现高可复用性,所以组件的内容都需要通过外部组件传递进来,通过 props 进行接收使用。

    返回上一层我们通过 $router.back() 来实现

    <template>
      <div class="header">
        <div class="left" v-if="hasLeft">
          <span class="iconfont icon-fanhui" v-if="isBack" @click="$router.back()" ></span>
          <span class="iconfont icon-guanbi" v-if="isClose" @click="$router.go(-1)" ></span>
        </div>
        <div class="title">
          <span>{{ title }}</span>
        </div>
        <div class="right" v-if="hasRight">
          <span>{{ rightText }}</span>
        </div>
      </div>
    </template>
    
    <script>
    export default {
        props: {
            title: {
                type: String,
                default: '',
                required: true,
            },
            hasLeft: {
                type: Boolean,
                default: true,
            },
            hasRight: {
                type: Boolean,
                default: false,
            },
            rightText: {
                type: String,
                default: '',
            },
            isBack: {
                type: Boolean,
                default: true,
            },
            isClose: {
                type: Boolean,
                default: false,
            },
        },
    };
    </script>
    
    <style lang="less" scoped>
    .header {
      height: 48px;
      width: 100%;
      background-color: #101821;
      color: #eee;
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 16px;
      padding: 0 10px;
      box-sizing: border-box;
      .left {
          position: absolute;
          left: 10px;
        .iconfont {
          font-size: 24px;
        }
      }
    }
    </style>
    

    公用组件完成了就可以在需要用的地方引入使用了。

    实现效果:
    在这里插入图片描述

  2. 用户信息编辑页面实现

    1. 创建相关路由

      src/router/index.js 中添加以下代码

    {
        path: '/edit',
        name: 'edit',
        component: () => import(/* webpackChunkName: "edit" */ '../views/mine/editInfo.vue'),
    },
    
    1. src/views/mine 目录下新建 editInfo.vue
    <template>
      <div class="edit">
        <Header title="编辑资料" hasLeft></Header>
        <div class="edit-wrap">
          <div class="avatar-box">
            <div class="avatar">
              <img :src="userInfo.avathor" />
              <span class="iconfont icon-xiangji"></span>
              <input type="file" />
              <p>点击更换头像</p>
            </div>
          </div>
          <div class="edit-box">
            <div class="edit-item">
              <span class="label">名称</span>
              <span>
                {{ userInfo.name }}
                <span class="iconfont icon-right"></span>
              </span>
            </div>
            <div class="edit-item">
              <span class="label">抖音号</span>
              <span>
                {{ userInfo.dyh }}
                <span class="iconfont icon-right"></span>
              </span>
            </div>
            <div class="edit-item">
              <span class="label">简介</span>
              <span class="desc">
                点击设置
                <span class="iconfont icon-right"></span>
              </span>
            </div>
            <div class="edit-item">
              <span class="label">性别</span>
              <span>
                {{ userInfo.sex }}
                <span class="iconfont icon-right"></span>
              </span>
            </div>
            <div class="edit-item">
              <span class="label">生日</span>
              <span>
                {{ userInfo.birthday }}
                <span class="iconfont icon-right"></span>
              </span>
            </div>
            <div class="edit-item">
              <span class="label">所在地</span>
              <span>
                {{ userInfo.region }}
                <span class="iconfont icon-right"></span>
              </span>
            </div>
            <div class="edit-item">
              <span class="label">学校</span>
              <span>
                {{ userInfo.school === "" ? "点击设置" : userInfo.school }}
                <span class="iconfont icon-right"></span>
              </span>
            </div>
          </div>
        </div>
      </div>
    </template>
    
    <script>
    import Header from '@/common/components/index/Header.vue';
    import { mapState } from 'vuex';
    
    export default {
        components: {
            Header,
        },
        // 计算属性,监控userInfo
        computed: {
            ...mapState({
                userInfo: (state) => state.user.userInfo,
            }),
        },
    };
    </script>
    
    <style lang="less" scoped>
    .edit {
      background-color: #101821;
      color: #fff;
      min-height: 100vh;
      .edit-wrap {
        padding: 0 15px;
        box-sizing: border-box;
        .avatar-box {
          color: #ffffff;
          text-align: center;
          padding: 20px;
          .avatar {
            position: relative;
            .iconfont {
              position: absolute;
              font-size: 30px;
              left: 50%;
              top: calc(50% - 20px);
              transform: translate(-50%, -50%);
            }
            img {
              height: 100px;
              width: 100px;
              border-radius: 50%;
              opacity: 0.5;
            }
            input {
              position: absolute;
              left: 50%;
              top: 50%;
              width: 50%;
              transform: translate(-50%, -50%);
              opacity: 0;
            }
            p {
              font-size: 16px;
            }
          }
        }
      }
      .edit-box {
        border-top: 1px solid #292831;
        color: #919191;
        .edit-item {
          display: flex;
          justify-content: space-between;
          line-height: 60px;
          font-size: 16px;
          .label {
            color: #ffffff;
          }
          .icon-right {
            font-size: 20px;
          }
        }
      }
    }
    </style>
    
    
    1. mine/index.vue 页面添加跳转时间,从用户信息页面跳转到用户信息编辑页面
    gotoEdit() {
    	this.$router.push({ name: 'edit' });
    },
    

总结

本章节需要注意的几个点:

  • 路由的配置,这个页面跳到的是单独的一个页面,此页面不显示底部的tab栏,所以不能将此页面配置在 Homechildren
  • 公共组件的提取,实现组件的高可复用性

上一章节: 14. 用户信息界面实现

下一章节: 16. 用户信息编辑提交保存的实现

项目整体介绍:Vue.js 项目实战之实现视频播放类WebApp的项目开发(仿抖音app)


项目仓库地址,欢迎 Star。

有任何问题欢迎评论区留言讨论。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值