uni-app框架简介

250 阅读3分钟

uni-app 使用vue的语法+小程序的标签和API。

一、开发规范

.vue 文件是一个自定义的文件类型,用类 HTML 语法描述一个 Vue 组件。每个 .vue 文件包含三种类型的顶级语言块 template、script 和 style,还允许添加可选的自定义块。

虽然不推荐使用HTML标签,但实际上如果开发者写了div等标签,在编译到非H5平台时也会被编译器转换为view标签。但为了管理方便、策略统一,新写代码时仍然建议使用view等组件。基于内置的基础组件,可以开发各种扩展组件,组件规范与vue组件相同。

  • 接口能力(JS API)靠近微信小程序规范,但需将前缀 wx 替换为 uni,详见uni-app接口规范
  • 数据绑定及事件处理同 Vue.js 规范,同时补充了App及页面的生命周期
  • 为兼容多端运行,建议使用flex布局进行开发

二、目录结构

Tips:

  • static 目录下的 js 文件不会被编译,如果里面有 es6 的代码,不经过转换直接运行,在手机设备上会报错。
  • css、less/scss 等资源同样不要放在 static 目录下,建议这些公用的资源放在 common 目录下。
  • HbuilderX 1.9.0+ 支持在根目录创建 ext.json sitemap.json 文件。

三、生命周期

1、应用生命周期

Tips:

  • 应用生命周期仅可在App.vue中监听,在其它页面监听无效。

2、页面生命周期

Tips:

  • 避免在 onShow 里使用需要权限的 API(比如 setScreenBrightness() 等需要手机权限), 可能会再次触发onShow造成死循环。

四、路由

开发者需要在pages.json里配置每个路由页面的路径及页面样式。类似小程序在app.json中配置页面路由一样。

Tips:

  • 两种页面路由跳转方式:使用navigator组件跳转、调用API跳转。
  • 页面栈

五、运行环境判断

1、开发环境和生产环境

通过 process.env.NODE_ENV判断,如果你需要自定义更多环境,可以 package.json 中配置,在HBuilderX的运行和发行菜单里会多一个出来。

if(process.env.NODE_ENV === 'development'){
    console.log('开发环境')
}else{
    console.log('生产环境')
}

2、判断平台

场景1:编译期判断——即条件编译,不同平台在编译出包后已经是不同的代码

// #ifdef H5
    alert("只有h5平台才有alert方法")
// #endif

场景2:运行期判断——可使用 uni.getSystemInfoSync().platform 判断客户端环境是 Android、iOS 还是小程序开发工具

switch(uni.getSystemInfoSync().platform){
    case 'android':
       console.log('运行Android上')
       break;
    case 'ios':
       console.log('运行iOS上')
       break;
    default:
       console.log('运行在开发者工具上')
       break;
}

六、页面样式与布局

uni-app 支持的通用 css 单位包括 px、rpx

Tips:

  • 注意 rpx 是和宽度相关的单位,屏幕越宽,该值实际像素越大。如不想根据屏幕宽度缩放,则应该使用 px 单位。

七、<template/><block/>

uni-app 支持在 template 模板中嵌套 <template/><block/>,用来进行列表渲染和条件渲染。

<template/><block/> 并不是一个组件,它们仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性。

<block/> 在不同的平台表现存在一定差异,推荐统一使用 <template/>

<template>
    <view>
        <template v-if="test">
            <view>test 为 true 时显示</view>
        </template>
        <template v-else>
            <view>test 为 false 时显示</view>
        </template>
    </view>
</template>

<template>
    <view>
        <block v-for="(item,index) in list" :key="index">
            <view>{{item}} - {{index}}</view>
        </block>
    </view>
</template>