首頁 > 軟體

手把手教你寫一個uniapp通用頁面元件

2022-12-17 14:00:24

前言

做行動端專案時為了相容各種手機型號的介面,最好有一個統一的頁面元件對樣式做統一處理,例如:判斷是否顯示狀態列,是否顯示頭部導航,是否空出底部區域等等,本篇會帶大家從零到一開發一個 uniapp 的通用頁面元件

需求

本次開發的頁面,元件,需要完成以下功能

  • 可設定控制是否顯示原生導航,顯示狀態列,並且也可以控制狀態列顏色
  • 可設定控制是否留出底部固定區域

開發

初始化頁面資料

  • 編寫頁面元件類,獲取系統設定,初始化樣式資料
class Page {
  constructor() {
    this.system = uni.getSystemInfoSync()
​
    this.init()
  }
  
  init = () => {
    console.log(this.system);
  }
}
​
export default Page
  • 頁面元件基本結構
<template>
  <view class="sf-page" :class="theme">
    <!-- 頁面頭部 -->
    <template v-if="customHeader">
      <view class="sf-page-header">
        <!-- 頭部核心 -->
        <slot name="header"></slot>
      </view>
    </template>
    <!-- 頁面主體 -->
    <view class="sf-page-body">
      <slot name="body"></slot>
    </view>
    <!-- 頁面底部 -->
    <template v-if="customFooter">
      <view class="sf-page-footer">
        <slot name="footer"></slot>
      </view>
    </template>
  </view>
</template>
​
<script setup>
  import {
    computed, toRefs
  } from "vue"
  import Page from './class/page.js'
​
  const props = defineProps({
    customHeader: {
      type: Boolean,
      default: false
    },
    customFooter: {
      type: Boolean,
      default: false
    },
  })
​
  const page = new Page()
​
  const theme = computed(() => {
    return uni.$theme.get()
  })
</script>
​
<style>
  .sf-page {
    min-height: 100vh;
    width: 100%;
  }
  .sf-page-header {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    background-color: #ffffff;
    z-index: 99;
  }
  .sf-page-body {
​
  }
  .sf-page-footer {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: #ffffff;
    z-index: 99;
  }
</style>

實現狀態列與底部設定

  • 通過系統api,獲取系統狀態列高度
import { ref } from 'vue'
​
class Page {
  constructor() {
    this.system = uni.getSystemInfoSync()
    this.statusBarHeight = 0
    this.headerHeight = 45
    this.footerHeight = 45
    
    this.init()
  }
  
  init = () => {
    this.statusBarHeight = this.system.statusBarHeight
  }
}
​
export default Page
  • 頁面元件設定
<template>
  <view class="sf-page" :class="theme">
    <!-- 頁面頭部 -->
    <template v-if="customHeader">
      <view class="sf-page-header">
        <!-- 沉浸式狀態列 -->
        <view :style="{ height: statusBarHeight + 'px', background: statusBarBG }"></view>
        <!-- 頭部核心 -->
        <view :style="{ height: headerHeight + 'px' }">
          <slot name="header"></slot>
        </view>
      </view>
      <!-- 佔位 -->
      <view :style="{ height: statusBarHeight + headerHeight + 'px' }"></view>
    </template>
    <!-- 頁面主體 -->
    <view class="sf-page-body">
      <slot name="body"></slot>
    </view>
    <!-- 頁面底部 -->
    <template v-if="customFooter">
      <view class="sf-page-footer">
        <slot name="footer"></slot>
      </view>
    </template>
  </view>
</template>
​
<script setup>
  import {
    computed, toRefs
  } from "vue"
  import Page from './class/page.js'
​
  const props = defineProps({
    customHeader: {
      type: Boolean,
      default: false
    },
    customFooter: {
      type: Boolean,
      default: false
    },
    statusBarBG: {
      type: String,
      default: 'none'
    }
  })
​
  const page = new Page()
  const { headerHeight, statusBarHeight, footerHeight } = toRefs(page)
​
  const theme = computed(() => {
    return uni.$theme.get()
  })
  
</script>

頁面元件範例化Page 物件,這裡注意解構高度屬性時,需要使用toRefs 實現響應式, 這樣,即可通過 customHeader,customFooter 控制相應區域是否顯示,並且根據設定的 height 來控制對應區域的高度, 也可通過 statusBarBG 控制狀態列的顏色

  <sf-page :customHeader="true" :customFooter="false" statusBarBG="#333333">
  </sf-page>

頁面使用

  <sf-page :customHeader="true" :customFooter="true" statusBarBG="#333333">
    <template v-slot:header>
      <view class="">
        // ... 導航
      </view>
    </template>
    <template v-slot:body>
      <view class="main">
        // ... 內容
      </view>
    </template>
    <template v-slot:footer>
      <view class="">
        // ... 底部操作
      </view>
    </template>
  </sf-page>

這樣,就可以根據設計稿的需要,動態的控制是否顯示頭部導航或底部操作區域啦

總結

到此這篇寫一個uniapp通用頁面元件的文章就介紹到這了,更多相關uniapp通用頁面元件內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com