当前位置:   article > 正文

uni-app微信小程序,APP都适用自定义顶部导航_uniapp 小程序导航栏自定义按钮

uniapp 小程序导航栏自定义按钮

1.需要注意以下三点

*使用自定义的导航样式,首先需要把原生的顶部的导航方式给隐藏掉("navigationStyle": "custom")

*手机顶部手机状态栏的高度

*微信小程序中胶囊的位置信息存储(使用store存储)

2.导航布局

*由于微信小程序中带有导航胶囊,所以需要根据胶囊去获取一定的参数信息

  • 在微信小程序中,我们只需要获取胶囊的位置参数即可,详细如下(App和小程序自定义顶部): 注: 微信小程序围绕胶囊布局即可

须知:获取胶囊信息的Api

uni.getSystemInfo() ----->使用这个是为了算rpx--->px的换算系数 (返回值可去uniapp官方文档里查看)

 小程序默认把可使用窗口宽度分为750rpx,首先需要计算出不同机型rpx和px之间的换算比率

使用方法

  1. uni.getSystemInfo({
  2. success: (res) => {
  3. const proportion = 750 / res.windowWidth(单位是px) // 换算比率
  4. }
  5. })

uni.getMenuButtonBoundingClientRect() ----->这个返回的才是胶囊信息

  1. // 使用方法
  2. const demo = uni.getMenuButtonBoundingClientRect()

参考:

 3.具体实现

        1.首先需要获取我们需要用到的数据信息,并将其存储

         在uni-app项目store文件夹下创建如下结构(没有的可自行创建,并在main.is中引用store,这里就不多说了)

        

phoneInfo.js

  1. const state = {
  2.  // 顶部导航参数
  3.  phoneInfo: {},
  4. }
  5. const mutations = {
  6. /* 胶囊参数信息 */
  7. SET_PHONE_INFO(state, val){
  8. state.phoneInfo= val
  9.        // 打印存储的信息
  10. console.log("胶囊位置信息", state.phoneInfo);
  11. }
  12. }
  13. const actions = {
  14.  getPhotoInfo({ commit }) {
  15.  /* 获取系统参数 */
  16.  uni.getSystemInfo({
  17. success: (res) => {
  18. const proportion = 750 / res.windowWidth // 比例
  19. let height
  20. let paddingTop
  21. let topNavHeight
  22. /* 微信小程序获取胶囊参数 */
  23. // #ifdef MP-WEIXIN
  24.   const demo = uni.getMenuButtonBoundingClientRect()
  25.   // 小程序胶囊的高度
  26.   height = demo.height + "px"
  27.   // 小程序胶囊距离顶部的高度
  28.   paddingTop = demo.top + "px"
  29.   // 导航栏总高度
  30.   topNavHeight= demo.height + demo.top
  31. // #endif
  32. // #ifdef APP-PLUS
  33. // 设备系统信息
  34. let systemInfomations = uni.getSystemInfoSync()
  35. console.log(systemInfomations);
  36. // 机型适配比例系数
  37. let scaleFactor = 750 / systemInfomations.windowWidth
  38. // 当前机型-屏幕高度
  39. let windowHeight = systemInfomations.windowHeight * scaleFactor //rpx
  40. // 当前机型-屏幕宽度
  41. let windowWidth = systemInfomations.windowWidth * scaleFactor //rpx
  42. // 状态栏高度
  43. let statusBarHeight = systemInfomations.statusBarHeight
  44. height= 40 + "px" // App导航栏高度可自定义(根据需求定)
  45. paddingTop = statusBarHeight + "px"// App状态栏高度
  46. // 导航栏总高度
  47. topNavHeight= 40 + statusBarHeight
  48. // #endif
  49. /* 写入到store */
  50. commit('SET_PHONE_INFO', {height, paddingTop, topNavHeight, proportion})
  51. }
  52. })
  53. }
  54. }
  55. export default {
  56.  // namespaced: true 的方式使其成为带命名空间的模块。保证在变量名一样的时候,添加一个父级名拼接。
  57.  namespaced: true,
  58.  state,
  59.  mutations,
  60.  actions
  61. }

getters.js

  1. const getters = {
  2.  phoneInfo: state => state.phoneInfo.phoneInfo
  3. }
  4. export default getters

index.js

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. import getters from './getters'
  4. /* 单元 */
  5. import phoneInfo from './modules/phoneInfo.js'
  6. Vue.use(Vuex)
  7. const store = new Vuex.Store({
  8. modules:{
  9. phoneInfo,
  10. },
  11. getters
  12. })
  13. export default store

2.调用store的方法

只需要在App.vue文件中的onLaunch周期里调用即可

App.vue

  1. <script>
  2. export default {
  3. // 当uni-app 初始化完成时触发(全局只触发一次)
  4. onLaunch: function() {
  5. // console.log('App Launch')
  6. // 获取系统参数
  7. this.$store.dispatch('phoneInfo/getPhotoInfo')
  8. },
  9. onShow: function() {
  10. // console.log('App Show')
  11. },
  12. onHide: function() {
  13. // console.log('App Hide')
  14. }
  15. }
  16. </script>

获取之后打印我们存储的信息phoneInfo(这样页面在使用的时候直接取store的数据就行了)

2.使用

1.创建导航组件

components文件夹下创建top-nav组件

top-nav.vue

  1. <template>
  2. <view class="top-content" :style="[{background},{paddingTop}]">
  3. <view class="demo" :style="[{height}]">
  4. <!-- 左侧按钮 " 此处图标使用的是 uni-ui图标 -->
  5. <view class="item">
  6. <uni-icons v-if="back" :type="iconType" :size="iconSize" :color="color" @click="onBack"></uni-icons>
  7. </view>
  8. <!-- 中间标题文字 -->
  9. <view class="m-item" :style="[{fontSize},{color}]">
  10. <text>{{title}}</text>
  11. </view>
  12. <!-- 右 占位布局 -->
  13. <view class="item"></view>
  14. </view>
  15. </view>
  16. </template>
  17. <script>
  18. export default {
  19.   name:"top-nav",
  20.   props:{
  21.   title: { // 标题文字(默认为空)
  22.   type: String,
  23.   default: ''
  24.   },
  25.   fontSize: { // 标题字号(默认为空)
  26.   type: String,
  27.   default: '32rpx'
  28.   },
  29.   color:{ // 标题和左侧按钮颜色(默认白色)
  30.   type:String,
  31.   default:'#fff'
  32.   },
  33.   iconSize: { // 左侧图标尺寸
  34.   type: String,
  35.   default: '24'
  36.   },
  37.   iconType: { // 左侧图标类型
  38.   type: String,
  39.   default: 'back'
  40.   },
  41.       //建议使用background 因为使用backgroundColor,会导致不识别渐变颜色
  42.   background:{ // 背景颜色(不传值默认透明)
  43.   type:String,
  44.   default:'transparent'
  45.   },
  46.   back:{ // 是否显示返回按钮(不传值默认不显示)
  47.   type: Boolean,
  48.   default: false
  49.   }
  50.   },
  51. data() {
  52. return {
  53. // height: 0,
  54. // paddingTop: 0,
  55. }
  56. },
  57. computed: {
  58. /* 微信小程序胶囊高度,即顶部导航高度 */
  59. height() {
  60. return this.$store.getters.phoneInfo.height
  61. },
  62. /* 微信小程序胶囊距离顶部边距,即顶部导航上方的区域 */
  63. paddingTop(){
  64. return this.$store.getters.phoneInfo.paddingTop
  65. }
  66. },
  67. created() {
  68. },
  69. methods: {
  70. /**
  71. * 左侧按钮触发,目前默认返回上一页
  72. */
  73. onBack() {
  74. uni.navigateBack();
  75. }
  76. }
  77. }
  78. </script>
  79. <style lang="scss" scoped>
  80. .top-content {
  81.  position: fixed;
  82.  top: 0%;
  83.  width: 100%;
  84.  z-index: 99;
  85.  padding-bottom: 10rpx;
  86. .demo {
  87.  margin: 0 20rpx;
  88.  display: flex;
  89.  align-items: center;
  90.  justify-content: center;
  91.  box-sizing: border-box;
  92.       .item{
  93. width: 20%;
  94. display: flex;
  95. align-items: center;
  96. }
  97. .m-item{
  98. width: 60%;
  99. text-align: center;
  100. font-weight: 500;
  101. color: #FFFFFF;
  102. }
  103. }
  104. }
  105. </style>

页面使用

例: index.vue(首页)

  1. <template>
  2. <view>
  3. <!-- 自定义顶部 -->
  4. <top-nav back color="#fff6fa" title="我的"></top-nav>
  5. <view :style="{paddingTop}">
  6. <view class="box">
  7. 我是内容区
  8. </view>
  9. </view>
  10. </view>
  11. </template>
  12. <script>
  13. export default {
  14. data() {
  15. return {
  16. }
  17. },
  18. computed: {
  19. paddingTop(){
  20. return this.$store.getters.phoneInfo.topNavHeight * this.$store.getters.phoneInfo.proportion + 'rpx'
  21. }
  22. },
  23. mounted() {
  24. },
  25. methods: {
  26. }
  27. }
  28. </script>
  29. <style scoped lang="scss">
  30. .box{
  31. width: 100%;
  32. height: 200rpx;
  33. display: flex;
  34. justify-content: center;
  35. align-items: center;
  36. background-color: #118a84;
  37. }
  38. </style>

效果:

基本实现就这些了, 希望可以帮助到你.
不喜勿喷 ! 记得点赞哦! 我是坐井观天阔的小青蛙

转载请说明出处! 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号