uni-app 组件之自定义导航栏

前言

上一篇简单的介绍了一下什么是组件,即组件是一个单独且可复用的功能模块的封装。所以这篇文章主要在实际开发中自己动手封装一个简单的导航栏组件,当然在插件市场有很多,但是自己动手封装一个才能真正领会其中的意义。

一、自定义组件

1.创建components文件夹

在项目根目录下创建components文件夹用于保存自己自定义的组件

2.新建titlebar组件

<template><view class="nav-bar" :style="{ paddingTop: statusBarHeight + 'px' }"><!-- 左侧返回按钮(靠左) --><view class="nav-btn left-btn" @click="handleBack"><image class="back-image" src="/static/icon_left_back.png" mode="aspectFit" v-if="showBack"></image></view><!-- 动态标题(居中) --><view class="nav-title">{{ title }}</view><!-- 右侧刷新按钮(靠右) --><view class="nav-btn right-btn" @click="handleRefresh" v-if="showRefresh"><text>更新</text></view></view>
</template>
<script>export default {props: {title: {type: String,default: '默认标题'},showBack: {type: Boolean,default: true},showRefresh: { type: Boolean,default: false},},data() {return {statusBarHeight: 0}},mounted() {this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 0;},methods: {// 添加 handleBack 方法handleBack() {this.$emit('back'); // 触发父组件的 @back 事件},// 添加 handleRefresh 方法handleRefresh() {this.$emit('refresh'); // 触发父组件的 @refresh 事件}}}
</script><style scoped>.nav-bar {width: 100%;height: 88rpx;display: flex;align-items: center;justify-content: space-between;/* 关键:左右按钮靠边 */position: relative;box-sizing: content-box;background-color: #fff;}/* 左右按钮样式 */.nav-btn {height: 100%;display: flex;align-items: center;padding: 0 24rpx;z-index: 10;flex-shrink: 0;/* 防止按钮被压缩 */}/* 左侧按钮靠左 */.left-btn {justify-content: flex-start;min-width: 80rpx;/* 确保点击区域足够 */}/* 右侧按钮靠右 */.right-btn {justify-content: flex-end;min-width: 80rpx;color: #4292E4;}/* 标题居中(通过 flex: 1 填充中间空间) */.nav-title {flex: 1;text-align: center;font-size: 32rpx;color: #333;font-weight: 500;/* 防止标题文字被按钮遮挡 */padding: 0 100rpx;/* 根据按钮宽度调整 */box-sizing: border-box;}/* 返回图标样式 */.back-image {width: 40rpx;height: 40rpx;}
</style>

  1. 外层容器 (nav-bar)

    • 设置了动态的 padding-top,值为 statusBarHeight,用于适配不同设备的状态栏高度
    • 使用 flex 布局,子元素水平排列
  2. 左侧返回按钮 (left-btn)

    • 显示返回图标(通过 v-if="showBack" 控制是否显示)
    • 点击触发 handleBack 方法
    • 图标使用 aspectFit 模式保持比例
  3. 中间标题 (nav-title)

    • 显示动态标题文本(通过 title prop 传入)
    • 使用 flex: 1 占据剩余空间实现居中效果
  4. 右侧刷新按钮 (right-btn)

    • 显示"更新"文字(通过 v-if="showRefresh" 控制是否显示)
    • 点击触发 handleRefresh 方法
  5. Props 定义

    • title: 导航栏标题,默认为"默认标题"
    • showBack: 是否显示返回按钮,默认为 true
    • showRefresh: 是否显示刷新按钮,默认为 false
  6. 数据

    • statusBarHeight: 存储设备状态栏高度,初始为0
  7. 生命周期及方法

    • mounted 钩子中获取系统信息,设置状态栏高度
    • handleBack: 点击返回按钮时触发,向父组件发射 back 事件
    • handleRefresh: 点击刷新按钮时触发,向父组件发射 refresh 事件

二、组件注册

  局部注册(页面级别组件)

<template><view class="content"><titlebar :title="pageTitle" :showBack="true" :showRefresh="true" @back="onBack" @refresh="onRefresh"></titlebar></view>
</template><script>import titlebar from '@/components/titlebar.vue';export default {components: {titlebar},data() {return {pageTitle: '自定义标题栏',}},onLoad() {},methods: {//返回onBack() {console.log('点击返回:');},//刷新onRefresh() {console.log('点击刷新:');}}}
</script><style lang="less">.content {display: flex;flex-direction: column;height: 100vh;background-color: #f5f5f5;}
</style>

全局注册(适用高频组件)

在main.js中注册,但要注意vue2跟vue3的注册方式,vue2,使用 Vue.component() 方法全局注册组件,需要在创建 Vue 实例之前注册 vue3 使用 app.component() 方法注册(通过 createSSRApp 创建的 app 实例),需要在 createApp 函数内部注册

// main.js
import titlebar from '@/components/titlebar.vue'
import App from './App'// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'// Vue2 全局组件注册
Vue.component('titlebar', titlebar)Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({...App
})
app.$mount()
// #endif// #ifdef VUE3
import {createSSRApp
} from 'vue'export function createApp() {const app = createSSRApp(App)// Vue3 全局组件注册app.component('titlebar', titlebar)return {app}
}
// #endif

三、组件通信

父 -- 子  

通过props传值:

父 index.vue中

data() {return {pageTitle: '自定义标题栏',}
},

子自定义组件titlebar.vue

props: {title: {type: String,default: '默认标题'},showBack: {type: Boolean,default: true},showRefresh: { type: Boolean,default: false},
},

子-- 父

$emit 触发

子自定义组件 titlebar.vue

methods: {// 添加 handleBack 方法handleBack() {this.$emit('back'); // 触发父组件的 @back 事件},// 添加 handleRefresh 方法handleRefresh() {this.$emit('refresh'); // 触发父组件的 @refresh 事件}}

父index.vue中

methods: {//返回onBack() {console.log('点击返回:');},//刷新onRefresh() {console.log('点击刷新:');}
}

四 总结

如果对你有所帮助的话,不妨 点赞收藏
如果你有什么疑问的话,不妨 评论私信
青山不改,绿水长流 ,有缘江湖再见 ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94704.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android vehicle

Android Vehicle HAL架构-腾讯云开发者社区-腾讯云 Android vehicle车辆属性新增demo-CSDN博客 【IVI】VehicleService启动_android ivi-CSDN博客

【人工智能】神经网络的优化器optimizer(三):RMSProp动态自适应学习率优化器

一、算法核心原理 RMSProp&#xff08;Root Mean Square Propagation&#xff09;是深度学习先驱Geoffrey Hinton在2012年提出的优化算法&#xff0c;它基于AdaGrad算法的改进&#xff0c;创新性地解决了传统梯度下降法中学习率固定不变的局限性。该算法的核心机制在于采用指数…

全面解析了Java微服务架构的设计模式

一、引言&#xff1a;微服务架构的背景与优势随着互联网应用的复杂度不断提升&#xff0c;传统的单体架构&#xff08;Monolithic Architecture&#xff09;在可维护性、可扩展性、部署灵活性等方面逐渐暴露出瓶颈。微服务架构&#xff08;Microservices Architecture&#xff…

本地组策略编辑器图形化工具

本地组策略图形化工具&#xff0c;添加用户权限分配功能。这将包括常见的用户权限策略设置&#xff1a; 目前版本在优化中&#xff0c;后续会添加更多功能。 # GroupPolicyGUI.ps1 # 需要以管理员权限运行Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName …

深度学习卷积神经网络项目实战——超市商品分类

卷积神经网络项目实战 1.项目简介 1.1项目名称 ​ 基于CNN实现超市商品的混合颗粒度分类&#xff08;500分类&#xff09; 1.2 项目简介 ​ 该项目旨在通过卷积神经网络&#xff08;CNN&#xff09;实现超市商品的混合颗粒度分类&#xff0c;主要针对商品的不同种类进行分…

网站如何被搜索引擎收录(Google、Bing、百度等)

1. 【Google 收录】注册 Google Search Console&#xff1a; https://search.google.com/search-console添加网站&#xff08;主域名、子域名都加&#xff09;验证所有权&#xff08;用 DNS、HTML 文件、Meta Tag 都可以&#xff09;提交 Sitemap&#xff08;/sitemap.xml&…

JDK 8 → JDK 17 升级说明书(面向 Spring Boot / Spring Cloud / Spring )

自从 JDK 8 发布以来&#xff0c;Java 语言在持续进化&#xff0c;带来了许多新的功能和性能改进。而 JDK 17 作为一个长期支持版本&#xff08;LTS&#xff09;&#xff0c;在许多方面超越了 JDK 8&#xff0c;不仅提升了语言本身的能力&#xff0c;还进一步提高了性能、可维护…

【ElasticSearch】使用docker compose,通过编写yml安装es8.15和kibana可视化界面操作,go连接es

使用 Docker 安装 Elasticsearch Docker 搭建 Elasticsearch Kibana 环境&#xff0c;并在过程中标注常见问题和解决方案。 1. 准备工作 在开始之前&#xff0c;请确认你本地已经安装了&#xff1a; 工具版本建议检查方式Docker≥ 20.xdocker -vDocker Compose≥ 2.xdocker …

《C 语言文件操作补充:字符串格式化与随机读写全解析》

目录 一. sprintf函数和sscanf函数 1.1 sprintf 函数&#xff1a;将格式化数据写入字符串 1.2 sscanf 函数&#xff1a;从字符串中格式化读取数据 二. 文件的随机读写 2.1 fseek 函数&#xff1a;移动文件读写指针 2.2 ftell 函数&#xff1a;获取当前指针位置 2.3 rew…

SOME/IP-SD报文中 Entry Format(条目格式)-理解笔记4

逐字段解析 AUTOSAR SOME/IP Service Discovery 中的 Entry 格式。我们将它拆解成几个部分&#xff0c;并用清晰的排版和比喻来确保每个字段都得到解释。&#x1f4dc; Entry 的完整结构&#xff1a;三层蛋糕 一条完整的 SD Entry 信息就像一块三层蛋糕&#xff0c;从上到下分别…

在 vue3 和 vue2 中,computed 计算属性和 methods 方法区别是什么

在 Vue 2 和 Vue 3 中&#xff0c;computed&#xff08;计算属性&#xff09;和 methods&#xff08;方法&#xff09;都是处理数据逻辑的方式&#xff0c;但它们在缓存机制、使用场景、执行时机等方面有显著区别&#xff0c;且这些区别在两个版本中保持一致。 1. 缓存机制&…

android 改机系列之-虚拟摄像头-替换相机预览画面

Android Native 层实现跨进程 YUV 视频帧共享&#xff1a;基于抽象 Unix Socket 的高效通信方案。基于AOSP13源码或者lineage20 或相近版本。非hook 或者lsp 等插件方案。 1.引言 在某些定制化 Android 应用场景中&#xff0c;我们可能需要动态替换系统相机的预览画面 —— 例…

SSM从入门到实战:2.5 SQL映射文件与动态SQL

&#x1f44b; 大家好&#xff0c;我是 阿问学长&#xff01;专注于分享优质开源项目解析、毕业设计项目指导支持、幼小初高的教辅资料推荐等&#xff0c;欢迎关注交流&#xff01;&#x1f680; 12-SQL映射文件与动态SQL &#x1f4d6; 本文概述 本文是SSM框架系列MyBatis进…

vue+vite打包后的文件希望放在一个子目录下

比如我们常规操作是打包的项目文件直接放在域名下面。如果我们希望把项目放在子域名下面应该怎么处理呢&#xff1f;需要两个步骤vite.config.js里面指定base的路径假设我们希望放在子目录加做call那么我们可以这样base:/call/,注意不是build目录哈。return的最外层。如果本地和…

Java:Docx4j类库简介及使用

1.简介 Docx4j 是一个功能强大的 Java 类库&#xff0c;专门用于创建和操作 Microsoft Open XML 格式&#xff08;如 Word DOCX、PowerPoint PPTX 和 Excel XLSX&#xff09;的文件。它深受 Java 开发者喜爱&#xff0c;特别是在需要自动化处理 Office 文档的场景下。 下面是一…

【机械故障】旋转机械故障引起的振动信号调制效应概述

系列文章目录 提示&#xff1a;学习笔记 机械故障信号分析 共振峰 旋转机械故障引起的振动信号调制效应概述系列文章目录一、研究背景与意义二、故障引起的调制效应分类三、非平稳信号分析方法3.1 时频分析方法3.2 信号分解方法一、研究背景与意义 在工程实践中&#xff0c;可…

密码安全隐形基石:随机数、熵源与DRBG核心解析与技术关联

前言&#xff1a;密码安全的 “隐形基石” 在数字化浪潮席卷全球的今天&#xff0c;从金融交易的密钥生成到区块链的共识机制&#xff0c;从量子通信的加密协议到智能汽车的身份认证&#xff0c;随机数如同空气般渗透在信息系统的每一个安全节点。然而&#xff0c;看似简单的 …

Vue3 + Element Plus实现表格多行文本截断与智能Tooltip提示

在实际开发中&#xff0c;我们经常需要在表格中展示较长的文本内容&#xff0c;但又希望保持界面的整洁美观。本文将介绍如何在Vue3 和 Element Plus中实现表格多行文本截断&#xff0c;并智能控制Tooltip的显示——只有当文本被截断时才显示Tooltip&#xff0c;否则不显示。 需…

使用powerquery处理数据,取时间或者日期之前的

Table.AddColumn(#"已更改列类型 1", "自定义 (2)", each letcleanText Text.Replace([备注], "#(lf)", " "),hasTime Text.Contains(cleanText, "时间&#xff1a;"),hasDate Text.Contains(cleanText, "日期&…

Java面试全栈技术解析:从Spring Cloud到Kafka的实战演练

面试官&#xff1a;请简单介绍一下Spring Cloud的核心组件&#xff1f; 谢飞机&#xff1a;嗯...Spring Cloud主要是基于Spring Boot的&#xff0c;然后有Eureka做服务发现&#xff0c;Feign做声明式REST调用&#xff0c;还有Config做配置中心... 面试官&#xff1a;那在电商场…