Skip to content

核心语法 ​

一、扩展组件(uni-ui) ​

1.1、什么是 uni-ui? ​

1.2、安装 uni-ui 组件库 ​

方式一: ​

通过 uni_modules(插件模块化规范)单独安装组件,通过 uni_modules 按需安装某个组件:

  • 步骤 1:官网找到扩展组件清单,然后将所需要的组件导入到项目,导入后直接使用,无需 import 和注册
  • 步骤 2:通常我们还想切换应用风格,这时可以在 uni.scss 导入 uni-ui 提供的内置 scss 变量,然后重启应用
  • 注意:需要登录 DCloud 账号才能安装

方式二: ​

通过 uni_modules 导入全部组件

  • 如想把所有 uni-ui 组件导入到项目,可以借用 Hbuilder X 插件导入
  • 如没自动导入其他组件,可下载源码复制过去即可

方式三: ​

在 HBuilderX 新建 uni-app 项目时,在模板中选择 uni-ui 模板来创建项目

  • 由于 uni-app 独特的 easycom(自动导包)技术,可以免引入、注册,就直接使用符合规则的 vue 组件

方式四: ​

npm 安装

  • 在 vue-cli 项目中可用 npm 安装 uni-ui 库

1.3、定制 uni-ui 主题风格 ​

  1. 安装 dart-sass 插件(一般都会提示,并自动安装)
  2. 在项目根目录的 uni.scss 文件引入 uni-ui 组件库的 variable.scss 变量文件,就可以使用或修改对应的 scss 变量
    • @import '@/uni_modules/uni-scss/variables.scss'
  3. 变量主要定义的是主题色。

image-20240219105704957

1.4、uni-forms 组件 ​

uni-froms 组件使用步骤(类似 Element Plus 的表单组件用法):

  • 安装 uni-forms 等组件
  • uni-forms 搭建表单布局
  • 编写表单项的验证规则
  • 提交表单时验证表单项
  • 重置表单

image-20240219105953584

1.5、重写 uni-forms 组件样式 ​

  1. 小程序、App 直接重写,需要添加 important
  2. H5、App 和小程序使用:global( selector ) ,需要添加 important
  3. H5 、App 和小程序使用:deep( selector ) ,需要添加 important
scss
.uni-forms-item__label {
	justify-content: center !important;
	color: red !important;
}

:global(.uni-forms-item__label) {
	color: purple !important;
	justify-content: center !important;
}

:deep(.uni-forms-item__label) {
	justify-content: center !important;
	color: green !important;
}

二、跨平台兼容 ​

uni-app 能实现一套代码、多端运行,核心是通过编译器 + 运行时实现的:

  • 编译器:将 uni-app 统一代码编译生成每个平台支持的特有代码;如在小程序平台,编译器将.vue 文件拆分生成 wxml、wxss、js 等
  • 运行时:动态处理数据绑定、事件代理,保证 Vue 和对应宿主平台 数据的一致性;

跨平台存在的问题:

  • uni-app 已将常用的组件、JS API 封装到框架中,开发者按照 uni-app 规范开发即可保证多平台兼容,大部分业务均可直接满足
  • 但每个平台有自己的一些特性,因此会存在一些无法跨平台的情况
    • 大量写 if else,会造成代码执行性能低下和管理混乱
    • 编译到不同的工程后二次修改,会让后续升级变的很麻烦

跨平台兼容解决方案:

  • 在 C 语言中,通过 #ifdef、#ifndef 的方式,为 windows、mac 等不同 os 编译不同的代码
  • uni-app 参考这个思路,为 uni-app 提供了条件编译手段,在一个工程里优雅的完成了平台个性化实现

条件编译 ​

条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台

具体的语法:以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾

  • #ifdef:if defined 仅在某平台存在
  • #ifndef:if not defined 除了某平台,其它平台均存在
  • %PLATFORM%:平台名称

image-20240219111313673

支持编写条件编译的文件,如下:

  • vue(template 、script 、style)
  • .js 、.ts 、pages.json
  • .css、.scss、.less、.stylus

例如:设置页面的标题

  • H5 专有 API:document.title = ''
  • 微信小程序专有 API:wx.setNavigationBarTitle(object)

注意事项 ​

条件编译是利用注释实现的,在不同语法里注释写法不一样

  • js 使用 //注释

  • css 使用 /* 注释 */

  • vue/nvue 模板里使用 <!-- 注释 -->

条件编译 APP-PLUS 包含 :APP-NVUE 和 APP-VUE

APP-PLUS-NVUE 和 APP-NVUE 没什么区别,为了简写后面出了 APP-NVUE

使用条件编译请保证编译前和编译后文件的正确性,比如 json 文件中不能有多余的逗号

Android 和 iOS 不支持条件编译,如需区分 Android、iOS 平台,请通过调用 uni.getSystemInfo 来获取平台信息

微信小程序主题色是绿色,而百度支付宝小程序是蓝色,应用想分平台适配颜色,条件编译是代码量最低、最容易维护的

三、新建 Page 页面 ​

uni-app 页面是编写在 pages 目录下

  • 可直接在 uni-app 项目上右键“新建页面”,HBuilderX 会自动在 pages.json 中完成页面注册。

  • HBuilderX 还内置了常用的页面模板(如图文列表、商品列表等),这些模板可以大幅提升你的开发效率。

注意事项:

  • 每次新建页面,需在 pages.json 中配置 pages 列表(手动才需配置)
  • 未在 pages.json -> pages 中配置的页面,uni-app 会在编译阶段进行忽略。

删除页面:

  • 删除.vue 文件 和 pages.json 中对应的配置

配置 tabBar

  • color
  • selectedColor
  • list -> pagePath、text、iconPath、selectedIconPath

四、页面路由 ​

uni-app 有两种页面路由跳转方式:使用 navigator 组件跳转、调用 API 跳转(类似小程序,与 vue-router 不同)

  • 组件:navigator
  • API:navigateTo、redirectTo、navigateBack、switchTab

image-20240219112020584

五、页面间通讯 ​

在 uni-app 中,常见页面通讯方式:

  • 方式一:url 查询字符串和 EventChannel
  • 方式二:使用事件总线
  • 方式三:全局数据 globalData
  • 方式四:本地数据存储
  • 方式五:Vuex 和 Pinia,状态管理库。

方式一: ​

url 传递数据

  • 直接在 url 后面通过查询字符串的方式拼接

    • 如 url 查询字符串出现特殊字符等格式,需编码
  • 然后可在 onLoad 生命周期中获取 url 传递的参数

image-20240219112552033

image-20240219112708018

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 常用的页面生命周期函数:

注意事项:

  • 页面可以使用 Vue 组件生命周期吗? 可以的
  • 页面滚动才会触发 onReachBottom 回调,如果自行通过 overflow 实现的滚动不会触发 onReachBottom 回调

七、网络请求 ​

uni.request(OBJECT) 发起网络请求

  • 登录各个小程序管理后台,给网络相关的 API 配置合法域名(域名白名单)
  • 微信小程序开发工具,在开发阶段可以配置:不校验合法域名
  • 运行到手机时,资源没有出来时可以打开手机的调试模式
  • 请求的 header 中 content-type 默认为 application/json

image-20240219113435092

八、数据缓存 ​

uni.setStorage(OBJECT) ​

  • 将数据存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个异步接口

uni.setStorageSync(KEY, DATA) ​

  • 将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口

uni.getStorage(OBJECT) ​

  • 从本地缓存中异步获取指定 key 对应的内容

uni.getStorageSync(KEY) ​

  • 从本地缓存中同步获取指定 key 对应的内容

uni.removeStorage(OBJECT) ​

  • 从本地缓存中异步移除指定 key

uni.removeStorageSync(KEY) ​

  • 从本地缓存中同步移除指定 key

九、组件(Component) ​

uni-app 组件 Vue 标准组件基本相同,但是也有一点区别,比如:

  • 传统 vue 组件,需创建组件、引用、注册,三个步骤后才能使用组件, easycom 组件模式将其精简为一步
  • easycom 组件规范:
    • 组件需符合 components/组件名称/组件名称.vue 的目录结构
    • 符合以上目录结构的就可不用引用、注册,直接在页面中使用该组件了

image-20240219113828857

组件生命周期 ​

uni-app 组件支持的生命周期,与 Vue 组件的生命周期相同

组件中可以使用页面的生命周期吗?

  • 在 Options API 语法:组件中不支持使用页面生命周期。
  • 在 Composition API 语法:组件中支持页面生命周期,不同端支持情况有差异。

image-20240219114053634

十、Pinia ​

Pinia(发音为 /piːnjʌ/,如英语中的 peenya) 是 Vue 的存储库,它允许跨组件、页面共享状态。

uni-app 内置了 Pinia,使用 HBuilder X 不需要手动安装,直接使用即可

使用 CLI 需要手动安装,执行 yarn add pinia 或 npm install pinia

Pinia 的初体验,步骤如下:

  • 第一步:在 main.js 中安装 Pinia 插件
    • app.use(Pinia.createPinia())
  • 第二步:接着创建一个 store
  • 第三步:然后在组件中就可以直接使用了

image-20240219114221146

image-20240219114236625