手把手教你写一个uniapp通用页面组件

目录
  • 前言
  • 需求
  • 开发
    • 初始化页面数据
    • 实现状态栏与底部配置
  • 页面使用
  • 总结

前言

做移动端项目时为了兼容各种手机型号的界面,最好有一个统一的页面组件对样式做统一处理,例如:判断是否显示状态栏,是否显示头部导航,是否空出底部区域等等,本篇会带大家从零到一开发一个 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通用页面组件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • uniapp实现h5、app与微信小程序三端pdf文件下载和预览功能

    以下代码兼容三端,app,h5,微信小程序,经过个人测试 手机端有两种方法,使用renderjs或者uniapp的api 两者的区别 使用renderjs的写法,会提示用户是否下载文件,下载完成后用户需要手动点击下载的文件,才会打开文件 使用uniapp的api则可以直接下载并直接预览,不需要用户操作 根据场景需求进行选择即可 <template> <div> <!-- #ifdef APP-PLUS --> <button @click="test.e

  • uniapp开发打包多端应用完整方法指南

    一.uni-app项目介绍 用uni-app开发多端项目,一套代码可同时打包出各端小程序.h5和app,uni-app支持通过 HBuilderX可视化界面 和 vue-cli命令行 两种方式创建项目,下面示例项目采用 HBuilderX可视化界面 的方式创建,cli项目可参考uni文档,大部分流程都是通用的. 项目结构: ├── components 公用组件 ├── libs 公共方法 ├── pages 页面 ├── static 本地静态资源,注意:静态资源只能存放于此 ├── stor

  • uniapp微信小程序打卡功能的详细实现流程

    目录 一.vue后台地图选地点 step1| 注册账号并申请Key step2| 设置 JSAPI 安全密钥的脚本标签 step3| 地图选点页面demo 二.uniapp微信小程序打卡 step1| 获取key step2| manifest.json中配置权限 step3| 获取定位地址与经纬度 三.核心流程描述 总结 一.vue后台地图选地点 step1| 注册账号并申请Key 请参考链接注册账号并申请Key 部分 step2| 设置 JSAPI 安全密钥的脚本标签 注意事项: 必须在vu

  • uniapp打包安卓App的两种方式(云打包、本地打包)方法详解

    在HBuilder上对APP提供了两种打包方式,云打包和本地打包,下面主要对这两种打包方式做个介绍 两者的区别:云打包相对简单,但是每天最多只能打包五次,而且在高峰期打包时间可能会很长,本地打包相对比较复杂,但是不限制次数,打包时间也短 一. uniapp云打包安卓App: 只需要设置相应参数即可.比较复杂的地方可能就是证书,如果你是测试包,Android的话直接选择共用证书即可,ios则需要申请相应证书,申请证书的具体方法官方也介绍的很清楚了,就不赘述了. 二. uniapp本地打包安卓App

  • uniapp语音识别(讯飞语音)转文字

    常见应用:游戏界面 文字语音.商城导航栏的语音输入搜索框.聊天界面的语音文字输入等. 引自官方 unicloud官方语音: 语音输入接口可使得网页开发人员能快速调用设备的麦克风进行语音输入,而不需要安装额外的浏览器插件.规范不定义底层语音识别引擎的技术架构,浏览器实现可基于语音识别服务器或本地内置语音识别模块. 配置SDK–识别讯飞语音(如果用不了讯飞语音,可换百度语音,自己去看接入文档) 进入项目根目录下的 manifest.json -> App模块配置->speech 勾选 讯飞语音识别

  • uniapp页面间传参的几种方法实例总结

    目录 前言 一.上级页面 → 下级页面(单向) uni.navigateTo:URL编程式传参 <navigator>标签传参 二.上级页面 ← 下级页面(单向) uni.$on(eventName,callback):监听事件 触发事件 三.上级页面 ↔ 下级页面(双向) 上级页面内代码 总结 前言 在Uniapp中的传参主要分为以下三种类型: 上级页面 → 下级页面(单向)上级页面 ← 下级页面(单向)上级页面 ↔ 下级页面(双向) 本文将围绕这三种传参展开,分享其使用方法以及我使用中所遇

  • uniapp使用高德地图的超详细步骤

    目录 1.项目前准备 2.页面创建引入 3.地图实现js 4.地图实现单点标记 5.地图实现终点与起点标记 6.最后 上代码~ 总结 1.项目前准备 1.1.首先你需要去申请一个属于自己的高德地图key,怎么申请暂不多说需要的去官网看 1.2.链接: 高德地图申请key直通车,点击前往. 有一个uniapp项目. 2.页面创建引入 新建一个uniapp的空白页 使用web-view 渲染html文件页 <web-view src="/hybrid/html/adminr.html"

  • 使用uniapp打包上架微信小程序完整教程

    首先打开manifest.json下的微信小程序配置 ,勾选所有 点击“发行” 点击发行 这时候就会跳转到微信小程序中,如果没出现以下错误可以跳过此步骤 在本地设置中勾选“不校验合法域名........” 输入版本号和备注后点击上传   在微信小程序官网中点击“版本管理”,下面有个刚刚的开发版本 点击提交审核 填写信息 直接提交会出现以下问题 点击我知道了,再次点击 “更新当前版本的用户隐私协议” 进入后填写以下信息 填写完成后返回再次提交 以上就是使用uniapp打包上架微信小程序完整教程的详

  • uniapp使用条件编译#ifdef(跨平台设备兼容)

    uni-app 已将常用的组件.JS API 封装到框架中,开发者按照 uni-app 规范开发即可保证多平台兼容,大部分业务均可直接满足. 但每个平台有自己的一些特性,因此会存在一些无法跨平台的情况. 大量写 if else,会造成代码执行性能低下和管理混乱. 编译到不同的工程后二次修改,会让后续升级变的很麻烦. 在 C 语言中,通过 #ifdef.#ifndef的方式,为 windows.mac等不同 os 编译不同的代码. uni-app 参考这个思路,为 uni-app 提供了条件编译手

  • 手把手教你写一个uniapp通用页面组件

    目录 前言 需求 开发 初始化页面数据 实现状态栏与底部配置 页面使用 总结 前言 做移动端项目时为了兼容各种手机型号的界面,最好有一个统一的页面组件对样式做统一处理,例如:判断是否显示状态栏,是否显示头部导航,是否空出底部区域等等,本篇会带大家从零到一开发一个 uniapp 的通用页面组件 需求 本次开发的页面,组件,需要完成以下功能 可配置控制是否显示原生导航,显示状态栏,并且也可以控制状态栏颜色 可配置控制是否留出底部固定区域 开发 初始化页面数据 编写页面组件类,获取系统配置,初始化样式

  • 手把手教你写一个微信小程序(推荐)

    需求 小程序语音识别,全景图片观看,登录授权,获取个人基本信息 一:基础框架 官方开发文档:https://developers.weixin.qq.com/miniprogram/dev/ (其实官方文档写的很清楚了) 1.跟着官方文档一步一步来,新建一个小程序项目就好 2.然后呢,毕竟默认的只是基本骨架,肌肉线条还是要自己填的 app.json 是当前小程序的全局配置 小程序的所有页面路径.界面表现.网络超时时间.底部 tab 需求一:底部tab,我们要像原生APP那样要有是三个常驻的按钮,

  • 手把手教你写一个vue全局注册的Toast的实现

    目录 前言: 我们先思考下面的问题: 首先: 然后: 后来: 再且: 前言: 前几天客户经理不让我用某饿了么之类的UI库做一个轻提示之类的组件,当时一想我是饿了么战士,怎么会写哪个东西,然后我就想着用个alert糊弄过去,但是不行,然后我就细琢磨,发现Vue有个非常不错的Vue.extend. 经过一番努力,我学会了,可能是以前学的时候马虎漏掉了.不过问题不大,还能肝. 我们先思考下面的问题: 在写vue项目的时候啊,我们有了初始化的根实例之后,页面之间都是通过router进行管理,组件也是通过

  • 手把手教你写一个spring IOC容器的方法

    本文分享自华为云社区<手把手教你写一个spring IOC容器>,原文作者:技术火炬手. spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制.今天就带大家手写一个spring IOC容器. 第0步(准备工作): (1)JDK1.8及java环境变量 (2)maven包及maven环境变量 (3)idea 第1步(创建项目,引入tomcat包) PS:由于该项目的作用

  • vuejs手把手教你写一个完整的购物车实例代码

    由于我们公司是主营业务是海淘,所以每个项目都是类似淘宝天猫之类的商城,那么购物车就是一个重点开发功能模块.介于之前我都是用jq来写购物车的,这次就用vuejs来写一个购物车.下面我就从全选,数量控制器,运费,商品金额计算等方法来演示一下一个能用在实际场景的购物车是怎么做出来的以及记录一下这次用vuejs踩过的坑. 1.一层数据结构-全选 下面这段代码和vuejs官网里面checkbox绑定很像.不明白的可以直接上vuejs官网看看. <!DOCTYPE html> <html lang=

  • 比较详细的手把手教你写批处理(willsort题注版)第1/5页

    另,建议Climbing兄取文不用拘泥于国内,此类技术文章,内外水平相差极大:与其修正国内只言片语,不如翻译国外优秀著述. -------------------------------------------------------- 标题:手把手教你写批处理-批处理的介绍 作者:佚名 编者:Climbing 题注:willsort 日期:2004-09-21 -------------------------------------------------------- 批处理的介绍 扩展名

  • 手把手教你写Maven的archetype项目脚手架

    目录 一.背景 二.手写普通单模块项目的archetype 三.手写maven多module的项目骨架archetype 1.多模块骨架项目的项目结构 2.模板工程定义描述文件 3.子模块pom.xml定义如下(以core模块为例): 四.总结 一.背景 maven是一个很好的代码构建工具,采用"约定优先于配置"的原则进行项目管理,相信很多的java开发者应该都了解maven并可能在工作当中都是通过maven来管理项目的,在创建的项目的时候,我们往往会使用maven内置的项目骨架也就是

  • 手把手教你搭建一个vue项目的完整步骤

    目录 一.环境准备 1.安装node.js 2.检查node.js版本 3.为了提高我们的效率,可以使用淘宝的镜像源 二.搭建vue环境 1.全局安装vue-cli 三.创建vue项目 1.用cmd命令创建项目 1.1创建文件 1.2选择配置信息 1.3选择版本 1.4路径模式选择 1.5语法代码格式检查 1.6第三方文件存在的方式 1.7是否保存本次配置信息(保存预设) 1.8创建成功 1.9运行 1.10启动 1.11停止服务 2.用vue资源管理器创建 2.1进入vue资源管理器界面(vu

  • Java超详细教你写一个斗地主洗牌发牌系统

    目录 一.斗地主 1.前言 2.介绍 3.图解 二.准备牌 1.代码示例 2.数据展示 三.洗发牌与排序 代码示例 四.看牌(打印到控制台) 1.代码示例 2.展示 六.总结 一.斗地主 1.前言 相信每位看过<赌神>的同学都知道,里面有一种神奇的类似于魔术的力量. 没错!我们今天要说的这个神奇的东西就是:特异功能(不是) 就是:斗地主的洗牌发牌系统!!! 2.介绍 扑克牌经典游戏"斗地主"相信很多人都会玩,这次就用Java语言来编写一个斗地主的洗牌发牌程序,要求按照斗地主

  • Java超详细教你写一个银行存款系统案例

    目录 一.银行存取款 1.前言 2.描述 3.分析 二.银行账户类(BankAccount) 1.方法 2.变量 3.代码示例 三.测试类(Test) 1.要求 2.代码示例 3.运行结果 四.总结 一.银行存取款 1.前言 毕竟谁不喜欢钱呢!(不是) 我看谁不喜欢在知识的海洋中遨游! 2.描述 银行存取款的流程是人们非常熟悉的事情,用户可以在银行对自己的资金账户进行存款.取款.查询余额等操作,极大的便利了人们对自己资金的管理. 编程要求:使用Java知识编写一个银行存取款的程序,实现存取款功能

随机推荐