vue3+ts+uniapp+unibest 微信小程序(第二篇)—— 图文详解自定义背景图页面布局、普通页面布局、分页表单页面布局

news2025/7/12 9:18:36

文章目录

    • 简介
    • 一、自定义背景图布局
        • 1.1 效果预览
        • 1.2 实现思路
        • 1.3 custom-page 组件全量代码
        • 1.4 页面使用
    • 二、普通页面布局
        • 2.1 效果预览
        • 2.2 实现思路
        • 2.3 公共样式部分
        • 2.4 页面使用
    • 三、分页表单页面布局
        • 3.1 效果预览
        • 3.2 实现思路
        • 3.3 页面代码


简介

开发工具:VsCode
技术栈:vue3 + Ts + uni-app + unibest + Wot Design Uni
简介:图文结合,十分钟带你搞定微信小程序常见页面布局


一、自定义背景图布局

1.1 效果预览

在这里插入图片描述

1.2 实现思路
  • 因为小程序原生顶部导航栏只有白色、黑色两种背景色,所以使用自定义导航栏
  • 提高代码复用率,采用组件封装得形式。代码见 ——》步骤 1.3 custom-page 组件全量代码
  • wot design uni 组件库的 wd-navbar 组件刚好符合需求
  • 关键:wd-navbar 组件有一个属性(placeholder:固定在顶部时,在标签位置生成一个等高的占位元素),解决了顶部高度计算的问题
  • 具体文档所在位置如下图

在这里插入图片描述


在这里插入图片描述

1.3 custom-page 组件全量代码
<template>
  <view class="h-full w-full bg-[#F5F5F5] custom-page-container">
    <!-- 自定义顶部背景图(可选) -->
    <image src="@/static/images/home/bg.png" class="custom-page-bg" />

    <!-- 页面内容 -->
    <view class="custom-page-main">
      <!-- 自定义顶部--导航栏 -->
      <wd-navbar
        :title="title"
        safeAreaInsetTop
        placeholder
        :left-arrow="showBack"
        @click-left="handleClickLeft"
        custom-class="wd-navbar-custom"
      ></wd-navbar>

      <!-- 页面主体--功能版块 -->
      <view class="custom-page-content">
        <!-- 页面主体内容--插槽 -->
        <view :class="showPagePadding ? 'page-content-p' : ''" class="custom-slot-content">
          <slot name="content"></slot>
        </view>

        <!-- 页面底部按钮--插槽 -->
        <slot name="footer"></slot>
      </view>
    </view>
  </view>
</template>

<script lang="ts" setup>
defineProps({
  // navbar标题
  title: {
    type: String,
    default: '',
    required: true,
  },
  // 是否显示返回按钮
  showBack: {
    type: Boolean,
    default: true,
  },
  // 页面主体是否需要展示左右边距
  showPagePadding: {
    type: Boolean,
    default: true,
  },
})
/**
 * 返回上一级
 */
function handleClickLeft() {
  uni.navigateBack()
}
</script>

<style lang="scss" scoped>
.custom-page-container {
  position: relative;
  .custom-page-bg {
    position: absolute;
    top: 0;
    left: 0;
    z-index: 1;
    width: 100%;
    height: 668rpx;
  }

  .custom-page-main {
    position: absolute;
    top: 0;
    left: 0;
    z-index: 2;
    display: flex;
    flex-direction: column;
    width: 100%;
    height: 100%;
    overflow: hidden;
    .custom-page-content {
      display: flex;
      flex: 1;
      flex-direction: column;
      justify-content: space-between;
      max-height: 100%;
      overflow: hidden;

      .custom-slot-content {
        flex: 1;
        overflow: hidden;
      }
    }
  }
}
</style>
1.4 页面使用

在这里插入图片描述


二、普通页面布局

2.1 效果预览

在这里插入图片描述

2.2 实现思路
  • 整个页面 flex 布局,中间部分 flex:1。
  • 抽离公共布局样式,不采用组件封装方式,减小心智负担
2.3 公共样式部分
// /src/style/public.scss
// 公共页面布局样式--简易版
.custom-page-simple {
  display: flex;
  flex-direction: column;
  width: 100%;
  height: 100vh;
  overflow: hidden;
  background-color: $open-bg-grey;

  .page-main {
    flex: 1;
    padding: 28rpx;
    margin: 28rpx;
    overflow: auto;
    background: $open-bg-primary;
    border-radius: $open-border-radius;
  }

  .page-footer {
    width: 100%;
    height: 130rpx;
    padding: 30rpx 28rpx;
    background-color: $open-text-color-inverse;
    box-shadow: 0rpx 0rpx 27.78rpx 0rpx rgba(9, 197, 133, 0.25);
  }
}
2.4 页面使用

在这里插入图片描述


三、分页表单页面布局

3.1 效果预览

在这里插入图片描述
在这里插入图片描述

3.2 实现思路
  • 使用 z-paging 组件
  • z-paging 官方文档:z-paging官方文档
  • 组件安装方式参考官方,没有比这个更清晰的了
3.3 页面代码
<route lang="json5" type="page">
{
  layout: 'default',
  style: {
    navigationBarTitleText: '公告列表',
  },
  custom: true,
}
</route>

<template>
  <z-paging
    ref="pagingRef"
    v-model="noticeList"
    :paging-style="{ backgroundColor: '#fff' }"
    :default-page-size="pageQuery.size"
    @query="queryList"
  >
    <!-- 顶部搜索栏 -->
    <template #top>
      <wd-search
        ref="searchRef"
        v-model="pageQuery.someText"
        placeholder="请输入搜索内容"
        placeholder-left
        hide-cancel
        :maxlength="50"
        @change="handleSearchChangeDebounce"
      />
    </template>
    <!-- 通告列表 -->
    <div class="notice-list">
      <div class="notice-item" v-for="(item, index) in noticeList" :key="index">
        <!-- 标题 -->
        <div class="notice-title">{{ item.title }}</div>
        <!-- 内容 -->
        <span v-if="!item.details || item.details.length < 58" class="notice-content">
          {{ item.details || '--' }}
        </span>
        <wd-collapse
          v-else
          v-model="item.showMoreContent"
          viewmore
          custom-class="notice-content"
          :line-num="2"
        >
          {{ item.details || '--' }}
        </wd-collapse>
        <!-- 发布时间 -->
        <div class="notice-publish-time">
          {{ '发布时间:' + parseTime(item.updateTime, '{y}-{m}-{d} {h}:{i}') }}
        </div>

        <!-- 图片、视频列表 -->
        <div class="notice-file flex items-center">
          <div
            class="notice-file-item"
            v-for="(file, fileIndex) in item.pictureUrlList"
            :key="fileIndex"
          >
            <wd-img
              :width="100"
              :height="75"
              :src="file"
              :enable-preview="true"
              mode="aspectFill"
            />
          </div>

          <div
            class="notice-file-item"
            v-for="(file, fileIndex) in item.videoUrlList"
            :key="fileIndex"
          >
            <video :src="file" :id="`video${fileIndex}`" controls></video>
          </div>
        </div>
      </div>
    </div>
  </z-paging>
</template>

<script lang="ts" setup>
import { debounce } from 'lodash-es'
import { useUserStore } from '@/store'
import { fetchNoticePageList } from '@/api/fitness-test/notice'
import { INoticePageQuery, INoticePageResponseListItem } from '@/api/fitness-test/notice/types'
import { parseTime } from '@/utils/business'

const userStore = useUserStore()

// 通知公列表--数据
const noticeList = ref<INoticePageResponseListItem[]>([])

/** ================================ 分页请求 start ================================== */
// z-paging 组件实例
const pagingRef = ref<ZPagingRef>()

// 分页查询参数
const pageQuery = reactive<Omit<INoticePageQuery, 'schoolId'>>({
  current: 1,
  size: 6,
  someText: '',
})

// 搜索框实例
const searchRef = ref()
// 数据总数
const total = ref(0)

// 学校id
const schoolId = computed(() => userStore.getUserInfo.schoolId)

/**
 * 分页查询
 * @param pageNo 当前页
 * @param pageSize 每页条数
 */
function queryList(pageNo: number, pageSize: number) {
  // console.log('queryList', pageNo, pageSize)
  fetchNoticePageList({
    current: pageNo,
    size: pageSize,
    schoolId: schoolId.value,
    someText: pageQuery.someText,
  })
    .then((res) => {
      const { count, data, size, current } = res.data
      // 赋值给total
      total.value = count
      // 赋值给pageQuery.size
      pageQuery.size = size
      // 赋值给pageQuery.current
      pageQuery.current = current
      const resultList = (data || []).map((item) => {
        return {
          ...item,
          showMoreContent: false,
          pictureUrlList: item.pictureUrlList || [],
          videoUrlList: item.videoUrlList || [],
        }
      })
      // 将请求的结果数组传递给z-paging
      // 参考文档:https://z-paging.zxlee.cn/api/methods/main.html#%E6%95%B0%E6%8D%AE%E5%88%B7%E6%96%B0-%E5%A4%84%E7%90%86%E6%96%B9%E6%B3%95
      pagingRef.value?.completeByTotal([...resultList], total.value)
    })
    .catch((err) => {
      console.log(err)
      pagingRef.value?.complete(false)
    })
}

// 为提升性能,避免高频触发接口,搜索框改变时触发用 防抖 函数
const handleSearchChangeDebounce = debounce(handleSearchChange, 500)

/**
 * 搜索框改变时触发
 * @param value 搜索框的值
 */
function handleSearchChange(ipt: { value: string }) {
  // console.log('handleSearchChange', ipt)
  // 重新请求
  pagingRef.value?.reload()
}
/** ================================ 分页请求 end ================================== */
</script>

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

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

相关文章

虚拟机缩放比例问题处理

上班打开虚拟机的样子。 最开始判断可能是vmtools 异常重启安装后发现没有效果 通过 xrandr 功能查询显示器信息获取显示器名 设置显示器 同时设置分辨率 也可以同时设置刷新率 注意下图中设置的关键字

【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

DeepSeek-R1-Zero:基于基础模型的强化学习

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列四DeepSeek大模型技术系列四》DeepSeek-…

(dp 买入股票的最佳时机)leetcode 121

题目 题解的dp数组 0列是负数&#xff0c;这里我改成正数不再相加而是相减获取利润 class Solution { public:int maxProfit(vector<int>& prices) {int nprices.size();vector<vector<int>>dp(n,vector<int>(2));dp[0][0]prices[0];dp[0][1]0;//0…

由 Mybatis 源码畅谈软件设计(三):简单查询 SQL 执行流程

大家好&#xff0c;我是 方圆。SQL 查询是 Mybatis 中的核心流程&#xff0c;本节我们来介绍简单 SQL 的执行流程&#xff0c;过程会比较长&#xff0c;期间会认识很多重要的组件&#xff0c;比如 SqlSession、四大处理器&#xff08;Executor、StatementHandler、ParameterHan…

项目实践 之 pdf简历的解析和填充(若依+vue3)

文章目录 环境背景最终效果前端讲解左侧模块解析右侧上传模块解析前端步骤 后端讲解代码前端 环境背景 若依前后端分离框架 vue最后边附有代码哦 最终效果 前端讲解 左侧模块解析 1、左侧表单使用el-form 注意&#xff1a; 1、prop出现的字段&#xff0c;需要保证是该类所…

lowagie(itext)老版本手绘PDF,包含页码、水印、图片、复选框、复杂行列合并、行高设置等。

入口类&#xff1a;exportPdf package xcsy.qms.webapi.service;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.nacos.common.utils.StringUtils; import com.ibm.icu.text.RuleBasedNumberFormat; import com.lowagie…

第002文-kali虚拟机安全与网络配置

1、kali系统介绍 kali是一个基于Linux kernel的操作系统&#xff0c;由BackTrack(简称BT)发展而来。BackTrack是2006年推出的一个用于渗透测试及黑客攻防的专用平台&#xff0c;基于Knoppix(linux的一个发行版)开发。BackTrack版本周期&#xff1a;2006年的起始版本BackTrack …

软件工程复试专业课-软件生命周期

文章目录 软件过程模型瀑布模型模型图特点优缺点改进后的瀑布模型 快速原型模型模型图优缺点 增量模型&#xff08;迭代-递增模型&#xff09;原型图与瀑布和快速原型的区别优缺点风险更大的增量模型 螺旋模型简介模型图优缺点 喷泉模型模型图优缺点 编码修补模型敏捷过程优缺点…

DILLEMA:扩散模型+大语言模型,多模态数据增强框架

引言&#xff1a;深度学习模型的鲁棒性测试需要全面且多样化的测试数据。现有的方法通常基于简单的数据增强技术或生成对抗网络&#xff0c;但这些方法在生成真实且多样化的测试数据集方面存在局限性。为了克服这些限制&#xff0c;DILLEMA框架应运而生&#xff0c;旨在通过结合…

C++程序员内功修炼——Linux C/C++编程技术汇总

在软件开发的宏大版图中&#xff0c;C 语言宛如一座巍峨的高山&#xff0c;吸引着无数开发者攀登探索。而 Linux 操作系统&#xff0c;以其开源、稳定、高效的特性&#xff0c;成为了众多开发者钟爱的开发平台。将 C 与 Linux 相结合&#xff0c;就如同为开发者配备了一把无坚不…

苍穹外卖-阿里云OSS文件上传

苍穹外卖-阿里云OSS文件上传 一、阿里云OSS简介**获取AccessKey**获取enpoint 二、代码实现1 引入依赖2 定义OSS相关配置2.1 application-dev.yml2.2 application.yml 3 读取OSS配置3.1 AliOssProperties 4 生成OSS工具类对象4.1 AliOssUtil4.2 OssConfiguration2.5 CommonCont…

DeepSeek 提示词:常见指令类型

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

springai系列(二)从0开始搭建和接入azure-openai实现智能问答

文章目录 前言1.从0开始搭建项目2.进入微软openai申请key3.配置application.yaml4.编写controller5.测试源码下载地址总结 前言 之前使用openai的官网的api需要科学上网&#xff0c;但是我们可以使用其他的代理间接实现使用chatgpt的相关模型&#xff0c;解决这个问题。比如:本…

Go在1.22版本修复for循环陷阱

记录 前段时间升级Go版本碰到一个大坑&#xff0c;先记录。 先上代码案例&#xff1a; func main() {testClosure() }func testClosure() {for i : 0; i < 5; i {defer func() {fmt.Println(i)}()} }在1.22之下&#xff08;不包括1.22&#xff09;版本&#xff1a; 输出的…

可视化约瑟夫生死环小游戏

这是一个基于Tkinter的图形界面应用程序&#xff0c;用于模拟约瑟夫环问题。约瑟夫环问题是一个经典的数学问题&#xff0c;描述的是N个人围成一圈&#xff0c;从第一个人开始报数&#xff0c;每数到第M个人就将其淘汰&#xff0c;然后从下一个人继续报数&#xff0c;直到剩下最…

【深入理解JWT】从认证授权到网关安全

最近的项目学习中&#xff0c;在进行登陆模块的用户信息验证这一部分又用到了JWT的一些概念和相关知识&#xff0c;特在此写了这篇文章、方便各位笔者理解JWT相关概念 目录 先来理解JWT是什么&#xff1f; 区分有状态认证和无状态认证 有状态认证 VS 无状态认证 JWT令牌的…

学习路之PHP --TP6异步执行功能 (无需安装任何框架)

学习路之PHP --异步执行功能 &#xff08;无需安装任何框架&#xff09; 简介一、工具类二、调用三、异步任务的操作四、效果&#xff1a; 简介 执行异步任务是一种很常见的需求&#xff0c;如批量发邮箱&#xff0c;短信等等执行耗时任务时&#xff0c;需要程序异步执行&…

九、数据治理架构流程

一、总体结构 《数据治理架构流程图》&#xff08;Data Governance Architecture Flowchart&#xff09; 水平结构&#xff1a;流程图采用水平组织&#xff0c;显示从数据源到数据应用的进程。 垂直结构&#xff1a;每个水平部分进一步划分为垂直列&#xff0c;代表数据治理的…

【数据结构】 最大最小堆实现优先队列 python

堆的定义 堆&#xff08;Heap&#xff09;是一种特殊的完全二叉树结构&#xff0c;通常分为最大堆和最小堆两种类型。 在最大堆中&#xff0c;父节点的值总是大于或等于其子节点的值&#xff1b; 而在最小堆中&#xff0c;父节点的值总是小于或等于其子节点的值。 堆常用于实…