第一个uni-app程序小结

news2024/11/16 23:37:48

工院喵开发小结

这是一篇关于uniapp新手写微信小程序的收获和踩坑总结。

目录

  • 工院喵开发小结
    • 一、架构
    • 二、收获
      • 1. 一些扩展组件的使用
        • a. uni-ui
        • b. uni-list
        • c. 栅格系统
        • d. uni.scss辅助样式
        • e. uni-easyinput 增强输入框
        • f. uni-fab悬浮按钮
        • g. swiper
      • 2. api管理
      • 3. 页面跳转传参
      • 4. 顶部标题动态设置
      • 5. 垂直居中
      • 6. 分割线
      • 7. 组件自动注册
      • 8. 自定义组件
      • 9. 正则判断是否是数字
    • 三、踩坑以及注意事项
      • 1. ref无效
      • 2. 动态style问题
      • 3. fab悬浮按钮受行高影响
      • 4. uni-list注意 样式无法调整

一、架构

第一个uniapp程序,非常简单的结构

在这里插入图片描述

二、收获

1. 一些扩展组件的使用

注意点:

a. uni-ui

若要使用uni-ui组件库,可以在创建项目时就选择创建uni-ui项目(Hbuilder X)

在这里插入图片描述

b. uni-list

若想要快速实现一个列表展示功能,那么使用uni-list组件将会非常快:

文档:https://ext.dcloud.net.cn/plugin?id=24

可以使用插槽来自定义某一部分的内容(如下),若只是需要简单使用,那么只需要填上某些属性就可以了(查看官方文档)。

<uni-list id="cats_list" border="false" v-for="cat in cats" :key="cat.id">
	<uni-list-item clickable="true" @click="goCatDetails(cat)">
		<template v-slot:header>
			<view></view>
		</template>
		<template v-slot:body>
			<view></view>
		</template>
        <template v-slot:footer>
			<view></view>
		</template>
	</uni-list-item>
</uni-list>
名称说明
header左/上内容插槽,可完全自定义默认显示
body中间内容插槽,可完全自定义中间内容
footer右/下内容插槽,可完全自定义右侧内容

我实际使用的感受是,有点鸡肋,因为样式不能自定义(如背景颜色,高度等)。

所以我最后使用的是scroll-view + 自定义组件的方式。(具体查看后文 自定义组件)

c. 栅格系统

流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局:

使用<uni-row></uni-row> <uni-col></uni-col>快速布局

官方:https://uniapp.dcloud.net.cn/component/uniui/uni-row.html

<uni-row class="cat_detail">
	<uni-col :span="12">
		<view class="teable_header uni-secondary-color">状况</view>
		<view class="table_body uni-main-color">{{ catStatus }}</view>
	</uni-col>
	<uni-col :span="12">
		<view class="teable_header uni-secondary-color">年龄</view>
		<view class="table_body uni-main-color"> {{ cat.age == null ? "未知" : cat.age }} </view>
	</uni-col>
</uni-row>
spanNumber-24栅格占据的列数
offsetNumber--栅格左侧间隔格数
pushNumber--栅格向右偏移格数
pullNumber--栅格向左偏移格数
xsNumber/object--屏幕宽度<768px时,要显示的栅格规则,如::xs="8":xs="{span: 8, pull: 4}"
smNumber/object--屏幕宽度≥768px时,要显示的栅格规则
mdNumber/object--屏幕宽度≥992px时,要显示的栅格规则
lgNumber/object--屏幕宽度≥1200px时,要显示的栅格规则
xlNumber/object--屏幕宽度≥1920px时,要显示的栅格规则

d. uni.scss辅助样式

在uni.scss中加入:

/* 需要放到文件最上面 */
@import '@/uni_modules/uni-scss/variables.scss';

/*
 以下变量是默认值,如不需要修改可以不用给下面的变量重新赋值
 */
// 主色
$uni-primary: #2979ff;
$uni-primary-disable:mix(#fff,$uni-primary,50%);
$uni-primary-light: mix(#fff,$uni-primary,80%);

// 辅助色
// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
$uni-success: #18bc37;
$uni-success-disable:mix(#fff,$uni-success,50%);
$uni-success-light: mix(#fff,$uni-success,80%);

$uni-warning: #f3a73f;
$uni-warning-disable:mix(#fff,$uni-warning,50%);
$uni-warning-light: mix(#fff,$uni-warning,80%);

$uni-error: #e43d33;
$uni-error-disable:mix(#fff,$uni-error,50%);
$uni-error-light: mix(#fff,$uni-error,80%);

$uni-info: #8f939c;
$uni-info-disable:mix(#fff,$uni-info,50%);
$uni-info-light: mix(#fff,$uni-info,80%);

// 中性色
// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。
$uni-main-color: #3a3a3a; 			// 主要文字
$uni-base-color: #6a6a6a;			// 常规文字
$uni-secondary-color: #909399;	// 次要文字
$uni-extra-color: #c7c7c7;			// 辅助说明

// 边框颜色
$uni-border-1: #F0F0F0;
$uni-border-2: #EDEDED;
$uni-border-3: #DCDCDC;
$uni-border-4: #B9B9B9;

// 常规色
$uni-black: #000000;
$uni-white: #ffffff;
$uni-transparent: rgba($color: #000000, $alpha: 0);

// 背景色
$uni-bg-color: #f7f7f7;

/* 水平间距 */
$uni-spacing-sm: 8px;
$uni-spacing-base: 15px;
$uni-spacing-lg: 30px;

// 阴影
$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5);
$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2);
$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5);

// 蒙版
$uni-mask: rgba($color: #000000, $alpha: 0.4);

然后在App.vue的style中注册:

<style lang="scss">
	@import '@/uni_modules/uni-scss/index.scss'</style>

使用的时候,添加类名就可以了,对应color样式:

<view class="uni-primary">主色</view>
<view class="uni-success">成功色</view>
<view class="uni-warning">警告色</view>
<view class="uni-error">错误色</view>

背景色可以在上面变量名的基础上加是 -bg,对元素快速应用background-color样式

<view class="uni-primary-bg">主色</view>
<view class="uni-success-bg">成功色</view>
<view class="uni-warning-bg">警告色</view>
<view class="uni-error-bg">错误色</view>

还有一些用法:https://uniapp.dcloud.net.cn/component/uniui/uni-sass.html

e. uni-easyinput 增强输入框

<uni-easyinput id="search_cat" class="uni-mt-5" trim="all" v-model="catName" placeholder="输入猫咪名称……"
	@iconClick="search" suffixIcon="search">
</uni-easyinput>

使用trim属性可以忽略空格,使用prefixIcon / suffixIcon 属性 ,可以自定义输入框左右侧图标。

f. uni-fab悬浮按钮

详细配置和组件体验:https://uniapp.dcloud.net.cn/component/uniui/uni-fab.html

<template>
	<view>
		<uni-fab
			:pattern="pattern"
			:content="content"
			:horizontal="horizontal"
			:vertical="vertical"
			:direction="direction"
			@trigger="trigger"
		></uni-fab>
	</view>
</template>
属性名类型默认值说明
patternObject-可选样式配置项
horizontalString‘left’水平对齐方式。left:左对齐,right:右对齐
verticalString‘bottom’垂直对齐方式。bottom:下对齐,top:上对齐
directionString‘horizontal’展开菜单显示方式。horizontal:水平显示,vertical:垂直显示
popMenuBooleantrue是否使用弹出菜单
contentArray-展开菜单内容配置项

事件有两个:

参数类型说明
@triggerFunction展开菜单点击事件,返回点击信息
@fabClickFunction悬浮按钮点击事件
<script>
    export default {
    	data() {
            pattern: {
        		color: '#3c3e49',
        		backgroundColor: '#fff',
            	selectedColor: '#007AFF',
        		buttonColor: '#007AFF',
    		},
    		content: [{
        		iconPath: '/static/icon/cookie_active.jpg',
        		selectedIconPath: '/static/icon/cookie_active.jpg',
        		text: '投食',
        		active: false
    		}]
        },
        methods: {
            trigger(e) {
				console.log(e)
				switch (e.index) {
					case 0:
						this.loveCats()
						break;
					default:
						break;
				}
			}
        }
    }
</script>

g. swiper

swiper不是扩展组件,而是内置的基础组件

可以很简单的实现轮播图,可以配置的属性很多,可以查看官方文档配置:

https://uniapp.dcloud.net.cn/component/swiper.html

简单示例:

<swiper :indicator-dots="true" :autoplay="true" :interval="3000" :duration="1000" current="0">
	<swiper-item v-for="(img, index) in cat.images" :key="index">
		<image class="swiper-item" :src="picurl + img" mode="aspectFit"></image>
	</swiper-item>
</swiper>

2. api管理

可以配合拦截器使用(我感觉有点鸡肋),拦截器封装请求,我们使用promise手动封装返回结果。

a. 封装请求组件

const baseUrl = 'http://xxx:xxx'; //域名或选取所有接口不变的那一部分
export const request = (options = {}) => {
	//异步封装接口,使用Promise处理异步请求
	return new Promise((resolve, reject) => {
		// 发送请求
		uni.request({
			url: baseUrl + options.url || '', //接收请求的API 
			method: options.method || 'GET', //接收请求的方式,如果不传默认为GET
			data: options.data || {}, //接收请求的data,不传默认为空
			success(res) {
                // 根据自己的业务自定义
				let data = res.data
				if (data.code == 200)
					resolve(data.data)
				else
					reject(data.msg)
			},
			fail(e) {
				reject(e)
			}
		})
	})
}

b. 创建api目录管理项目需要的api,并提供index入口:

在这里插入图片描述

例如catAPi.js:

import { request } from "@/utils/request.js";
const url = '/catservicedemo/cat'

export default {
	getAllCats() {
		return request({
			url: url + "/all",
			method: "post",
		})
	}
}

提供index.js入口:

import catApi from "@/api/catApi"
import locationApi from "@/api/locationApi"

export default {
	catApi,
	locationApi
}

c. 在main.js中注册到Vue实例上,方便使用时调用:

import api from '@/api/index'
Vue.prototype.api = api

d. 使用

this.api.catApi.getAllCats().then(res => {
	console.log(res)
}).catch(e => {
	console.log(e)
})

3. 页面跳转传参

跳转:

uni.navigateTo({
	url: "/pages/catDetails/catDetails?cat=" + encodeURIComponent(JSON.stringify(cat)),
})

下一个页面接收:

onLoad(option) {
	this.cat = JSON.parse(decodeURIComponent(option.cat))
}

4. 顶部标题动态设置

使用uni自带api:

uni.setNavigationBarTitle({
	title: name,
})

5. 垂直居中

网上方法有很多,我是使用的这个方式:

.center {
	display: flex;
	justify-content: center;
	align-items: center;
}

6. 分割线

uni-app中没有一些html标签例如 hr 标签就没有。可以这样实现分割线:

新建一个css文件,我是在pages下新建了一个global.css,然后在App.vue的style中导入,这样这个css文件就成了全局的css。

然后在该css中写下:

.divider {
	background: #E0E3DA;
	width: 100%;
	height: 5rpx;
}

当我们需要分割线时,就可以这样写:

<view class="divider"></view>

7. 组件自动注册

uni-app的easycom组件规范,只要符合了这个规范,组件就可以不用注册,直接使用。

若不符合这个规范,就需要1. import导入组件 2. components里注册组件 3. template中使用组件

默认情况下,只要组件安装在项目的components目录下或uni_modules目录下,并符合components/组件名称/组件名称.vue目录结构。就可以不用引用、注册,直接在页面中使用。

也可以自定义easycom的路径,另见。

8. 自定义组件

由于uni-ui的uni-list无法满足我最简单的列表展示需求,所以我自定义了一个列表组件,内容非常简单:

<template>
	<view class="my-list-item" :style="{height: height,}" @click="$emit('goDetails')">
		<view class="catPhoto">
			<image :src="cat.profilePhoto" mode="aspectFit" style="height: 45px; width: 45px;border-radius: 100%;">
			</image>
		</view>
		<view class="catInfo">
			<view class="uni-main-color item_body cat_name"> {{ cat.name == null ? "未知" : cat.name }} </view>
			<view class="uni-secondary-color item_body cat_location">
				{{ cat.location.name == null ? "未知" : cat.location.name  }}
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		props: [
			'height',
			'cat'
		]
	}
</script>

<style scoped>
	.catPhoto, .catInfo{
		display: inline-block;
	}
	.catInfo {
		border-bottom: 1px solid #E0E3DA;
		width: 70%;
	}
	
	.my-list-item {
		display: flex;
		/* justify-content: center; */
		align-items: center;
		border-bottom: ;
		padding: 0 20px;
		padding-top: 5px;
	}
	
	.my-list-item:active{
		background-color: #e1e1e1;
	}
	
	.item_body {
		margin-left: 10px;
	}
	
	.cat_location {
		font-size: 14px;
	}
	
	.cat_name {
		font-size: 16px
	}
</style>

这里让我学会了使用$emit暴露事件,复习了props传递属性。

由于uni-app easycom的组件规范,所以不用注册,可以直接使用。

<scroll-view scroll-y="true" enable-back-to-top="true" id="list">				
	<view v-for="cat in cats" :key="cat.id">
		<list-item height="100%" :cat="cat" @goDetails="goCatDetails(cat)"/>
	</view>
</scroll-view>

9. 正则判断是否是数字

isNumber(num) {
    return /^[0-9]+.?[0-9]*$/.test(num)
}

三、踩坑以及注意事项

1. ref无效

<view></view>这些内置组件是ref获取不到的,这个“坑坑”是由于这些组件不是vue组件,且和用户的代码不在同一个环境中(不在逻辑层而在视图层),获取不到。

2. 动态style问题

<view :style="test"></view>{fontSize: test.fontSize, color: test.color}
test: {
    fontSize: '80px',
        color: 'red'
}

这样写,不会生效,要这样写才可以:

<view :style="{fontSize: test.fontSize, color: test.color}"></view>

未知原因

3. fab悬浮按钮受行高影响

悬浮按钮的图标受行高的影响,会歪,去掉.container里面的行高就可以了。

4. uni-list注意 样式无法调整

除了无法调整样式,其他都还好。

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

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

相关文章

iOS 语言基础初探 Xcode 工具

前言&#xff1a; 作为 iOS 开发的主要应用工具之一&#xff0c;Xcode 已经越来越被业内认可&#xff0c;本章节将针对此官方开发工具&#xff0c;为同学解读 Xcode 的基本情况&#xff0c;认识 Xcode 的工程体系&#xff0c;带领大家进入 iOS 开发第一步。 &#x1f3b6;文章目…

SAP入门技术分享四:模块化程序

模块化程序1.子程序概要2.子程序定义3.子程序参数&#xff08;1&#xff09;传递参数的方法&#xff08;2&#xff09;定义参数类型&#xff08;3&#xff09;参数与结构体&#xff08;4&#xff09;参数与内表4.调用子程序&#xff08;1&#xff09;调用程序内部子程序&#x…

vue npm link关联本地组件库

什么是 npm link 就是把你在本地开发好的文件做一个映射和链接&#xff0c;当你在 本地开发一个a项目&#xff0c;你的本地b项目想使用a项目下的组件 这时候就是需要进行npm link链接起来 a项目的运行效果 b项目的运行效果&#xff1a; 想要实现的效果&#xff1a;(在b项目上…

Oracle SQL Developer使用dbms_output.put_line显示输出

dbms输出 点击DBMS输出左侧的号&#xff0c;选择需要输出的数据库&#xff0c;点击确定 与步骤2选择相同数据库&#xff0c;右击数据库&#xff0c;选择打开SQL工作表(T) 在工作表中执行语句 declare --定义&#xff0c;相当于声明属性。t_a varchar2(20);--声明自定义属…

怎么写一篇计算机SCI论文初稿? - 易智编译EaseEditing

一、SCI论文的要求 SCI论文的核心是创新性。对于这个方面来说主要就是针对于论文的观点正确&#xff0c;文字通畅&#xff0c;逻辑严密&#xff0c;结构合理&#xff0c;结论有创新等等。 二、SCI论文格式规范 每一个SCI期刊都有自己特定的宗旨、栏目和专业定位&#xff0c;投…

TCP通信机制:三次握手、四次挥手、滑动窗口

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 TCP通信机制1. TCP三次握手2. TCP四次挥手3. TCP连接与数据传输过程4. TCP滑动窗口机制5. server服务端…

这套设备管理方案助你效率10倍提升

车间工厂等货物人员密集场所&#xff0c;对消防安全的要求很高。消防设备管理自然是生产制造型企业的核心之一。消防设施的有效管理&#xff0c;既要保证日常巡检工作的有效性&#xff0c;又要在设备出现故障后及时响应。在此基础上还要对整体管理情况进行数据分析&#xff0c;…

振弦采集模块的各种参数操作

振弦采集模块的各种参数操作 固件版本读取 点击指令区【 读取版本】 按钮&#xff0c;读取当前连接模块的固件版本信息&#xff0c;读取到的版本信息显示于按钮右侧。 VMTool 会根据读取到的版本不同对功能和界面做出调整&#xff0c;故此&#xff0c; 在使用 VMTool 时&#…

Workfine新手入门:给图片加水印

哈喽&#xff0c;我是办公助手小W&#xff0c;又到了跟大家分享办公小技巧的时候啦&#xff01; 最近Workfine5.0最新版本上线后&#xff0c;一直有人问到底有啥新功能啊&#xff1f;与往期版本有何不同呢&#xff1f;小W亲自去体验了一番&#xff0c;最大的一个亮点就是新增了…

90、【树与二叉树】leetcode ——104. 二叉树的最大深度:层次遍历+DFS+子问题分解(C++版本)

解题思路 原题链接&#xff1a;104. 二叉树的最大深度 解题思路 1、迭代法&#xff1a;层次遍历BFS /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), rig…

Blender 物理属性 (二)布料和碰撞

文章目录添加与去除布料查看布料效果布料的预设属性(模拟不同的布料效果)布料与其他物体碰撞布料的自交叉问题布料钉固制作一个窗帘添加与去除布料 1 添加&#xff1a;物体模式选中一个物体&#xff0c;属性栏/物理属性&#xff08;蓝色圆圈&#xff09;&#xff0c;选择布料 …

程序员转项目经理,需要拒绝的3大习惯。

程序员转项目经理并不容易&#xff0c;需要我们转变思路&#xff0c;并拒绝我们日常3大习惯。 1、拒绝单打独干&#xff0c;转而关注与干系人的沟通协调。 做为技术人员&#xff0c;在确定自我任务后&#xff0c;独自敲代码就好&#xff0c;具有较强的单干性质。而作为项目经理…

前端项目代码统一规范-从eslint、stylelint、husky、lint-staged、commitlint和配合vscode插件一一道来

目前在多人项目开发时发现很多代码不规范的地方&#xff0c;因为每个项目都是多人维护&#xff0c;再加上各种历史代码的不同风格&#xff0c;这些情况很容易就造成了代码规范落地难&#xff0c;项目中出现大量低质量代码&#xff0c;代码格式难统一。所以采用 eslinthuskystyl…

【Vue】移动端项目流程

移动端项目 O 项目技术栈说明 脚手架&#xff1a; Vite 3 还有 vue-cli - 底层 webpack 脚本&#xff1a;typescript路由&#xff1a;vue-router4状态管理器&#xff1a; vuex4 还有 pinia 组件库&#xff1a;vant3.6.3组件API&#xff1a;选项式API 一、Vite 脚手架的使用 …

PostgreSQL复习记录(一):Win10成功安装postgresql14.6的过程记录

到官网下载页面选择合适的版本进行下载&#xff0c;我这里选择Windows版本&#xff0c;跳转到Download PostgreSQL后选择PostgreSQL Version 14.1 Windows x86-64的版本。 1&#xff0c;启动安装程序&#xff1a; 如果只是练习使用&#xff0c;安装时这里可以取消勾选Stack Bu…

戴尔电脑开机屏幕花屏无法启动解决方法

戴尔电脑开机屏幕花屏无法启动解决方法。有用户使用的戴尔电脑开机的时候出现了一些问题&#xff0c;电脑屏幕变成了满屏的马赛克花屏&#xff0c;不能正常启动到桌面页面上了。那么这个问题要如何去做出解决&#xff0c;一起看看操作的方法吧。 准备工作&#xff1a; 1、U盘一…

初步认识 Babel

Babel 官网&#xff1a;https://www.babeljs.cn/docs/1.AST 抽象语法树AST 抽象语法树&#xff0c;是 Babel 的核心在 JavaScript 的世界中&#xff0c;你可以认为抽象语法树&#xff08;AST&#xff09;是最底层下面会通过拆解一个普通函数&#xff0c;解释下什么是 AST 抽象语…

node服务从http升级到https(阿里云免费ssl)

升级原因1.各大搜索引擎中&#xff0c;https的网页的权重比一般的http的网页权重要高。2.从用户体验的角度&#xff0c;一个老是被浏览器提醒该网页不可信的网页&#xff0c;总不会让用户感到安心所以将网站从http升级为https是很有必要的用户配置首先介绍一下这次升级的网站使…

拓扑排序 (算法思想+图解+模板+练习题)

拓扑排序 有向无环图一定是拓扑序列,有向有环图一定不是拓扑序列。 无向图没有拓扑序列。 首先我们先来解释一下什么是有向无环图&#xff1a; 有向就是我们两个结点之间的边是有方向的&#xff0c;无环的意思就是整个序列中没有几个结点通过边形成一个圆环。 下图就是一个…

数据分析:通俗易懂假设检验

导读 大多数关于假设检验的教程都是从先验分布假设开始&#xff0c;列出一些定义和公式&#xff0c;然后直接应用它们来解决问题。然而&#xff0c;在本教程[1]中&#xff0c;我们将从第一原则中学习。这将是一个示例驱动的教程&#xff0c;我们从一个基本示例开始&#xff0c;…