页面遵循vue单文件组件(SFC)规范
接口能力靠近微信小程序规范 但需将前缀wx替换为uni
数据绑定及事件处理同Vue.js规范 同时补充了App及页面的生命周期
为了兼容多端运行 建议使用flex布局 推荐使用rpx单位(750设计稿)
main.js是uni-app的入口文件 主要作用是
初始化vue实例
定义全局属性
定义全局组件
安装插件 如pinia,vuex等
vue2中
import Vue from 'vue'
Vue.config.productionTip = false //vue3 不在需要
App.mpType = 'app' //vue3不在需要
const app = new Vue({
...App
})
app.$mount()
vue3中
import { createSSRApp } from 'vue'
//不能修改导出的createApp方法名 不能修改从Vue中导入的createSSRApp
export function createApp() {
const app = createSSRApp(App)
return {
app
}
}
引入Pinia
import { createSSRApp } from 'vue'
import * as Pinia from 'pinia'
//不能修改导出的createApp方法名 不能修改从Vue中导入的createSSRApp
export function createApp() {
const app = createSSRApp(App)
return {
app
Pinia, //此处必须将Pinia返回
}
}
App.vue入口文件
App.vue是uni-app的入口组件 所有页面都是在App.vue下进行切换
App.vue本身不是页面 这里不能编写视图元素 也就是没有< template >元素
App.vue的作用
<script>
export default {
onLaunch: function() {
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>
<!-- 不支持添加scope 添加样式无效 -->
<style>
/*每个页面公共css 属于全局样式了 这里的样式没有作用域 */
</style>
全局样式
App.vue中style的样式为全局样式 作用于每一个页面(style标签不支持scoped 写了导致样式无效)
App.vue中通过@import 语句可以导入外联样式 一样作用于每一个界面
uni.scss文件也是用来编写全局公共样式 通常用来定义全局变量
uni.scss中通过@import 语句可以导入外联样式 一样作用于每一个界面
局部样式
在pages目录下的vue文件的style中的样式为局部样式 只作用对应的页面 并会覆盖App.vue中相同的选择器
vue文件中的style标签也可支持scss等预处理器 比如 安装dart-scss插件后 style标签便可支持Scss写样式了
style标签支持scoped吗 不支持 不需写
uni.scss全局样式文件
为了方便整体控制应用风格 默认定义了uni-app框架内置全局变量 当然也可以存放自定义的全局变量等
在uni.scss中定义的变量 我们无需@import就可以在任意组件中直接调用
使用uni.scss中的变量 须在 HBuilderX里面安装Scss插件(scss/sass编译)
然后在该组件的Style上加lang = “scss” 重启即可生效
uni.scss 文件
$my-primary-color: red;
<style lang='scss'>
/* 局部样式 类似给Style添加了scoped */
.content{
color: $my-primary-color
}
</style>
注意:
这里的uni-app框架内置变量和后i按uni-ui组件库的内置变量是不一样的
uni.scss定义的变量是全局可以直接使用 App.vue定义的变量只能在当前组件使用
方法 | 描述 | 平台说明 |
---|---|---|
page.$getAppWebview() | 获取当前页面的webview对象实例 | App |
page.route | 获取当前页面的路由 |
App.vue
<script>
export default {
onLaunch: function() {
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
},
globalData:{
text: 'text'
}
}
</script>
<style>
/*每个页面公共css */
</style>
<template>
<view class="content">
<view class="title name box">1.全局变量</view>
</view>
</template>
<script>
export default {
data() {
return {
title: 'Hello'
}
},
// 页面的生命周期
onLoad() {
// console.log(this); // Vue的实例
// 1.拿到全局数据 globalData
const app = getApp() // weapp h5 app
console.log("globalData=", app.globalData);
// 2.拿到当前页面的路由
const pages = getCurrentPages()
console.log(pages[pages.length - 1].route);
},
// 属于的Vue组件的生命周期
beforeCreate() {},
created() {
},
methods: {
}
}
</script>
<style lang="scss">
// @import '@/static/css/base.scss';
// 默认就是局部样式
.box{
border-radius: $radius;
}
page{
// height: auto;
}
</style>
page.json全局页面配置(兼容h5, weapp, app)
page.json文件用来对uni-app进行全局配置 类似微信小程序中app.json
决定页面的路径 窗口样式 原生的导航栏 底部的原生tabbar等
{
"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"
}
}
manifest.json应用配置
view: 视图容器 类似于传统html中的div 用于包裹各种元素内容(视图容器可以使用div吗?可以 但div不跨平台)
text: 文本组件 用于包裹文本内容
button: 在小程序端的主题和在其他端的主题颜色不一样 (可以通过条件编译来统一风格)
image: 图片 默认宽度 320px 高度240px
- 仅支持相对路径 绝对路径 支持导入 支持base64编码
scrollview: 可滚动视图区域 用于区域滚动
- 使用竖向滚动时 需要给< scroll-view > 一个固定高度 通过css设置height
- 使用横向滚动时 需要给< scroll-view > 添加一个white-space: nowrap样式 子元素设置为行内块级元素
- App和小程序中 请勿在scroll-view中使用map vieo等原生组件
- 小程序的scroll-view中也不要使用canvas textarea原生组件
- 若要使用下拉刷新 建议使用页面的滚动 而不是scroll-view
swiper: 滑块视图容器 一般用于左右滑动或上下滑动 比如banner轮播图
- 默认宽 100%, 高150px 可设置swiper组件高度来修改默认高度 图片高可用100%
uni-app支持的通用css单位包括 px rpx(推荐单位) vh vw
- px即 屏幕像素 rpx是响应式像素(responsive pixel)可以根据屏幕宽度进行自适应
- 规定屏幕宽度为750rpx 如在iPhone6上 屏幕宽度为375px 共有750个物理像素 则750rpx = 375px = 750物理像素 1rpx = 0.5px = 1物理像素
- 建议: 开发微信小程序时设计师可以用iPhone6作为设计稿的标准(即:设计稿宽度为750px)
页面的宽度在uni-app中的宽度计算公式:
750 * 元素在设计稿中的宽度 / 设计稿基准宽度
若设计稿宽度为750px 元素A在设计稿上的宽度为100px 那么元素A在uni-app里的宽度应该设置 750100 / 750
若设计稿宽度为640px 元素A在设计稿上的宽度为100px 那么元素A在uni-app里的宽度应该设置 750100 / 640
若设计稿宽度为475px 元素A在设计稿上的宽度为200px 那么元素A在uni-app里的宽度应该设置 750*200 / 475
使用@import语句可以导入外联样式(scss或css)
@import后跟需要导入的外联样式表的相对路径 用;表示语句结束
除了相对路径 默认是支持绝对路径(即@别名前缀)
相对路径: …/…/common/base.css
绝对路径: @/static/common/base.css
uni-app支持使用在css里设置背景图片 使用方式与普通web项目大体相同 但需要注意以下几点
注意:
微信小程序不支持相对路径 (真机不支持 开发工具支持)
uni-app支持使用字体图标 使用方式与普通web项目相同 注意事项也和背景图片一样 使用步骤如下
先制作字体图标, 比图: 可以在iconfont网站中生成
将字体图标文件引入项目,比如iconfont.ttf
在全局的Css中引入字体图标 比如App.vue
@font-face {
font-family: "iconfont"; /* Project id */
src: url('~@/static/custom-font/iconfont.ttf') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-shouye:before {
content: "\e668";
}
什么是 uni-ui
- uni-ui是DCloud提供的一个UI组件库 一套基于Vue组件 flex布局的跨全端UI框架
- uni-ui不包括uni-app框架提供的基础组件 而是基础组件的补充
uni-app的特点
高性能
- 目前 在小程序与混合App领域 uni-ui是性能的标杆
- 自动差量更新 uni-app引擎底层会自动用diff算法更新数据
- 优化逻辑层和视图层通讯折损 比如 需要跟手式操作的UI组件 底层使用了wxs bindingx等拘束 实现了高性能的交互体验
- WXS(WeiXin Script)是小程序的一套脚本语言 结合WXML 可以构建出页面的结构
- bindingx技术提供了一种称之为表达式绑定的机制 在weex上让手势等复杂交互操作以60fps的帧率 流畅执行
全端
- uni-ui 的组件都是多端自适应的 底层会抹平很多小程序平台的差异或bug
- uni-ui还支持nvue原生渲染 以及PC宽屏设备
- 支持uni.scss 可以方便的扩展和切换应用的风格
方式一(推荐):通过 uni_modules(插件模块化规范)单独安装组件,通过 uni_modules 按需安装某个组件:
在项目根目录的uni-scss文件中引入uni-ui组件库的variable.scss变量文件 然后就可以使用或修改对应的scss变量
变量主要定义的是主题色
/* 需要放到文件最上面 */
@import '@/uni_modules/uni-scss/variables.scss'
/* 行为相关颜色 */
$uni-color-primary: #007aff;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;
/* 文字基本颜色 */
$uni-text-color:#333;//基本色
$uni-text-color-inverse:#fff;//反色
$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
$uni-text-color-placeholder: #808080;
$uni-text-color-disable:#c0c0c0;
uni-froms组件使用步骤(类似Elment Plus的表单组件用法)
小程序 App直接重写 需要添加important
H5 App和小程序使用: global(selector) 需要添加important
H5 App和小程序使用:deep(selector) 需要添加important
//重写样式 (这个是微信小程序 直接重写就行)
.uni-forms-item__label {
justify-content: center !important;
color: red !import
}
//重写样式 (h5支持 和 小程序 支持)
:global(.uni-forms-item__label) {
color: purple !important;
justify-content: center !important;
}
//重写样式: deep 深度样式 h5支持
:deep(uni-forms-item__label) {
justify-content: center !important;
color: green !important;
}
uni-app能实现一套代码 多端运行 核心是通过编译器 + 运行时实现的
条件编译是用特殊的注释作为标记 在编译时根据这些特殊的注释 将注释里面的代码编译到不同平台
具体的语法:以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾。
条件编译是利用注释实现的 在不同语法里注释写法不一样
js使用//注释
css使用/* 注释 */
vue/nvue 模板里使用 < !-- 注释 -->
条件编译 APP-PLUS 包含 :APP-NVUE 和 APP-VUE
uni-app页面是编写在pages目录下
uni-app 有两种页面路由跳转方式:使用navigator组件跳转、调用API跳转(类似小程序,与vue-router不同)。
在uni-app中,常见页面通讯方式:
方式一:url查询字符串和EventChannel
方式二:使用事件总线
方式三:全局数据 globalData
方式四:本地数据存储
方式五:Vuex和Pinia,状态管理库。
方式一:url和EventChannel(兼容h5、weapp、app)
直接在url后面通过查询字符串的方式拼接
如url查询字符串出现特殊字符等格式,需编码
然后可在onLoad生命周期中获取url传递的参数
EventChannel 对象的获取方式
Options语法:this.getOpenerEventChannel()
Composition语法:getCurrentInstance().proxy. getOpenerEventChannel()
方式二 事件总线
uni.$ emit(eventName, OBJECT) 触发全局的自定义事件
uni.$ on(eventName, callback) 监听全局的自定义事件 有uni.$ emit触发
uni.$ once(eventName, callback) 只监听一次全局的自定义事件 由uni.$ emit触发
uni.$ off(eventName, callback) 移除全局自定义事件监听器
如果没有提供参数 则移除所有的事件监听器
注意事项
需先监听 再触发事件 比如 你在A界面触发 然后跳转到B页面后才监听是不行的
通常on 和 off 是同时使用 可以避免多次重复监听
适合页面返回传递参数 适合跨组件通讯 不适合界面跳转传递参数
uni-app 常用的页面生命周期函数:
uni-app 常用的页面生命周期函数:
uni.request(OBJECT) 发起网络请求。
uni.setStorage(OBJECT)
uni-app 组件Vue标准组件基本相同 但是也有一点区别 比如
uni-app 组件支持的生命周期,与Vue组件的生命周期相同。