当前位置: 代码网 > it编程>编程语言>Javascript > 微信小程序中实现自定义Navbar方法详解

微信小程序中实现自定义Navbar方法详解

2024年05月26日 Javascript 我要评论
前言自定义 navbar 应该是很常见的需求。要自定义一个 navbar 并不难,只需要了解其组成部分即可。从上面的图片可以看出,navbar 由 statusbar 和 titlebar 组成。了解

前言

自定义 navbar 应该是很常见的需求。要自定义一个 navbar 并不难,只需要了解其组成部分即可。

从上面的图片可以看出,navbarstatusbartitlebar 组成。了解了这些组成部分之后,只需要知道它们各自的高度,就可以很好地完成自定义。

statusbar高度

状态栏高度与设备(即操作系统)有关。在 uniapp 中,提供了一个名为 getsysteminfosync 的方法,可以同步获取与设备相关的内容。

const systeminfo = uni.getsysteminfosync();
const statusbarheight = systeminfo.statusbarheight;

titlebar高度

通常,设备按照系统被划分为 androidios,这种分类方式在行业内是一种通用的标准,虽然个别厂商可能会有一些细微的差异,但这里我们只关注通用标准。

const titlebarheight = systeminfo.platform == 'android' ? 48 : 44;

知道 statusbartitlebar 高度之后,接下来定义就很简单了。

编写navbar组件

<template>
  <view class="navbar">
    <!--statusbar-->
    <view
      v-if="showstatusbar"
      class="status-bar"
      :style="{ height: `${statusbarheight}px` }"
    ></view>
    <view class="navbar-content" :style="{ height: `${titlebarheight}px` }">
      <view class="navbar__left" @click="onclickleft">
        <view class="navbar__left-icon">
          <slot name="left"></slot>
        </view>
      </view>
      <view class="navbar__title">
        <slot name="title">
          {{ title }}
        </slot>
      </view>
      <view class="navbar__right" @click="onclickright">
        <view class="navbar__right-icon">
          <slot name="right"></slot>
        </view>
      </view>
    </view>
  </view>
</template>
<script>
export default {
  name: 'navbarcomponent',
  props: {
    title: {
      type: string,
      default: '',
    },
    showstatusbar: {
      type: boolean,
      default: true,
    },
  },
  setup(props, { emit, expose }) {
    const systeminfo = uni.getsysteminfosync();
    const statusbarheight = systeminfo.statusbarheight;
    const titlebarheight = systeminfo.platform == 'android' ? 48 : 44;
    const navbarheight = statusbarheight + titlebarheight;
    const getnavbarheight = () => {
      return props.showstatusbar ? navbarheight : titlebarheight;
    };
    const onclickleft = () => {
      emit('clickleft');
    };
    const onclickright = () => {
      emit('clickright');
    };
    expose({
      getnavbarheight,
    });
    return {
      navbarheight,
      titlebarheight,
      statusbarheight,
      onclickleft,
      onclickright,
    };
  },
};
</script>
<style scoped lang="scss">
.navbar {
  padding: 0 20rpx;
  .navbar-content {
    display: flex;
    align-items: center;
  }
  .navbar__title {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100%;
    flex: 1;
    text-align: center;
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
  }
  .navbar__left {
    flex: 0 0 80rpx;
    display: flex;
    align-items: center;
    padding: 0 10rpx;
    height: 100%;
    font-size: 28rpx;
  }
  .navbar__right {
    flex: 0 0 80rpx;
    display: flex;
    align-items: center;
    padding: 0 10rpx;
    height: 100%;
  }
}
</style>

使用

<template>
  <b-navbar :title="title" @clickleft="onclickleft" @clickright="onclickright">
    <template #left>
      <uni-icons type="left"></uni-icons>
    </template>
  </b-navbar>
</template>
<script>
import { ref } from 'vue';
import bnavbar from '@/components/bnavbar/index.vue';
export default {
  components: {
    bnavbar,
  },
  setup() {
    const title = ref('自定义navbar');
    const onclickleft = () => {
      uni.navigateback();
    };
    const onclickright = () => {
      console.log('clickright');
    };
    return {
      title,
      onclickleft,
      onclickright,
    };
  },
};
</script>
<style scoped lang="scss">
.navbar {
  display: flex;
  align-items: center;
  padding: 0 20rpx;
  .navbar__title {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100%;
    flex: 1;
    text-align: center;
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
  }
  .navbar__left {
    flex: 0 0 80rpx;
    display: flex;
    align-items: center;
    padding: 0 10rpx;
    height: 100%;
    font-size: 28rpx;
  }
  .navbar__right {
    flex: 0 0 80rpx;
    display: flex;
    align-items: center;
    padding: 0 10rpx;
    height: 100%;
  }
}
</style>

最终效果

以上就是微信小程序中实现自定义navbar方法详解的详细内容,更多关于小程序自定义navbar的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com