开始
开头头部的组件。包括背景墙,下面是头像,第三行是昵称和 性别年龄。 第四行是关注。
最外层一个view组件,然后里面是一个背景图。在背景图的下面是view包裹的头像。
背景图的文件夹:
D:\wjw\学习中\uni-app\网易云课堂 - uni-app实战仿糗事百科app开发\糗事\课时114.个人空间头部组件开发\bgimg\
背景图和头像。
<view><!-- 背景图 + 用户基本信息 --><view class="user-space-head"><image src="../../static/bgimg/1.jpg" mode="widthFix" lazy-load="true"></image><view class="user-space-head-info"><image src="../../static/demo/userpic/11.jpg" mode="widthFix" lazy-load="true"></image></view></view></view>
引入性别和年龄的组件

import tagSexAge from '@/components/common/tag-sex-age.vue';components:{tagSexAge},
昵称后面是年龄和性别。
<view class="">昵称<tag-sex-age sex="20" age="0"></tag-sex-age></view>

<view class="icon iconfont icon-zengjia">关注</view>
单独加个样式
<view class="icon iconfont icon-zengjia user-space-head-btn">关注</view>
先写一些公共的间距等。上下15的外边距
.user-spaace-margin{margin: 15upx 0;}
图片肯定是全屏的。
让背景图 垂直,水平居中
水平 垂直居中,并且是column布局
<!-- 背景图 + 用户基本信息 --><view class="user-space-head u-f-ajc"><image src="../../static/bgimg/1.jpg" mode="widthFix" lazy-load="true"></image><view class="user-space-head-info u-f-ajc u-f-column"><image src="../../static/demo/userpic/11.jpg" mode="widthFix" lazy-load="true"></image><view class="">昵称<tag-sex-age sex="20" age="0"></tag-sex-age></view><view class="icon iconfont icon-zengjia user-space-head-btn">关注</view></view></view>

.user-space-head{position: relative;height: 500upx;overflow: hidden;}
头像
.user-space-head-info{position: absolute;top: 150upx;}.user-space-head-info>image{width: 150upx;height: 150upx;border-radius: 100%;}
首先是给昵称加点外边距

<view class="user-spaace-margin">昵称<tag-sex-age sex="20" age="0"></tag-sex-age></view><view class="icon iconfont icon-zengjia user-space-head-btn user-spaace-margin">关注</view>
昵称的样式
.user-space-head-info>view:first-of-type{color: #FFFFFF;font-size: 35upx;font-weight: bold;text-shadow: 2upx 2upx 10upx #333333;}
水平居中 flex布局。这样昵称和性别的组件就会在一行上。
关注按钮
吸取黄色
边框色和背景色一致,
上下内边距为0
.user-space-head-btn{background:#FFE933;color: #333333;border: 1upx solid #FFE933;padding: 0 15upx;border-radius: 10upx;}

性别和年龄写反了
<view class="user-spaace-margin u-f-ajc">昵称<tag-sex-age sex="0" age="20"></tag-sex-age></view>
关注按钮有点大了。

.user-space-head-btn{background:#FFE933;color: #333333;border: 1upx solid #FFE933;padding: 0 15upx;font-size: 28upx;border-radius: 10upx;}

已关注的状态。背景色去掉。
.active{background: none;}

.active{background: none;color: #FFFFFF;border: 1upx solid #FFFFFF;}

已关注,加好不应该出现。
构造data
完整的背景图 路径用计算属性来显示
userinfo:{bgimg:1}computed:{getBgImg(){return '../../static/bgimg/'+this.userinfo.bgimg+'.jpg';}},

<view class="user-space-head u-f-ajc"><image :src="getBgImg" mode="widthFix" lazy-load="true"></image><view class="user-space-head-info u-f-ajc u-f-column"><image :src="userinfo.userpic" mode="widthFix" lazy-load="true"></image><view class="user-spaace-margin u-f-ajc">{{userinfo.username}}<tag-sex-age sex="0" age="20"></tag-sex-age></view><view class="icon iconfont icon-zengjia user-space-head-btn user-spaace-margin active">关注</view></view></view>


return {userinfo:{bgimg:1,userpic:'../../static/demo/userpic/11.jpg',username:'昵称',sex:0,age:20,isguanzhu:false}}
没有关注的时候才显示加号的图标。
<!-- 背景图 + 用户基本信息 --><view class="user-space-head u-f-ajc"><image :src="getBgImg" mode="widthFix" lazy-load="true"></image><view class="user-space-head-info u-f-ajc u-f-column"><image :src="userinfo.userpic" mode="widthFix" lazy-load="true"></image><view class="user-spaace-margin u-f-ajc">{{userinfo.username}}<tag-sex-age :sex="userinfo.sex" :age="userinfo.age"></tag-sex-age></view><view class="icon iconfont icon-zengjia user-space-head-btn user-spaace-margin active">{{userinfo.isguanzhu?'已关注':'关注'}}</view></view></view>
关注事件
取反
methods: {guanzhu(){this.userinfo.isguanzhu=!this.userinfo.isguanzhu;}}


背景墙点击事件
可以上面那种单独一行的写法。 也可以用if else的方法


赋值
// 切换背景changeBgImg(){let no = parseInt(this.userinfo.bgimg);// if(no<4){// no++;// }else{// no=1;// }this.userinfo.bgimg = no<4?++no:1;},
添加上点击事件
@tap.stop="changeBgImg"
点击背景图切换

这两个点击事件 目前是单独的还不需要阻止冒泡。
都加上冒泡的阻止事件,也不受影响
<view><!-- 背景图 + 用户基本信息 --><view class="user-space-head u-f-ajc"><image :src="getBgImg" mode="widthFix" lazy-load="true"@tap.stop="changeBgImg"></image><view class="user-space-head-info u-f-ajc u-f-column"><image :src="userinfo.userpic" mode="widthFix" lazy-load="true"></image><view class="user-spaace-margin u-f-ajc">{{userinfo.username}}<tag-sex-age :sex="userinfo.sex" :age="userinfo.age"></tag-sex-age></view><view class="icon iconfont user-space-head-btn user-space-margin":class="[userinfo.isguanzhu?'active':'icon-zengjia']" @tap.stop="guanzhu">{{userinfo.isguanzhu?'已关注':'关注'}}</view></view></view></view>
封装组件


整块html内容和css剪切到组件内
这个是全局的css可以不用剪切过去。

<style scoped>.user-space-head{position: relative;height: 500upx;overflow: hidden;}.user-space-head>image{width: 100%;}.user-space-head-info{position: absolute;top: 150upx;}.user-space-head-info>image{width: 150upx;height: 150upx;border-radius: 100%;}/* 昵称 */.user-space-head-info>view:first-of-type{color: #FFFFFF;font-size: 35upx;font-weight: bold;text-shadow: 2upx 2upx 10upx #333333;}.user-space-head-btn{background:#FFE933;color: #333333;border: 1upx solid #FFE933;padding: 0 15upx;font-size: 28upx;border-radius: 10upx;}.active{background: none;color: #FFFFFF;border: 1upx solid #FFFFFF;}</style>

因为不能直接修改传递过来的属性值,所以用一个值去接收 ,再修改。


把事件都复制过来

主要这里的isguanzhu。就是调用自己组件内部的了。并不是userInfo对象的内的属性值。 
引入的子组件一块复制进来。
使用组件

<user-space-head :userinfo="userinfo"></user-space-head>import userSpaceHead from '@/components/user-space/user-space-head.vue';components:{userSpaceHead},
本节代码
user-space-head组件
<template><view class="user-space-head u-f-ajc"><image :src="getBgImg" mode="widthFix" lazy-load="true"@tap.stop="changeBgImg"></image><view class="user-space-head-info u-f-ajc u-f-column"><image :src="userinfo.userpic" mode="widthFix" lazy-load="true"></image><view class="user-spaace-margin u-f-ajc">{{userinfo.username}}<tag-sex-age :sex="userinfo.sex" :age="userinfo.age"></tag-sex-age></view><view class="icon iconfont user-space-head-btn user-space-margin":class="[isguanzhu?'active':'icon-zengjia']" @tap.stop="guanzhu">{{isguanzhu?'已关注':'关注'}}</view></view></view></template><script>import tagSexAge from '@/components/common/tag-sex-age.vue';export default{components:{tagSexAge},props:{userinfo: Object},data(){return {isguanzhu: this.userinfo.isguanzhu}},computed:{getBgImg(){return '../../static/bgimg/'+this.userinfo.bgimg+'.jpg';}},methods: {// 切换背景changeBgImg(){let no = parseInt(this.userinfo.bgimg);// if(no<4){// no++;// }else{// no=1;// }this.userinfo.bgimg = no<4?++no:1;},// 关注事件guanzhu(){this.isguanzhu=!this.isguanzhu;}}}</script><style scoped>.user-space-head{position: relative;height: 500upx;overflow: hidden;}.user-space-head>image{width: 100%;}.user-space-head-info{position: absolute;top: 150upx;}.user-space-head-info>image{width: 150upx;height: 150upx;border-radius: 100%;}/* 昵称 */.user-space-head-info>view:first-of-type{color: #FFFFFF;font-size: 35upx;font-weight: bold;text-shadow: 2upx 2upx 10upx #333333;}.user-space-head-btn{background:#FFE933;color: #333333;border: 1upx solid #FFE933;padding: 0 15upx;font-size: 28upx;border-radius: 10upx;}.active{background: none;color: #FFFFFF;border: 1upx solid #FFFFFF;}</style>
user-space页面
<template><view><!-- 背景图 + 用户基本信息 --><user-space-head :userinfo="userinfo"></user-space-head></view></template><script>import userSpaceHead from '@/components/user-space/user-space-head.vue';export default {components:{userSpaceHead},data() {return {userinfo:{bgimg:1,userpic:'../../static/demo/userpic/11.jpg',username:'昵称',sex:0,age:20,isguanzhu:false}}},methods: {}}</script><style>.user-spaace-margin{margin: 15upx 0;}</style>
