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
英文地址,請注明出處:http://en.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;那在電商場…