uni-app的基本使用 uni-app ui
liuian 2024-12-22 19:34 31 浏览
听说uni-app牛逼的狠,一套代码可以发布到各种微信、QQ、百度、头条小程序以及H5、安卓、IOS,牛逼的不要不要的,还有超级多好看的插件,完全拿来即用超级方便?
这么好的话打算小小的学一下,然后重构下我的连词小程序。
学习主要是看官方文档就可以啦,我这里只是大概介绍下我的学习流程而已,开始吧!
一、准备
视频教程:https://www.bilibili.com/video/BV1BJ411W7pX?p=3&spm_id_from=pageDriver
官网:https://uniapp.dcloud.io/
开发工具下载:https://www.dcloud.io/hbuilderx.html 这里下载App开发版
二、微信小程序运行故障
at Pipe.onStreamRead (internal/stream_base_commons.js:20
解决办法:https://blog.csdn.net/weixin_41700702/article/details/111187129
其实打开微信的安全服务端口就可以啦!
三、相关常用组件功能的学习
1、globalStyle
这个是全局配置,修改导航条等,配置路径为page.json中跟pages统计
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",//导航条文字颜色
"navigationBarBackgroundColor": "#eee",//导航条背景颜色
"backgroundColor": "#F8F8F8" //背景颜色
"enablePullDownRefresh": true
},
相关配置的含义,官方文档有
2、tabBar
这个是配置底部的菜单,也有很多配置,跟globalStyle同级,下面是我的配置
"tabBar":{
//"color":"#F0AD4E",
//"selectedColor":"#007AFF",
//"backgroundColor":"#4CD964",
//"position":"top",
//"borderStyle":"black",
"list":[
{
"pagePath":"pages/index/index",
"text":"炼词",
"iconPath":"static/images/syclose.png",
"selectedIconPath":"static/images/syopen.png"
},
{
"pagePath":"pages/reply/reply",
"text":"复习",
"iconPath":"static/images/fx2close.png",
"selectedIconPath":"static/images/fx2open.png"
},
{
"pagePath":"pages/record/record",
"text":"记录",
"iconPath":"static/images/wdclose.png",
"selectedIconPath":"static/images/wdopen.png"
}
]
},
3、condition
有时候我们想要直接调试某一页面,不想要从首页点击进去,特别是微信小程序这种,那么加上condition可以让我们在编译模式那里可以选择。跟globalStyle同级,下面是我的配置
"condition":{
"current": 0,
"list":[
{
"name":"游戏页",
"path":"pages/play/play",
"query":"id=80"
}
]
}
上面这个一般在开发环境使用,具体参考官方文档
4、text组件
组件学习比较简单,就类似一HTML的各种标签比如button,div,span等,直接参考官方文档即可
<view>我是复习</view>
<view><text selectable="true">唱歌,跳舞</text></view>
<view><text space="ensp">唱歌, 跳舞</text></view>
<view><text space="emsp">唱歌, 跳舞</text></view>
<view><text space="nbsp">唱歌, 跳舞</text></view>
<view><text>&</text></view>
<view><text decode="false">&</text></view>
5、view组件
<view class="box2" hover-class="box2-down">
<view class="box1" hover-class="box1-down"
hover-start-time="1000"
hover-stay-time="1000"
hover-stop-propagation="true">类似于HTML中的div</view>
6、button组件
<button>按钮</button>
<button size="mini">按钮</button>
<button type="primary">按钮</button>
<button plain="true">按钮</button>
<button disabled="true">按钮</button>
<button loading="true">按钮</button>
7、image组件
<image src="../../static/images/shezhi.png"></image>
<image src="https://www.suibibk.com/fileupload/images/202011/1605364293267.jpg"></image>
<image mode="aspectFill" src="https://www.suibibk.com/fileupload/images/202011/1605364293267.jpg"></image>
<image mode="aspectFit" src="https://www.suibibk.com/fileupload/images/202011/1605364293267.jpg"></image>
<image mode="scaleToFill" src="https://www.suibibk.com/fileupload/images/202011/1605364293267.jpg"></image>
<image mode="heightFix" src="https://www.suibibk.com/fileupload/images/202011/1605364293267.jpg"></image>
<image mode="widthFix" src="https://www.suibibk.com/fileupload/images/202011/1605364293267.jpg"></image>
8、样式
<style>
.box1{
width:100px;
height:100px;
background:red;
}
.box1-down{
background:green;
}
.box2{
width:200px;
height:200px;
background:black;
}
.box2-down{
background:red;
}
</style>
还可以导入样式
play.css
view{
color: #F0AD4E;
font-size: 30rpx;
}
然后导入
<style>
@import url("./play.css");
.box{
width: 750rpx;
height: 100rpx;
background: red;
font-size: 20rpx;
}
.box2{
width: 375rpx;
height: 100rpx;
background: green;
}
</style>
9、数据绑定
{{}}
v-bind:src
v-for
我们在
export default {
data() {
return {
msg:'hello',
flag: true,
path: 'https://www.suibibk.com/fileupload/images/202011/1605364293267.jpg',
arr: [
{
name: '小林1',
age: 20,
id: 1
},
{
name: '小林2',
age: 30,
id: 2
},
{
name: '小林3',
age: 40,
id: 3
}
]
}
}
定义了信息,图片路径,数组,然后在组件里这样做
<view class="box3">{{msg}}</view>
<view>{{1+'您好'}}</view>
<view>{{234+678}}</view>
<view>{{flag?'这是反话':"这是真的"}}</view>
<view><image v-bind:src="path"></image></view>
<view><image :src="path"></image></view>
<view v-for="(item,index) in arr" :key="item.id">
名字:{{item.name}};年龄:{{item.age}}
</view>
10、事件和传递参数
<button v-on:click="clickButton">点击</button>
<button v-on:click="clickButton2">点击获取事件对象</button>
<button v-on:click="clickButton3(10)">点击传递参数</button>
<button v-on:click="clickButton4(20,$event)">点击传递参数和获取事件对象</button>
然后我们在跟data()同级别定义methods
methods:{
clickButton (){
console.log("点击我了")
},
clickButton2 (e){
console.log("点击我了:"+e)
},
clickButton3 (num){
console.log("点击我了:"+num)
},
clickButton4 (num,e){
console.log("点击我了:"+num+";"+e)
}
}
11、生命周期
跟methods同级,具体含义参考官方文档即可
onLoad: function(options) {
console.log('页面加载:'+options.id)
},
onShow: function() {
console.log('页面显示')
},
onHide: function() {
console.log('页面隐藏')
},
onReady: function() {
console.log('页面渲染完了')
}
12、下拉刷新
先在pages.json开启下拉刷新
"pages": [
...
{
"path": "pages/record/record",
"style": {
"navigationBarTitleText": "记录",
"enablePullDownRefresh": true
}
},
...
]
enablePullDownRefresh为true,开启下拉刷新,下拉刷新后会触发下拉刷新的方法
onPullDownRefresh() {
console.log("下拉刷新...")
setTimeout(()=>{
this.arr = ['D','E','F']
//停止下拉刷新
uni.stopPullDownRefresh()
},2000)
}
也可以点击按钮开启主动触发下拉刷新
<button @click="refresh()">手动下拉刷新</button>
点击后,触发下拉刷新
refresh (){
uni.startPullDownRefresh()
}
然后就会自动执行onPullDownRefresh方法。
13、监听页面滚动到底部的事件
"pages": [
...
{
"path": "pages/record/record",
"style": {
"navigationBarTitleText": "记录",
"onReachBottomDistance": 200
}
},
...
]
onReachBottomDistance表示距离底部多远就会触发滚动到底部的事件,默认是50,会触发如下方法
onReachBottom() {
console.log("滚动到下一页了");
this.arr=[...this.arr,...['1','2','3']]
}
四、发送GET/POST请求
很简单,具体详细请查阅官网就可以啦
toPOST() {
uni.request({
url: "https://www.suibibk.com/getReplys",
method: "POST",
data:{
id: "890369880069505024",
visible: "1"
},
success(data) {
console.log("请求返回结果:"+data)
}
})
}
五、数据缓存
toStorage() {
uni.setStorage({
key: "id",
data: {"name":"小美"},
success: function() {
console.log("保持数据成功")
}
})
},
toStorageSync() {
uni.setStorageSync("id2",{"name":"小美2"})
},
getStorage() {
uni.getStorage({
key: "id",
success:function(res) {
console.log("异步获取数据成功:"+res.data.name)
}
})
},
getStorageSync() {
const user = uni.getStorageSync("id2")
console.log(user.name);
},
removeStorage() {
uni.removeStorage({
key: "id",
success:function() {
console.log("异步移除数据成功")
}
})
},
removeStorageSync() {
uni.removeStorageSync("id2")
console.log("移除数据成功")
}
见名知意,包括同步和异步,正常同步比较方便
六、上传和预览图片
<view>
<button @click="chooseImg()">上传图片</button>
<!--下面这里是预览-->
<image v-for="img in imgArr" :src="img" @click="previewImg(img)"></image>
</view
用户点击上传,可以选多张,然后预览
export default {
data() {
return {
title: 'Hello',
imgArr: []
}
}
}
这里先定义一个数组用来存放上传完后的路径
chooseImg() {
console.log("上传图片")
uni.chooseImage({
count: 5,
success: (res) => {
this.imgArr = res.tempFilePaths
console.log("imgArr:"+this.imgArr)
}
})
}
这里设定了只能上传5张,但是在H5上是控制不住的,具体见官方文档…
七、条件编译,跨端兼容
因为我们是一套代码多端使用,总是会有些内容是不同平台个性化处理的,uni-app提供了#idef等方法来在view中,script中,style中做条件编译,如下
<!-- #ifdef H5 -->
<view>只会在H5上显示</view>
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<view>只会在微信小程序上显示</view>
<!-- #endif -->
onLoad() {
//#ifdef H5
console.log("只会在H5上初始化")
//#endif
//#ifdef MP-WEIXIN
console.log("只会在微信上初始化")
//#endif
}
/* #ifdef H5 */
view {
color: #007AFF;
}
/* #endif */
/* #ifdef MP-WEIXIN */
view {
color: #FF0000;
}
/* #endif */
八、导航跳转
导航跳转有声明式和编程式,其实声明式就类似于HTML的a标签,uni-app中用的是navigator,具体见官方文档
<navigator url="/pages/play/play?id=80">跳转游戏页</navigator>
<navigator url="/pages/reply/reply" open-type="switchTab">跳转复习页</navigator>
<navigator url="/pages/play/play" open-type="redirect">跳转游戏页</navigator>
只有switchTab模式才能跳转tabBar类型的页面.
再来说说编程式
button @click="goPlay()">跳转到游戏页</button>
<button @click="goReply()">跳转复习页</button>
<button @click="goPlay2()">跳转到游戏页</button>
分别触发如下方法
goPlay(){
uni.navigateTo({
url:'/pages/play/play'
})
},
goReply(){
uni.switchTab({
url:'/pages/reply/reply'
})
},
goPlay2(){
uni.redirectTo({
url:'/pages/play/play'
})
}
九、跳转传参
其实很简单,直接在后面拼上就可以了
<navigator url="/pages/play/play?id=80">跳转游戏页</navigator>
然后在play页面的生命周期方法onLoad中获取就可以啦
onLoad: function(options) {
console.log('页面加载:'+options.id)
}
十、组件的创建使用和组件的生命周期
组件的创建也很简单,我们只需要建一个组件,如途中的test.vue
然后在要使用的页面的script中导入
import test from '../../components/test.vue'
注册到组件中
components:{
test
}
就可以跟view,button组件一样直接使用啦
<test></test>
十一、组件之间传递数据
我们可以自定义组件,那父组件和子组件怎么传递数据呢,正常来说,父组件是可以自动向子组件传递数据的,但是子组件却不能自动的,为啥呢?因为如果可以了的话,引用子组件的父组件该有多大的风险。
1、父传子
就比如上面,我们引入了子组件test.vue,那怎么向子组件test.vue传递数据呢?
很简单,具体详细请查阅官网就可以啦!
如在父组件中
<test :title="title"></test>
其中title是父组件的变量来的
data() {
return {
title: 'Hello'
}
}
那子组件test.vue要怎么获取title值呢?
export default {
name:"test",
props:['title']
...
}
只需要在子组件用props获取就可以啦
然后子组件就直接{{title}}就可以获取。
2、子传父
如果子组件想要向父组件传值,那么九只能定义方法,比如在子组件test.vue中
<button @click="sendMsg">给父组件传值</button>
定义sendMsg方法
methods:{
sendMsg(){
console.log("给父组件传值")
this.$emit('myEvent',this.num)
}
}
这里用的是$emit来向父组件传值,父组件只需要定义myEvent方法就可以获取值了如
<test @myEvent="getMsg"></test>
那么会自动调用getMsg方法
getMsg(num){
console.log("获取子组件的传值:"+num)
}
3、兄弟组件互传
兄弟组件的互相传值,有点类似发布订阅的模式,比如我们再建立两个组件
components/a.vue
<template>
<view>
<button @click="addNum">a组件修改b组件的数据</button>
</view>
</template>
components/b.vue
<template>
<view>
b组件的数据{{num}}
</view>
</template>
都在父组件中引用
import test from '../../components/test.vue'
import testA from '../../components/a.vue'
import testB from '../../components/b.vue'
...
components:{
test,
"test-a": testA,
"test-b": testB
}
<test-a></test-a>
<test-b></test-b>
那怎样实现点击a组件里面的按钮,传值到兄弟组件b呢?
很简单,我们在b.vue注册个监听事件
export default {
name:"b",
data() {
return {
num:0
};
},
created() {
//注册个监听事件
uni.$on('updateNum',num=>{
console.log("b组件监听到了")
this.num+=num
})
}
}
这里用的是$on,然后只要有updateNum事件就会被触发,然后我们在a组件中
export default {
name:"a",
data() {
return {
};
},
methods:{
addNum(){
console.log("修改b组件的值")
uni.$emit('updateNum',10)
}
}
}
用uni.$emit('updateNum',10)来发布事件就好啦!
具体参考官方文档!
十二、uni-ui组件库的使用
比如我们要使用一个日期组件,uni-calendar,然后我们只需要加到compontents目录下就可以啦,因为uni-calendar组件符合easycom规范,HBuilderX 2.5.5起,只需将本组件导入项目,在页面template中即可直接使用,无需在页面中import和注册components。
我们直接使用
<uni-calendar
:insert="true"
:lunar="true"
:start-date="'2019-3-2'"
:end-date="'2019-5-20'"
@change="change"
/>
完美!
十二、总结
以官方文档为主,毕竟技术更新太快啦!
相关推荐
- 赶紧收藏!编程python基础知识,本文给你全部整理好了
-
想一起学习编程Python的同学,趁我粉丝少,可以留言、私信领编程资料~Python基础入门既然学习Python,那么至少得了解下这门编程语言,知道Python代码执行过程吧。Python的历...
- 创建绩效改进计划 (PIP) 的6个步骤
-
每个经理都必须与未能达到期望的员工抗衡,也许他们的表现下降了,他们被分配了新的任务并且无法处理它们,或者他们处理了自己的任务,但他们的行为对他人造成了破坏。许多公司转向警告系统,然后在这些情况下终止。...
- PI3K/AKT信号通路全解析:核心分子、上游激活与下游效应分子
-
PI3K/AKT/mTOR(PAM)信号通路是真核细胞中高度保守的信号转导网络,作用于促进细胞存活、生长和细胞周期进程。PAM轴上生长因子向转录因子的信号传导受到与其他多条信号通路的多重交叉相互作用的...
- 互联网公司要求签PIP,裁员连N+1都没了?
-
2021年刚画上句号,令无数互联网公司从业者闻风丧胆的绩效公布时间就到了,脉脉上已然炸了锅。阿里3.25、腾讯二星、百度四挡、美团绩效C,虽然名称五花八门,实际上都代表了差绩效。拿到差绩效,非但不能晋...
- Python自动化办公应用学习笔记3—— pip工具安装
-
3.1pip工具安装最常用且最高效的Python第三方库安装方式是采用pip工具安装。pip是Python包管理工具,提供了对Python包的查找、下载、安装、卸载的功能。pip是Python官方提...
- 单片机都是相通的_单片机是串行还是并行
-
作为一个七年的从业者,单片机对于我个人而言它是一种可编程的器件,现在长见到的电子产品中几乎都有单片机的身影,它们是以单片机为核心,根据不同的功能需求,搭建不同的电路,从8位的单片机到32位的单片机,甚...
- STM32F0单片机快速入门八 聊聊 Coolie DMA
-
1.苦力DMA世上本没有路,走的人多了,便成了路。世上本没有DMA,需要搬运的数据多了,便有了DMA。大多数同学应该没有在项目中用过这个东西,因为一般情况下也真不需要这个东西。在早期的单片机中...
- 放弃51单片机,直接学习STM32开发可能会面临的问题
-
学习51单片机并非仅仅是为了学习51本身,而是通过它学习一种方法,即如何仅仅依靠Datasheet和例程来学习一种新的芯片。51单片机相对较简单,是这个过程中最容易上手的选择,而AVR单片机则更为复杂...
- STM32串口通信基本原理_stm32串口原理图
-
通信接口背景知识设备之间通信的方式一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。并行与串行通信的区别如下表所示。串行通信的分类1、按照数据传送方向,分为:单工:数据传输只支持数据在一个...
- 单片机的程序有多大?_单片机的程序有多大内存
-
之前一直很奇怪一个问题,每次写好单片机程序之后,用烧录软件进行烧录时,能看到烧录文件也就是hex的文件大小:我用的单片机芯片是STM32F103C8T6,程序储存器(flash)只有64K。从...
- 解析STM32单片机定时器编码器模式及其应用场景
-
本文将对STM32单片机定时器编码器模式进行详细解析,包括介绍不同的编码器模式、各自的优缺点以及相同点和不同点的应用场景。通过阅读本文,读者将对STM32单片机定时器编码器模式有全面的了解。一、引言...
- 两STM32单片机串口通讯实验_两个32单片机间串口通信
-
一、实验思路连接两个STM32单片机的串口引脚,单片机A进行发送,单片机B进行接收。单片机B根据接收到单片机A的指令来点亮或熄灭板载LED灯,通过实验现象来验证是否通讯成功。二、实验器材两套STM32...
- 基于单片机的智能考勤机设计_基于51单片机的指纹考勤机
-
一、设计背景随着科技水平的不断发展,在这么一个信息化的时代,智能化信息处理已是提高效率、规范管理和客观审查的最有效途径。近几年来,国内很多公司都在加强对企业人员的管理,考勤作为企业的基础管理,是公司...
- STM32单片机详细教学(二):STM32系列单片机的介绍
-
大家好,今天给大家介绍STM32系列单片机,文章末尾附有本毕业设计的论文和源码的获取方式,可进群免费领取。前言STM32系列芯片是为要求高性能、低成本、低功耗的嵌入式应用设计的ARMCortexM...
- STM32单片机的 Hard-Fault 硬件错误问题追踪与分析
-
有过单片机开发经验的人应该都会遇到过硬件错误(Hard-Fault)的问题,对于这样的问题,有些问题比较容易查找,有些就查找起来很麻烦,甚至可能很久都找不到问题到底是出在哪里。特别是有时候出现一次,后...
- 一周热门
-
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
飞牛OS入门安装遇到问题,如何解决?
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)