开始
开头头部的组件。包括背景墙,下面是头像,第三行是昵称和 性别年龄。 第四行是关注。
最外层一个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>