uniapp uview2 使用笔记

2023-11-06

创建项目安装组件

npm install uview-ui

配置

引入uView主JS库

在项目src目录中的main.js中,引入并使用uView的JS库,注意这两行要放在import Vue之后。

// main.js
import uView from "uview-ui";
Vue.use(uView);

在引入uView的全局SCSS主题文件

在项目src目录的uni.scss中引入此文件。

/* uni.scss */
@import 'uview-ui/theme.scss';

引入uView基础样式

<style lang="scss">
	/*每个页面公共css */
	/* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
	/*每个页面公共css */
	@import "@/uni_modules/uview-ui/index.scss";
	@import "common/demo.scss";
		page {
			width: 100vw;
			// height: calc(100% - var(--status-bar-height));
			height: 100vh;
			display: flex;
			flex-direction: column;
			box-sizing: border-box;
			color: #333333;
			font-size: 28rpx;
			line-height: 40rpx;
			image {
				display: block;
			}
		}
		::v-deep .uni-toast .uni-toast__content{
			text-align: center!important;
		}
	
		view {
			box-sizing: border-box;
		}
	
		uni-page-body {
			width: 100vw;
			height: 100vh;
		}
	
	}	

配置easycom组件模式

此配置需要在项目src目录的pages.json中进行。

// pages.json
{
	"easycom": {
		"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
	},
	
	// 此为本身已有的内容
	"pages": [
		// ......
	]
}

Cli模式额外配置

如果您是vue-cli模式的项目,还需要在项目根目录的vue.config.js文件中进行如下配置

// vue.config.js,如没有此文件则手动创建
module.exports = {
    transpileDependencies: ['uview-ui']
}

项目目录配置

.
├── common					#演示需要的一些文件
│   ├── api.js
│   ├── config.js
│   ├── demo.scss
│   ├── mixin.js
│   └── props.js
├── components					#演示项目封装的组件
│   └── page-nav
│       └── page-nav.vue
├── pages					#页面
│   ├── componentsA				#分包A
│   │   ├── ...
│   │   ├── ...
│   ├── componentsB				#分包B
│   │   ├── ...
│   │   ├── ...
│   ├── componentsC				#分包C
│   │   ├── ...
│   │   ├── ...
│   └── example					#演示项目首页
│       ├── components.config.js		#演示页面数据
│       └── components.nvue			#主演示页面
├── static					#演示项目需要的一些文件
│   ├── app-plus
│   │   └── mp-html
│   ├── common
│   │   └── js
│   └── uview
│       ├── common
│       └── example
├── store
│   └── index.js
├── uni_modules
│   └── uview-ui				#uView2.0主包
│       ├── LICENSE
│       ├── README.md
│       ├── changelog.md
│       ├── components				#所有的组件
│       ├── index.js
│       ├── index.scss
│       ├── libs
│       ├── package.json
│       └── theme.scss
├── unpackage
│   └── res
│       └── icons
├── util
│   └── request
│       ├── index.js
│       ├── requestInterceptors.js
│       └── responseInterceptors.js
├── App.vue
├── LICENSE
├── main.js
├── manifest.json
├── package-lock.json
├── pages.json					#页面配置
├── package.json
├── README.md
├── template.h5.html				#h5模板
├── tree.md
├── uni.scss
└── vue.config.js


created by beiqiao.

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

Api集中管理在/config/api.js中编写请求接口:

const { http } = uni.$u

// post请求,获取菜单
export const postMenu = (params, config = {}) => http.post('/ebapi/public_api/index', params, config)

// get请求,获取菜单,注意:get请求的配置等,都在第二个参数中,详见前面解释
export const getMenu = (data) => http.get('/ebapi/public_api/index', data)

发送请求

import { postMenu, getMenu } from '/config/api.js';

// 发出post,假设需要带上token
postMenu({ custom: { auth: true }}).then(() => {
	
}).catch(() =>{
	
})

// await等待,注意与async结合使用
await postMenu({ custom: { auth: true }})

// 假设不需要在响应拦截器中自动弹出的toast,以及不想写catch(如果promise中进行reject,但是却没有catch的话会报错)
postMenu({ custom: { auth: true, toast: false, catch: false }}).then(() => {
	
})

// get请求
getMenu({ custom: { auth: true }}).then(() => {
	
}).catch(() =>{
	
})

// 也可以直接通过uni.$u.post发出请求,注意此处需要写上接口地址
uni.$u.http.post('/common/menu', { custom: { auth: true }}).then(() => {
	
}).catch(() =>{
	
})

注意
在这里插入图片描述

uni.$u.http.post('/common/menu', { custom: { auth: true }},{header:{'content-type': 'application/x-www-form-urlencoded'}
			}).then(() => {}).catch(() =>{})

基本使用

uni.$u.http.middleware(config)
uni.$u.http.request(config)
uni.$u.http.get(url[, config])
uni.$u.http.upload(url[, config])
uni.$u.http.delete(url[, data[, config]])
uni.$u.http.head(url[, data[, config]])
uni.$u.http.post(url[, data[, config]])
uni.$u.http.put(url[, data[, config]])
uni.$u.http.connect(url[, data[, config]])
uni.$u.http.options(url[, data[, config]])
uni.$u.http.trace(url[, data[, config]])

config目录(公共配置目录)

config.js

//根域名
module.exports = {
	// #ifdef H5
	baseUrl: '/host', // 解决跨域 代理 本地服务器 
	// #endif
	baseUrl: 'http://*/fmis-api';
}

request.js

// 此vm参数为页面的实例,可以通过它引用vuex中的变量
module.exports = (vm) => {
    // 初始化请求配置
    uni.$u.http.setConfig((config) => {
        /* config 为默认全局配置*/
        config.baseURL = 'https://www.example.com'; /* 根域名 */
        return config
    })
	
	// 请求拦截
	uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
	    // 初始化请求拦截器时,会执行此方法,此时data为undefined,赋予默认{}
	    config.data = config.data || {}
		// 根据custom参数中配置的是否需要token,添加对应的请求头
		if(config?.custom?.auth) {
			// 可以在此通过vm引用vuex中的变量,具体值在vm.$store.state中
			config.header.token = vm.$store.state.userInfo.token
		}
	    return config 
	}, config => { // 可使用async await 做异步操作
	    return Promise.reject(config)
	})
	
	// 响应拦截
	uni.$u.http.interceptors.response.use((response) => { /* 对响应成功做点什么 可使用async await 做异步操作*/
		const data = response.data

		// 自定义参数
		const custom = response.config?.custom
		if (data.code !== 200) { 
			// 如果没有显式定义custom的toast参数为false的话,默认对报错进行toast弹出提示
			if (custom.toast !== false) {
				uni.$u.toast(data.message)
			}

			// 如果需要catch返回,则进行reject
			if (custom?.catch) {
				return Promise.reject(data)
			} else {
				// 否则返回一个pending中的promise,请求不会进入catch中
				return new Promise(() => { })
			}
		}
		return data.data === undefined ? {} : data.data
	}, (response) => { 
		// 对响应错误做点什么 (statusCode !== 200)
		return Promise.reject(response)
	})
}

main.js

import Vue from 'vue'
import App from './App'

// vuex
import store from '@/store'

// 引入全局uView
import uView from '@/uni_modules/uview-ui'

import mixin from './common/mixin'

Vue.prototype.$store = store

Vue.config.productionTip = false

App.mpType = 'app'
Vue.use(uView)

// #ifdef MP
// 引入uView对小程序分享的mixin封装
const mpShare = require('@/uni_modules/uview-ui/libs/mixin/mpShare.js')
Vue.mixin(mpShare)
// #endif

Vue.mixin(mixin)

// 引入uView提供的对vuex的简写法文件
let vuexStore = require('@/store/$u.mixin.js')
Vue.mixin(vuexStore)

//获取上一页
const prePage = () => {
	let pages = getCurrentPages();
	let prePage = pages[pages.length - 2];
	// #ifdef H5
	return prePage;
	// #endif
	return prePage.$vm;
}

Vue.prototype.$api = {
	prePage
};

// H5端 微信 分享
import weixin from './common/weixin.js' //微信操作js
if (weixin.isWechat()) {
  Vue.prototype.$weixin = weixin;
}


const app = new Vue({
    store,
    ...App
})

// 引入请求封装
require('./util/request/index')(app)

app.$mount()


配置代理 vue.config.js

module.exports = {
	// 配置路径别名
	configureWebpack: {
		devServer: {
			// 调试时允许内网穿透,让外网的人访问到本地调试的H5页面
			disableHostCheck: true,
			// port: '9011', //端口号
			proxy: {
				'/host': { // 接口请求中 从 /host 这里 进行代理
					target: 'http://XXX.XXX.XXX.XX:9011', //这里后台的地址模拟的;应该填写你们真实的后台接口
					changeOrigin: true, // 允许跨域
					pathRewrite: {
						'^/host': '' // 重定向 为空
					} 
				}
			}
		}
	}
	// productionSourceMap: false,
}

全局状态管理使用

this.$u.vuex('$userinfo', res.result)
import store from '@/store/index.js';
import { mapState } from 'vuex';
computed: {...mapState(['$userinfo', '$hasLogin','$partnership_loading'])},

常用API

格式化时间

timeFormat | date(timestamp, format = "yyyy-mm-dd")

注意:

1.7.9之前的版本只能传入秒或毫秒时间戳,date和timeFormat为同功能不同名函数,无论用哪个方法名,都是一样的。

该函数必须传入第一个参数,第二个参数是可选的,函数返回一个格式化好的时间。

  • time 任何合法的时间格式、秒或毫秒的时间戳
  • format 时间格式,可选。默认为yyyy-mm-dd,年为"yyyy",月为"mm",日为"dd",时为"hh",分为"MM",秒为"ss",格式可以自由搭配,如: yyyy:mm:dd,yyyy-mm-dd,yyyy年mm月dd日,yyyy年mm月dd日 hh时MM分ss秒,yyyy/mm/dd/,MM:ss等组合
<template>
	<view>
		<view>
			时间为:{{$u.timeFormat(timestamp, 'yyyy年mm月dd日')}}
		</view>
		<view>
			时间为:{{time}}
		</view>
	</view>
</template>

<script>
	export default{
		data() {
			return {
				time: null,
				timestamp: '1581170184'
			}
		},
		onLoad() {
			this.time = uni.$u.timeFormat(this.timestamp, 'yyyy-mm-dd');
		}
	}
</script>

route 路由跳转

此为一个路由跳转方法,内部是对uni多个路由跳转api的封装,更方便使用

在这里插入图片描述

注: 为了方便简写和调用,可以直接传递一个url地址替代Object,它只能执行uni.navigateTo类型的地址,不支持跳转到Tabbar页面, 如果有参数需要携带,以对象形式写到方法的第二个参数中。

// 无参数
uni.$u.route('/pages/components/empty/index');


// 带参数
uni.$u.route('/pages/components/empty/index', {
	name: 'lisa',
	age: 20
});
export default{
	onLoad() {
		setTimeout(() => {
			uni.$u.route({
				url: 'pages/components/empty/index',
				params: {
					name: 'lisa'
				}
			})
		}, 2000)
	}
}

test 规则校验

uView内置了一些校验规则,如是否手机号,邮箱号,URL等
这些规则方法,挂载在$u.test下面,如验证是否手机号: $u.test.mobile('13888889999'),如果验证通过,返回true,否则返回false

是否验证码

console.log(uni.$u.test.code('4567', 4));

是否数组

console.log(uni.$u.test.array([1, 2, 3]));

是否Json字符串

console.log(uni.$u.test.jsonString('{"a": 1}'));

是否对象

console.log(uni.$u.test.object({a: 1}));

是否邮箱号

console.log(uni.$u.test.email('123465798@gmail.com'));

是否手机号

console.log(uni.$u.test.mobile('13845678900'));

是否URL

console.log(uni.$u.test.url('http://www.uviewui.com'));

isEmpty(value)

校验值是否为空,返回true或者false。

console.log(uni.$u.test.isEmpty(false));

是否普通日期

console.log(uni.$u.test.date('2020-02-10 08:32:10'));

是否十进制数值

console.log(uni.$u.test.number('2020'));

是否整数

console.log(uni.$u.test.digits('2020'));

是否身份证号

console.log(uni.$u.test.idCard('110101199003070134'));

是否车牌号

console.log(uni.$u.test.carNo('京A88888'));

是否金额

console.log(uni.$u.test.amount('3,233.08'));

是否汉字

console.log(uni.$u.test.chinese('更上一层楼'));

是否字母

console.log(uni.$u.test.letter('uView'));

是否字母或者数字

console.log(uni.$u.test.enOrNum('uView'));

是否包含某个值

console.log(uni.$u.test.contains('uView', 'View'));

数值是否在某个范围内

console.log(uni.$u.test.range(35, [30, 34]));

字符串长度是否在某个范围内

console.log(uni.$u.test.rangeLength('abc', [3, 10]));

项目源码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uniapp uview2 使用笔记 的相关文章

随机推荐

  • 华为OD机试 C++ 报数问题

    题目 你和你的朋友们围成一个圈玩游戏 从第一个人开始 依次报数 1 2 3 当数到3的时候 那个人就得退出游戏 然后从他的下一个朋友继续开始 1 2 3 同样的 数到3的人又得退出 这样一直进行下去 直到圈里只剩下一个人 人会是谁 任务 给
  • Android Studio更新升级方法

    android studio一直在更新完善 为了与时俱进 我们当然要将工具更新到最新版本啦 其实更新本来是很简单 只要从Android Studio Help菜单中选择Check for Update即可 但因为 伟大的墙 实际更新失败 下
  • JS浏览器调试:Browser对象

    好久不搞前端 最近在搞钉钉的第三方应用的时候 前端给我露了一手 涉及到知识主要是JavaScript的Browser对象 首先现在很多PC客户端现在技术选型选择会选择nodejs这类 像nw js或者Electron 都会涉及到chromi
  • 给input框赋值成功后input框不能进行编辑

    选中一项后 input框不能进行编辑
  • 【工具】(z-library平替)Clibrary中文图书馆,电子书大全

    目录 新版目录 更新于2023 7 11 一 更新时间和简介 二 步骤 老版目录 接口无法使用 1 z library和Clibrary简介 2 Clibrary网址 3 具体操作界面 新版目录 更新于2023 7 11 一 更新时间和简介
  • three.js 制作地球标注的两种方法

    一 Sprite精灵标签 效果图 精灵标签 标签永远面向相机 function createTxt position name var texture new THREE CanvasTexture getCanvasFont var fo
  • 自学——一个月入门前端④

    本文的内容有关css盒模型 盒模型 在css中 所有的元素都被一个个的 盒子 包围着 广泛的使用两种盒子 块级盒子和内联盒子 这两种盒子会在页面流和元素之间的关系 block 绝大部分情况下盒子会和父容器一样宽 每个盒子都会换行 width
  • C/C++判断指针是否为空

    if p NULL if NULL p if p nullptr if nullptr p if p 0 if 0 p if p false if false p if p 个人理解 如有不对 敬请指正 最佳判断是if p 因为 p是一个指
  • 02-分布式协调服务ZooKeeper

    目录 一 ZooKeeper简介 1 什么是Zookeeper 2 基本特性 二 ZooKeeper原理 1 系统架构 1 1 角色分工 1 2 设计思想 1 3 为什么要引入Observer ZK 3 3 0 2 数据模型 2 1 Zno
  • 花书+吴恩达深度学习(二六)近似推断(EM, 变分推断)

    文章目录 0 前言 1 将推断视为优化问题 1 1 期望最大化 EM 1 2 最大后验推断 MAP 1 3 稀疏编码 2 变分推断 2 1 离散型潜变量 2 2 连续性潜变量 如果这篇文章对你有一点小小的帮助 请给个关注 点个赞喔 我会非常
  • 【Redis】持久化之AOF

    Redis持久化之AOF 以日志的形式来记录每个写操作 增量保存 将Redis执行过的所有写指令记录下来 读操作不记录 只许追加文件但不可以改写文件 redis启动之初会读取该文件重新构建数据 换言之 redis 重启的话就根据日志文件的内
  • 【element】之el-popconfirm:弹出组件确认按钮绑定

    element之el popconfirm 弹出组件确认按钮绑定 一 element官网说明 element中el popconfirm实例 element提供的接口 二 实际代码说明 无用代码 正确代码 一 element官网说明 ele
  • 通过bilibili_api获取bilibili弹幕+绘制词云的方法!

    由于自己学艺不精 后续词云的简略代码没怎么看懂 梳理了一遍把整个的学习内容记录下来 主要参考的为bilibili api的教程和词云的生成教程 https blog csdn net itanders article details 888
  • 华为b6手环能升级鸿蒙吗,华为手环B6全新发布:跨界形态再升级 强劲性能革新穿戴体验...

    2020年7月30日 北京 今日 华为正式推出了融合耳机和手环形态的跨界穿戴智能手环华为手环B6 它采用1 53英寸高清3D弧面柔性屏 外观时尚 操控自如 独创的分离式设计 让这款产品兼具蓝牙耳机的舒适佩戴和华为智能手环的专业运动健康功能
  • [Ubuntu] [Qt] Ubuntu18.04.6安装Qt后打不开

    1 安装完Qt5 15 2后点击图标没反应 2 通过指令打开Qt 可以看到失败的原因是因为glibc 2 28没找到 Qt Tools QtCreator bin qtcreator software Qt Tools QtCreator
  • labelimg 修正模型错误标注遇到的问题

    场景介绍 使用了 模型 如YOLOv5 v7 detec py 保存的 YOLO 格式的结果 包括测试的图像和对应的 txt 文件 模型跑出来的结果可能不够准确 需要手工修正下 因此我需要使用 labelimg 来可视化图像 并且修改其标注
  • Tomcat安装版和解压版

    在eclipse中开发web项目经常需要在eclipse中添加tomcat服务器 之前下载了目前最新版本tomcat9的zip版 由于目前的eclipse只支持到tomcat8 原本准备就这样安装了 在浏览器输入了n次http localh
  • redis持久化操作RDB和AOF详解与操作(docker)

    redis持久化 Redis 提供了两种不同的持久化方法来将数据存储到硬盘里面 一种方法叫快照 snapshotting RDB 它可以将存在于某一时刻的所有数据都写入硬盘里面 另一种方法叫只追加文件 append only file AO
  • SVR4/4.3BSD与Linux对待伪终端的不同方式

    打开伪终端意味着打开了一个 终端对 这个终端对的其中一个是主终端 另一个是从终端 简单说主终端和类似sshd telnetd等用户空间的远程协议处理进程连接 而从终端则和shell之类的实际进程连接 在处理远程登录的时候 一般都是由远程协议
  • uniapp uview2 使用笔记

    创建项目安装组件 npm install uview ui 配置 引入uView主JS库 在项目src目录中的main js中 引入并使用uView的JS库 注意这两行要放在import Vue之后 main js import uView