uni-app 是什么:
uni-app 的优势是什么:
uni-app 和 vue 有什么关系:
uni-app 和小程序有什么关系:
uni-app小知识:
uni-app 规范:
// 模版块:一个页面只能有一个
<template>
<view class="content">
{{content}}
</view>
</template>
// 脚本块:一个页面也只能有一个
<script>
export default {
data() {
return {
content: 'hello uni-app'
}
}
}
</script>
// 样式块:可以有多个
<style>
.content {
background-color: #fff;
}
</style>
// 普通 web 开发
<body>
<div>
<img src=""></img>
<span></span>
</div>
</body>
// ni-app
<template>
<view>
<image src=""></image>
<text></text>
</view>
</template>
onLoad() {
// 获取网络类型
uni.getNetWorkType()
}
ni-app 特色:
条件编译写法 | 说明 |
---|---|
#ifdef APP-PLUS 需要条件编译的代码 #endif | 仅出现在 App 平台下的代码 |
#ifdef H5 需要条件编译的代码 #endif | 除了 H5 平台,其它平台均存在的代码 |
#ifdef H5 || MP-WEIXIN 需要条件编译的代码 #endif | 在 H5 平台或微信小程序平台存在的代码 |
uni-app 知识点:
// 查看 node 是否安装成功
node -v
npm install @vue-cli -g
// 或 npm install @vue/cli -g
// 查看 vue-cli 是否安装成功
vue -V
vue create -p dcloudio/uni-preset-vue 项目名称
// cd 进入项目目录
cd 项目名称
// 运行项目
npm run serve
<view v-bind:class="className">
hello uni-app
</view>
// 在微信小程序中
this.setData({
title: "hello"
})
// 在 uni-app 中
// this 指向当前 vue 的实例
this.title = "hello"
为什么 data 写成函数的形式而不是对象的形式:
// 对象的形式
data: {
"name": "hello world"
}
// 函数的形式
data() {
return {
name: "hello world"
}
}
<view>
<view v-if="show === ‘uni-app’">uni-app</view>
<view v-else-if="show === 'vue'">vue</view>
<view v-else>hello world</view>
</view>
<view>
<view v-for="(item,index) in arr">{{ item }}</view>
</view>
<view>
<view v-for="(key,value,index) in obj">{{key}} = {{value}} = {{index}}</view>
</view>
uni.request({
url: 'https://www.example.com/request',
data: {
text: 'uni.request'
},
header: {
'custom-header': 'hello' //自定义请求头信息
},
success: (res) => {
console.log(res.data);
this.text = 'request success';
}
});
uni.chooseImage({
success: (chooseImageRes) => {
const tempFilePaths = chooseImageRes.tempFilePaths;
uni.uploadFile({
url: 'https://www.example.com/upload',
filePath: tempFilePaths[0],
name: 'file',
formData: {
'user': 'test'
},
success: (uploadFileRes) => {
console.log(uploadFileRes.data);
}
});
}
});
const downloadTask = uni.downloadFile({
url: 'http://www.example.com/file/test',
success: (res) => {
if (res.statusCode === 200) {
console.log('下载成功');
}
}
});
downloadTask.onProgressUpdate((res) => {
console.log('下载进度' + res.progress);
console.log('已经下载的数据长度' + res.totalBytesWritten);
console.log('预期需要下载的数据总长度' + res.totalBytesExpectedToWrite);
// 测试条件,取消下载任务。
if (res.progress > 50) {
downloadTask.abort();
}
});
<view>
<!-- #ifdef H5 -->
<text>表示这段文本只在 H5 中编译</text>
<!-- #endif -->
<!-- #ifndef H5 -->
<text>表示这段文本除了 H5 平台,其它平台都存在</text>
<!-- #endif -->
</view>
<script>
// #ifdef
// #endif
</script>
<style>
/* #ifdef */
/* #endif */
</style>
条件编译写法 | 说明 |
---|---|
#ifdef APP-PLUS 需要条件编译的代码 #endif | 仅出现在 App 平台下的代码 |
#ifndef H5 需要条件编译的代码 #endif | 除了 H5 平台,其它平台均存在的代码 |
#ifdef H5 || MP-WEIXIN 需要条件编译的代码 #endif | 在 H5 平台或微信小程序平台存在的代码(这里只有 ||,不可能出现 &&,因为没有交集) |
值 | 平台 |
---|---|
APP-PLUS | App |
APP-PLUS-NVUE 或 APP-NVUE | App nvue |
H5 | H5 |
MP-WEIXIN | 微信小程序 |
MP-ALIPAY | 支付宝小程序 |
MP-BAIDU | 百度小程序 |
MP-TOUTIAO | 字节跳动小程序 |
MP-QQ | QQ小程序 |
MP-360 | 360小程序 |
MP | 微信小程序/支付宝小程序/百度小程序/字节跳动小程序/QQ小程序/360小程序 |
QUICKAPP-WEBVIEW | 快应用通用(包含联盟、华为) |
QUICKAPP-WEBVIEW-UNION | 快应用联盟 |
QUICKAPP-WEBVIEW-HUAWEI | 快应用华为 |
<style>
/* body */
/* body {
background-color: #eee;
} */
/* page */
page {
background-color: #eee;
}
</style>
<style>
/* 尺寸单位 */
font-size: 12px; // 或 px、rem、Rex、vh、vw
</style>
<style>
@import '../css/index.css'
</style>
<script>
export default {
// 应用初始化完成触发一次,全局只触发一次
onLaunch: function() {
// 应用场景:登陆、获取全局变量
},
// 应用启动的时候,或者从后台进入前台会触发
onShow: function() {
},
// 应用从前台进入后台时触发
onHide: function() {}
}
</script>
<script>
export default {
data() {
return {
}
},
// 监听页面加载
onLoad() {
//
},
// 监听页面显示:每次页面出现在屏幕上都会触发
onShow() {
},
// 监听页面的初次渲染完成
onReady() {
// 如果渲染速度快,会在页面进入动画完成前触发
}
// 监听页面隐藏:页面退出屏幕时触发
onHide() {
},
// 监听页面卸载:
onUnload() {
},
methods: {
}
}
</script>
<script>
export default {
// 在实例初始化之后,数据观测(data observer)和 event/watcher 事件配置之前被调用
beforeCreate() {},
// 实例创建完成之后立即调用,挂载阶段还没开始
created() {},
// 挂载到实例上之后调用
mouted() {},
// Vue 实例销毁后调用
destroyed() {}
}
</script>
连接安卓设备(下列用vivo,其它安卓设备类似):
连接 ios 设备:
{
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "uni-app"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
},
"tabBar": {
"color": "#7A7E83", // tab 上的文字默认颜色
"selectedColor": "#3cc51f", // tab 上的文字选中时的颜色
"borderStyle": "black", // tabbar 上边框的颜色,可选值 black/white
"backgroundColor": "#ffffff", // tab 的背景色
"list": [{ // tab 的列表,详见 list 属性说明,最少2个、最多5个 tab
"pagePath": "pages/component/index", // 页面路径,必须在 pages 中先定义
"iconPath": "static/image/icon_component.png", // 图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px,当 position 为 top 时,此参数无效,不支持网络图片,不支持字体图标
"selectedIconPath": "static/image/icon_component_HL.png", // 选中时的图片路径
"text": "组件". // tab 上按钮文字,在 App 和 H5 平台为非必填。例如中间可放一个没有文字的+号图标
}, {
"pagePath": "pages/API/index",
"iconPath": "static/image/icon_API.png",
"selectedIconPath": "static/image/icon_API_HL.png",
"text": "接口"
}]
}
}
<template>
<view class="test">
<view class="test2">
<view class="content">content</view>
</view>
</view>
</template>
<style>
$uni-width: 200px;
.test {
color: red;
.test2 {
font-size: 12px;
.content {
line-height: 12px;
// width: 200px; 可以替换为
width: $uni-width;
}
}
}
</style>
uniCloud 构成:
'use strict';
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
//返回数据给客户端
return event
};
methods: {
函数名() {
uniCloud.callFunction({
name: "云函数名",
data: {},
success(res) {},
fail(err) {}
})
}
}
'use strict';
// 获取数据库的引用
const db = uniCloud.database()
exports.main = async (event, context) => {
// 获取集合的引用
const collection = db.collection('集合的名字')
// 新增数据
// 新增 1 条记录
let res1 = await collection.add({
name: "zs"
})
// 新增 多 条记录
let res2 = await collection.add([
{
name: "lisi",
age: 12
},
{
name: "wangwu"
}
])
// 删除记录
const res3 = await collection.doc('该条记录的ID').remove()
// 修改记录
const res4 = await collection.doc('该条记录的ID').update()
const res5 = await collection.doc('该条记录的ID').set()
// 查询记录
// 查询指定ID的记录
const res6 = await collection.doc('该条记录的ID').get()
// 查询指定字段的记录
const res6 = await collection.where(查询条件).get()
//返回数据给客户端
return event
};
methods: {
addImage() {
let count = 9 - this.imageLists.length
let that = this
uni.chooseImage({
count: count,
success(res) {
const tempFilePaths = res.tempFilePaths
tempFilePaths.forEach((item, index) => {
// 处理 H5 多选的状况
if (index < count) {
that.imageLists.push({
url: item
})
}
})
}
})
},
async submit() {
let imagesPath = []
// uni.showLoading()
for (let i = 0; i < this.imageLists.length; i++) {
const filePath = this.imageLists[i].url
this.uploadFiles(filePath)
}
},
async uploadFiles(filePath) {
const result = await uniCloud.uploadFile({
cloudPath: new Date(),
filePath: filePath
})
return result.fileID
},
// 删除云存储中的文件
uniCloud.deleteFile({
fileList: ['云存储中的下载地址'],
success(res) {
console.log(res)
},
fail(err) {
console.log(err)
}
})
}
什么是 Vue 的单文件组件:
使用 uni-app 创建一个页面:
{
"集合名": { // 集合名(表名)
"data": [ // 数据
{
"键": "值",
"键": "值"
},
{
"键": "值",
"键": "值"
}
]
}
}
{
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/tabbar/index/index",
"style": {
"navigationStyle":"custom",
"navigationBarTextStyle":"white",
"navigationBarTitleText":"首页"
}
},
{
"path": "pages/tabbar/follow/follow",
"style": {
"navigationBarTitleText":"关注"
}
},
{
"path": "pages/tabbar/my/my",
"style": {
"navigationBarTitleText":"个人中心"
}
}
],
"globalStyle": { // 设置全局样式
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F07373",
"backgroundColor": "#F8F8F8"
},
"tabBar": { // 设置页面底部的 tabBar,至少2,最多5
"color": "#666", // 默认(未选择时)颜色
"selectedColor": "#f07373", // 选择时的颜色
"backgroundColor": "#fff", // tabBar 背景色
"list": [{
"pagePath": "pages/tabbar/index/index", // 页面路径
"text": "首页", // tabBar 文字
"iconPath": "static/home.png", // 未选中时 tabBar 图标
"selectedIconPath": "static/home-active.png" // 选中时 tabBar 图标
}, {
"pagePath": "pages/tabbar/follow/follow", // 页面路径
"text": "关注", // tabBar 文字
"iconPath": "static/follow.png", // 未选中时 tabBar 图标
"selectedIconPath": "static/follow-active.png" // 选中时 tabBar 图标
}, {
"pagePath": "pages/tabbar/my/my", // 页面路径
"text": "我的", // tabBar 文字
"iconPath": "static/my.png", // 未选中时 tabBar 图标
"selectedIconPath": "static/my-active.png" // 选中时 tabBar 图标
}]
}
}
{
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/tabbar/index/index",
"style": {
"navigationStyle":"custom",
"navigationBarTextStyle":"white", // 只能设置 white/black 两种颜色
"navigationBarTitleText":"首页"
}
}
]
}
<!-- 状态栏 -->
<!-- #ifndef MP-ALIPAY -->
<view :style="{height: statusBarHeight + 'px'}"></view>
<!-- #endif -->
<!-- 导航栏 -->
created() {
// 获取手机系统信息
const phoneInfo = uni.getSystemInfoSync()
// 获得状态栏高度
this.statusBarHeight = phoneInfo.statusBarHeight
this.windowWidth = phoneInfo.windowWidth
// #ifndef H5 || APP-PLUS || MP-ALIPAY
// 获取胶囊的位置
const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
// console.log(menuButtonInfo)
// 导航栏高度 = (胶囊底部高度 - 状态栏高度) + (胶囊顶部高度 - 状态栏高度)
this.navbarHeight = (menuButtonInfo.bottom - phoneInfo.statusBarHeight) + (menuButtonInfo.top - phoneInfo.statusBarHeight)
// 导航栏宽度
this.windowWidth = menuButtonInfo.left
// #endif
// #ifdef MP-ALIPAY
this.statusBarHeight = 0
// #endif
},
<uni-icons type="back" size="22" color="#fff"></uni-icons>
// 批量导出文件
const requireApi = require.context(
// api 目录的相对路径
'.',
// 是否查询子目录
false,
// 查询文件的后缀
/.js$/
)
let module = {}
requireApi.keys().forEach((key,index) => {
if(key === './index.js') return
Object.assign(module, requireApi(key))
})
export default module
import $http from '../http.js'
export const get_label = (data) => {
return $http({
url: 'get_label',
data
})
}
export const update_label = (data) => {
return $http({
url: 'update_label',
data
})
}
import store from '../store/index.js'
export default function $http(options) {
const { url, data } = options
const dataObj = {
user_id: store.state.userInfo._id,
...data
}
return new Promise((resolve, reject) => {
uniCloud.callFunction({
name: url,
data: dataObj
}).then(res => {
if(res.result.code === 200) {
resolve(res.result)
} else {
reject(res.result)
}
}).catch(err => {
reject(err)
})
})
}
<template>
<scroll-view class="tab-scroll" scroll-x >
<view class="tab-scroll_box">
<view class="tab-scroll_item" :class="{active: activeIndex === index}" v-for="(item,index) in list" :key="index" @click="clickTab(item,index)">{{item.name}}</view>
</view>
</scroll-view>
<template>
<script>
data() {
return {
activeIndex: 0
};
},
methods: {
clickTab(item,index) {
this.activeIndex = index
this.$emit('tabClick', index)
}
}
</script>
<style>
.active {
color: $lgk-base-color;
}
</style>
<view class="icons" @click.stop="likeTab">
<uni-icons :type="like?'heart-filled':'heart'" size="20" color="#f07373"></uni-icons>
</view>
data() {
return {
like: false
};
},
methods: {
likeTab() {
this.like = !this.like
this.setUpdateLikes()
},
}
import { mapState } from 'vuex'
computed: {
...mapState(['historyList'])
},
state: {
historyList: uni.getStorageSync('__history') || []
},
同步关注作者
项目介绍: