当前位置:   article > 正文

uni-app小程序开发实战 | (从零设计一款个人中心页面,最详细)_uniapp我的页面设计

uniapp我的页面设计

个人中心页面很常用,几乎每个app里面都少不了。同时个人中心页也较简单,可以作为UI项目练手,熟悉常用UI界面的设计和flex布局。这里分享下一款简约的个人中心页面,并详细介绍从零的实现过程,分享给有需要的小伙伴,需要的可以收藏。

基本流程

在uni-app中设计个人中心页面,通常需要考虑以下步骤:

1.页面布局规划

分析个人中心需要展示的内容,如头像、昵称、积分、订单、收藏、设置等。

设计合理的布局,通常采用顶部导航栏、底部导航栏和中间内容区的结构。

2.创建页面结构

创建一个新的Vue组件,例如命名为PersonalCenter.vue。在组件中设置基本的HTML结构。

3.样式设计

使用CSS(如SCSS、Less等预处理器)来定义样式,确保跨平台兼容性。

应用uni-app的CSS变量和组件样式,如uni-row和uni-col来创建网格布局。

使用uni-icons组件添加图标。

4.组件化

这一步非必须,根据需要,将可复用的部分(如订单列表、个人资料卡片等)拆分为单独的组件。例如,创建一个UserInfoCard.vue用于展示用户基本信息。

5.数据绑定

通过data属性定义页面需要的数据。

使用v-model或props从父组件传递数据。

使用uni.request()获取服务器数据。

6.交互逻辑

实现点击事件监听,例如点击某个按钮跳转到详情页或执行其他操作。

使用methods定义事件处理函数。

7.状态管理

可以考虑使用Vuex进行状态管理,尤其是当页面有复杂的交互或多个组件需要共享状态时。

8.页面路由

配置pages.json以包含个人中心页面的路由信息。

可以使用uni-router或vue-router进行页面间的导航。

8.测试与优化

在模拟器或真机上测试页面显示和交互。

根据反馈调整布局和样式,确保在不同设备上表现良好。

9.发布与部署

编译并打包uni-app项目

将打包后的代码上传到对应的小程序平台进行审核和发布。

以上只是一个基本流程。在实际开发中还需要考虑更多细节,例如错误处理、网络状态管理、用户体验优化等。随着项目进展,你可能需要根据需求不断迭代和优化设计。

环境准备

 1.下载并使用最新版本的HbuilderX开发工具。工具下载地址:

HBuilderX-高效极客技巧

2.新建一项目,直接选择最基础的一个uni-app的hello-world工程模版。

3.下载并安装uni-ui组件。根据官方建议,使用组件的顺序为:内置组件-> ui-ui组件 -> 三方组件。

实现过程

一般如果有UI设计人员的话,都会给出一个效果图和图片素材,帮你切好图片资源。如果没有效果图,则根据自己的设想,参考一些其它APP的个人中心页面,分析下界面内容和布局,最后实现自己的设计。

通过分析,可以知晓大致有哪些内容,需要什么布局结构等。接下来开始实现过程。

把整体页面分为几个部分:

头部模块

头部模块中间的区域模块,统计模块和下方的item条目模块。

  1. <template>
  2. <view class="wrapper">
  3. <!-- 个人资料 -->
  4. <view>
  5. <view class="top">
  6. <view class="center">
  7. </view>
  8. </view>
  9. </view>
  10. <!-- 统计 -->
  11. <view class="count">
  12. </view>
  13. <!-- 其它 -->
  14. <view class="extra">
  15. </view>
  16. </view>
  17. </template>

wrapper整体页面的样式设计,css样式类wrapper和头部样式设计。

  1. <template>
  2. <view class="wrapper">
  3. </view>
  4. </template>
  5. <style>
  6. .wrapper {
  7. position: absolute;
  8. top: 0;
  9. bottom: 0;
  10. width: 100%;
  11. background-color: #F4F4F4;
  12. }
  13. .top {
  14. width: 100%;
  15. height: 200rpx;
  16. background: #2979ff;
  17. padding-top: 30rpx;
  18. position: relative;
  19. }
  20. </style>

头部的中间区域

注意style后面别忘加scoped和lang属性。

在Vue组件的<style>标签中使用scoped属性时,它会告诉Vue将此<style>块中的CSS样式限制在当前组件范围内。这意味着这些样式只会应用到当前组件的元素上,不会影响到其他组件或全局样式,从而实现了CSS的模块化,避免冲突。

lang属性用来指定<style>标签中CSS代码的预处理器语言。Vue和uni-app支持多种预处理器,如Sass、Less、Stylus等。作用: 允许开发者使用预处理器的语法编写CSS,提高编写效率,支持变量、注释、嵌套、混合、函数等功能。例如,使用lang="less"可以让Vue识别并编译Less代码。

  1. <template>
  2. <view class="wrapper">
  3. <view class="top">
  4. <view class="center">
  5. <view class="center_top">
  6. </view>
  7. </view>
  8. </view>
  9. </view>
  10. </template>
  11. <script>
  12. export default {
  13. data() {
  14. return {
  15. title: 'Hello'
  16. }
  17. },
  18. onLoad() {
  19. },
  20. methods: {
  21. }
  22. }
  23. </script>
  24. <style scoped lang="scss">
  25. .wrapper {
  26. position: absolute;
  27. top: 0;
  28. bottom: 0;
  29. width: 100%;
  30. background-color: #F4F4F4;
  31. }
  32. .top {
  33. width: 100%;
  34. height: 200rpx;
  35. background: #2979ff;
  36. padding-top: 30rpx;
  37. position: relative;
  38. }
  39. .center {
  40. width: 95%;
  41. height: 160rpx;
  42. background: #55aaff;
  43. display: flex;
  44. flex-direction: column;
  45. justify-content: center; /* 水平居中 */
  46. align-items: center; /* 垂直居中 */
  47. margin: 0 auto;
  48. border-radius: 5rpx;
  49. }
  50. .center_top {
  51. display: flex;
  52. min-width: 350rpx;
  53. flex-direction: row;
  54. background: #ffaa7f;
  55. height: 100rpx;
  56. margin-top: 0rpx;
  57. border-bottom: 1rpx solid #5555ff;
  58. }
  59. </style>

 

头像和显示昵称

.center_top是个flex布局,内部包含center_img和center_info的横向排列。所以center_top的flex-direction应设置为 row,横向排列。center_info又包含昵称和vip会员等级显示内容,是个纵向的布局关系。

头像和显示昵称的flex布局样式:

  1. .center_top {
  2. display: flex;
  3. min-width: 350rpx;
  4. flex-direction: row;
  5. //background: #ffaa7f;
  6. height: 100rpx;
  7. margin-top: 0rpx;
  8. border-bottom: 1rpx solid #5555ff;
  9. }
  10. .center_img {
  11. width: 90rpx;
  12. height: 90rpx;
  13. border-radius: 50%;
  14. overflow: hidden;
  15. }
  16. .center_info {
  17. display: flex;
  18. flex-direction: column;
  19. margin-top: 20rpx;
  20. margin-left: 20rpx;
  21. }
  22. .center_name {
  23. font-size: 14rpx;
  24. }
  25. .vip_text {
  26. font-size: 14rpx;
  27. margin-top: -33rpx;
  28. margin-left: 40rpx;
  29. color: #AAAAAA;
  30. }

其中会员的显示有个钻石的icon的图标,这个有现成的uni-icon可以用。

<uni-icons type="vip" size="14"></uni-icons>

 图标资源介绍,参见uni-app官网:uni-icons 图标 | uni-app官网

统计模块

主要用于个具有弹性和居中对齐的容器.count,并且包含两种类型的子元素.cell和.text,它们有自己的样式和布局特性。这样的设计可能用于显示数量、统计或其他需要分组的文本信息。

  1. <template>
  2. <view class="wrapper">
  3. <view class="top">
  4. <view class="center">
  5. <view class="center_top">
  6. </view>
  7. </view>
  8. </view>
  9. <!-- 统计 -->
  10. <view class="count">
  11. <view class="cell"> 8 <text style="color: #AAAAAA;">收藏影视</text> </view>
  12. <view class="cell"> 14 <text style="color: #AAAAAA;">历史记录</text> </view>
  13. <view class="cell"> 18 <text style="color: #AAAAAA;">关注信息</text> </view>
  14. <view class="cell"> 84 <text style="color: #AAAAAA;">我的足迹</text> </view>
  15. </view>
  16. </view>
  17. </template>
  18. <style scoped lang="scss">
  19. .count {
  20. display: flex;
  21. margin: 0 20rpx;
  22. height: 120rpx;
  23. text-align: center;
  24. border-radius: 4rpx;
  25. background-color: #fff;
  26. position: relative;
  27. top: 10rpx;
  28. .cell {
  29. margin-top: 10rpx;
  30. flex: 1;
  31. padding-top: 20rpx;
  32. font-size: 27rpx;
  33. color: #333;
  34. }
  35. text {
  36. display: block;
  37. font-size: 24rpx;
  38. }
  39. }
  40. </style>

.count

设置为display: flex;,意味着这个元素将作为一个弹性容器,其子元素将按照弹性布局排列。

margin: 0 20rpx;设置上下无边距,左右边距为20rpx,提供内缩的视觉效果。 

text-align: center;使.count内的文本居中对齐。

border-radius: 4rpx;给.count添加4rpx的圆角,提升视觉效果。

position: relative;将.count设置为相对定位,以便后续可以使用绝对定位相对于它自身进行定位。

top: 10rpx;将.count向上偏移10rpx,可能会与其他元素产生位置关系。

没有指定flex-direction,则默认是横向排列,与flex-direction: row等同。

.cell

是.count内的子元素,设置margin-top: 10rpx;为其添加顶部边距。

.cell的flex: 1;表示在弹性布局中,分配剩余空间,使得它能自适应容器宽度。 

.cell的padding-top: 20rpx;设置内部顶部填充,提供与内容的距离。

.text

.text是另一个嵌套的子元素

display: block;确保它作为独立的块级元素显示。

块级元素的特点是它们会在垂直方向上占据一整行,彼此之间默认有换行。块级元素可以设置宽度(width)和高度(height),而行内元素通常不能直接设置宽高(除非使用display: inline-block;或float)。块级元素的宽度默认是其父元素的100%,除非另有指定。有时候还可用于清除浮动元素的影响,例如,通过在非浮动的兄弟元素上使用display: block;来确保它们不会跟随浮动元素。

display: block;是布局和设计中一个非常基础且重要的工具,它允许开发者更好地控制元素的外观和布局。 

显示条目

这部分内容简单,用uni-list-item组件可以用。如果不加样式,看到的是上图红框中的效果,这跟设计的不符合,所以也需要设计下样式。

  1. .extra {
  2. margin: 10rpx 20rpx;
  3. background-color: #fff;
  4. border-radius: 4rpx;
  5. .item {
  6. line-height: 1;
  7. padding: 25rpx 0 25rpx 20rpx;
  8. border-bottom: 1rpx solid #eee;
  9. font-size: 30rpx;
  10. color: #333;
  11. }
  12. button {
  13. text-align: left;
  14. background-color: #fff;
  15. &::after {
  16. border: none;
  17. border-radius: 0;
  18. }
  19. }
  20. }

完整页面代码

包含登录状态的切换及跳转到其他页面。

  1. <template>
  2. <view class="wrapper">
  3. <!-- 个人资料 -->
  4. <view>
  5. <view class="top">
  6. <view class="center">
  7. <view v-if="isLoggedIn">
  8. <view class="center_top">
  9. <view class="center_img" >
  10. <!-- 这里可以放自己的静态头像 -->
  11. <image src="/static/me.jpg"></image>
  12. <!-- <open-data type="userAvatarUrl" class="user_head"></open-data> -->
  13. </view>
  14. <view class="center_info" >
  15. <view class="center_name">
  16. 特立独行的猫
  17. </view>
  18. <view class="center_vip">
  19. <uni-icons type="vip" size="14"></uni-icons>
  20. <view class="vip_text">
  21. <text>普通会员</text>
  22. </view>
  23. </view>
  24. <!-- 其他个人中心内容 -->
  25. </view>
  26. </view>
  27. </view>
  28. <view v-else class="loginButton" @click="onLoginClick">登录</view>
  29. </view>
  30. </view>
  31. </view>
  32. <!-- 统计 -->
  33. <view class="count">
  34. <view class="cell"> 8 <text style="color: #AAAAAA;">收藏影视</text> </view>
  35. <view class="cell"> 14 <text style="color: #AAAAAA;">历史记录</text> </view>
  36. <view class="cell"> 18 <text style="color: #AAAAAA;">关注信息</text> </view>
  37. <view class="cell"> 84 <text style="color: #AAAAAA;">我的足迹</text> </view>
  38. </view>
  39. <!-- 其它 -->
  40. <view class="extra">
  41. <uni-list>
  42. <uni-list-item showArrow title="我的消息" ></uni-list-item>
  43. <uni-list-item showArrow title="意见反馈" ></uni-list-item>
  44. <uni-list-item showArrow title="分享链接" @click.native="onShareClick($event,1)" link></uni-list-item>
  45. <uni-list-item showArrow title="关于我们" link to="/pages/about/about?item=2"></uni-list-item>
  46. <!-- <uni-list-item showArrow title="关于我们" link="navigateTo" :to="'/pages/about/about?item=1'"></uni-list-item> -->
  47. </uni-list>
  48. </view>
  49. </view>
  50. </template>
  51. <script>
  52. export default {
  53. data() {
  54. return {
  55. isLoggedIn: true,
  56. userInfo: {}
  57. }
  58. },
  59. computed: {
  60. },
  61. created(){
  62. },
  63. methods: {
  64. onLoginClick() {
  65. // 跳转至登录页面
  66. //uni.navigateTo({ url: '/pages/login/login' });
  67. },
  68. onShareClick($event,args){
  69. console.log($event);
  70. console.log("onShareClick");
  71. uni.share({
  72. provider: "weixin",
  73. scene: "WXSceneSession",
  74. type: 0,
  75. href: "http://uniapp.dcloud.io/",
  76. title: "分享的标题",
  77. summary: "分享的内容",
  78. imageUrl: "https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni@2x.png",
  79. success: function (res) {
  80. console.log("success:" + JSON.stringify(res));
  81. },
  82. fail: function (err) {
  83. console.log("fail:" + JSON.stringify(err));
  84. }
  85. });
  86. }
  87. }
  88. };
  89. </script>
  90. <style scoped lang="scss">
  91. Page {
  92. font-size: 14rpx;
  93. }
  94. .top {
  95. width: 100%;
  96. height: 200rpx;
  97. // background: #23EBB9;
  98. background: #2979ff;
  99. padding-top: 30rpx;
  100. position: relative;
  101. }
  102. .center {
  103. width: 95%;
  104. height: 160rpx;
  105. background: #55aaff;
  106. display: flex;
  107. flex-direction: column;
  108. justify-content: center; /* 水平居中 */
  109. align-items: center; /* 垂直居中 */
  110. margin: 0 auto;
  111. border-radius: 5rpx;
  112. }
  113. .center_top {
  114. display: flex;
  115. min-width: 350rpx;
  116. flex-direction: row;
  117. //background: #ffaa7f;
  118. height: 100rpx;
  119. margin-top: 0rpx;
  120. border-bottom: 1rpx solid #5555ff;
  121. }
  122. .center_img {
  123. width: 90rpx;
  124. height: 90rpx;
  125. border-radius: 50%;
  126. overflow: hidden;
  127. }
  128. .center_img image {
  129. width: 100%;
  130. height: 100%;
  131. }
  132. .center_img .user_head {
  133. width: 100%;
  134. height: 100%;
  135. }
  136. .center_info {
  137. display: flex;
  138. flex-direction: column;
  139. margin-top: 20rpx;
  140. margin-left: 20rpx;
  141. }
  142. .center_name {
  143. font-size: 14rpx;
  144. }
  145. .center_phone {
  146. color: #BEBEBE;
  147. }
  148. // .center_down {
  149. // display: flex;
  150. // flex-direction: row;
  151. // width: 80%;
  152. // height: 35px;
  153. // margin: 0 auto;
  154. // margin-top: 20rpx;
  155. // }
  156. .center_rank {
  157. width: 50%;
  158. height: 35rpx;
  159. display: flex;
  160. flex-direction: row;
  161. }
  162. .rank_text {
  163. height: 35rpx;
  164. line-height: 35rpx;
  165. margin-left: 10rpx;
  166. color: #AAAAAA;
  167. }
  168. .center_vip image {
  169. width: 20rpx;
  170. height: 20rpx;
  171. margin-top: 10rpx;
  172. }
  173. .vip_icon {
  174. width: 25rpx;
  175. height: 25rpx;
  176. margin-top: 5rpx;
  177. }
  178. .vip_text {
  179. font-size: 14rpx;
  180. margin-top: -33rpx;
  181. margin-left: 40rpx;
  182. color: #AAAAAA;
  183. }
  184. .center_rank image {
  185. width: 35rpx;
  186. height: 35rpx;
  187. }
  188. .center_score {
  189. width: 50%;
  190. height: 35rpx;
  191. display: flex;
  192. flex-direction: row;
  193. }
  194. .center_score image {
  195. width: 35rpx;
  196. height: 35rpx;
  197. }
  198. .gif-wave {
  199. position: absolute;
  200. width: 100%;
  201. bottom: 0;
  202. left: 0;
  203. z-index: 99;
  204. mix-blend-mode: screen;
  205. height: 100rpx;
  206. }
  207. .wrapper {
  208. position: absolute;
  209. top: 0;
  210. bottom: 0;
  211. width: 100%;
  212. background-color: #F4F4F4;
  213. }
  214. .profile {
  215. height: 375rpx;
  216. background-color: #ea4451;
  217. display: flex;
  218. justify-content: center;
  219. align-items: center;
  220. .meta {
  221. .avatar {
  222. display: block;
  223. width: 140rpx;
  224. height: 140rpx;
  225. border-radius: 50%;
  226. border: 2rpx solid #fff;
  227. overflow: hidden;
  228. }
  229. .nickname {
  230. display: block;
  231. text-align: center;
  232. margin-top: 20rpx;
  233. font-size: 30rpx;
  234. color: #fff;
  235. }
  236. }
  237. }
  238. .count {
  239. display: flex;
  240. margin: 0 20rpx;
  241. height: 120rpx;
  242. text-align: center;
  243. border-radius: 4rpx;
  244. background-color: #fff;
  245. position: relative;
  246. top: 10rpx;
  247. .cell {
  248. margin-top: 10rpx;
  249. flex: 1;
  250. padding-top: 20rpx;
  251. font-size: 27rpx;
  252. color: #333;
  253. }
  254. text {
  255. display: block;
  256. font-size: 24rpx;
  257. }
  258. }
  259. .orders {
  260. margin: 20rpx 20rpx 0 20rpx;
  261. padding: 40rpx 0;
  262. background-color: #fff;
  263. border-radius: 4rpx;
  264. .title {
  265. padding-left: 20rpx;
  266. font-size: 30rpx;
  267. color: #333;
  268. padding-bottom: 20rpx;
  269. border-bottom: 1rpx solid #eee;
  270. margin-top: -30rpx;
  271. }
  272. .sorts {
  273. padding-top: 30rpx;
  274. text-align: center;
  275. display: flex;
  276. }
  277. [class*="icon-"] {
  278. flex: 1;
  279. font-size: 24rpx;
  280. &::before {
  281. display: block;
  282. font-size: 48rpx;
  283. margin-bottom: 8rpx;
  284. color: #ea4451;
  285. }
  286. }
  287. }
  288. .address {
  289. line-height: 1;
  290. background-color: #fff;
  291. font-size: 30rpx;
  292. padding: 25rpx 0 25rpx 20rpx;
  293. margin: 10rpx 20rpx;
  294. color: #333;
  295. border-radius: 4rpx;
  296. }
  297. .extra {
  298. margin: 10rpx 20rpx;
  299. background-color: #fff;
  300. border-radius: 4rpx;
  301. .item {
  302. line-height: 1;
  303. padding: 25rpx 0 25rpx 20rpx;
  304. border-bottom: 1rpx solid #eee;
  305. font-size: 30rpx;
  306. color: #333;
  307. }
  308. button {
  309. text-align: left;
  310. background-color: #fff;
  311. &::after {
  312. border: none;
  313. border-radius: 0;
  314. }
  315. }
  316. }
  317. .icon-arrow {
  318. position: relative;
  319. &::before {
  320. position: absolute;
  321. top: 50%;
  322. right: 20rpx;
  323. transform: translateY(-50%);
  324. }
  325. }
  326. .loginButton {
  327. padding: 20rpx 60rpx;
  328. width: 30%;
  329. background-color: #ffffff; /* 设置背景颜色为蓝色 */
  330. color: #00aa00; /* 设置文本颜色为白色 */
  331. font-size: 24rpx; /* 设置字体大小为 16px */
  332. text-align: center;
  333. border-radius: 35rpx; /* 设置圆角 */
  334. cursor: pointer; /* 设置鼠标样式为指针 */
  335. }
  336. </style>

Flex布局

简单介绍下Flex布局。Flex布局很强大,与传统的布局方式相比,Flex布局的语法和理解起来更加简单,容易上手。Flex布局可以方便地实现多列等高布局。Flex布局支持各种对齐方式,包括水平和垂直对齐,并且可以通过设置order属性对子元素进行排序。

flex的6 个属性:

flex-direction:决定主轴的方向。

flex-wrap:如果一条轴线排不下,如何换行。

flex-flow:flex-direction 属性和 flex-wrap 属性的简写属性。

justify-content:定义项目在主轴上的对齐方式。

align-items:定义项目在交叉轴上如何对齐。

align-content:定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

flex-direction属性:

flex-direction属性决定主轴的方向(即项目的排列方向)。

.box {  flex-direction: row | row-reverse | column | column-reverse;}

在这里插入图片描述

写在最后

最后,附上完整项目工程代码,可直接使用HbuliderX工具打开并运行。下载地址:

https://download.csdn.net/download/qq8864/89377440

其他资源

uni-app官网

Link 超链接 | uview-plus 3.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架

【uniapp APP分享到微信】_uni-app_cv全粘工程师-华为云开发者联盟

https://zhuanlan.zhihu.com/p/377807139?utm_id=0

Uniapp|爬坑之真机点击无效 - 知乎

豆瓣接口文档 · 微信小程序 · 看云

flex弹性布局(详解)_flex布局-CSDN博客

https://feizhaojun.com/?p=3813

uni-app官网

豆瓣 Api V2(测试版) | doubanapi

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/798892
推荐阅读
相关标签
  

闽ICP备14008679号