当前位置: 首页 > news >正文

uni-app x 跨平台开发框架

目录

uni-app x 是什么

和Flutter对比

uts语言

uvue渲染引擎

组合式API的写法

选项式API写法

页面生命周期

API 

pages.json全局配置文件

总结


uni-app x 是什么

uni-app x,是下一代 uni-app,是一个跨平台应用开发引擎。

uni-app x 是一个庞大的工程,它包括uts语言、uvue渲染引擎、uni的组件和API、以及扩展机制。

uts是一门类ts的、跨平台的、新语言。uts在iOS端编译为swift、在Android端编译为kotlin、在Web端编译为js。

在Android平台,uni-app x 的工程被编译为kotlin代码,本质上是换了vue写法的原生kotlin应用,在性能上与原生kotlin一致。

uni-app x不支持vue2

uts替代的是js,而uvue替代的就是html和css。或者如果你了解flutter的话,也可以理解为uts类似dart,而uvue类似flutter。

和Flutter对比

在过去的跨平台方案中,逻辑层和ui层的通信始终是痛点。

  • 所以在webview渲染时,增加了renderjs、wxs等技术
  • 所以在nvue渲染时,增加了bindingX技术
  • 所以在skyline渲染时,增加了worklet技术

但这些补丁技术都不治根。过去只有flutter解决了dart和ui层的通信问题。可是这套方案又带来2个问题:

  1. dart和原生层通信也还是有延时,对象传递需要序列化,造成性能问题;
  2. 自渲染而不是原生渲染,无可避免会引发混合渲染,比如原生的信息流广告内嵌、原生输入法适配,造成内存高和输入障碍。

其实不管是js还是dart,和原生都有通信桥,功能上没有限制,可以调用各种原生能力,但问题就出在Android上这个通信性能上不去。

既然通信性能不行,那就干脆不通信。

由于uts在Android上被编译为kotlin,它的逻辑层和UI层都是纯原生的,没有通信问题,所以它的性能真正达到了原生水平。因为本质上它就是换了vue写法的原生kotlin应用。

在iOS上,情况要复杂些,这里就不具体讲解,如果有兴趣的小伙伴可以点击这里查看

 

uts语言

uts替代的是js,而uvue替代的就是html和css。或者如果你了解flutter的话,也可以理解为uts类似dart,而uvue类似flutter。

uvue是一套基于uts的、兼容vue语法的、跨平台的、原生渲染引擎。

  • Android版于3.99上线
  • Web版于4.0上线
  • iOS版于4.11上线

uts和ts很相似,但为了跨端,uts进行了一些约束和特定平台的增补。详见 uts语言介绍

例子如下:

// 声明一个string类型的变量
let str :string = "hello"; 
let str1 = 'world';
str = "hello world";
str = str1 as string; // 在不确定类型的时候可以给他一个类型// 声明一个传参是数字类型的,返回是boolean类型的函数
const test = (score: number): boolean => {return (score>=60)
}// 也可以自定义数据类型进行类型规范,比如声明一个Page类型type Page = {name : stringenable ?: booleanurl ?: string.PageURIString}// 总的来说,会TypeScript的,这个是没问题的,两个很相像

 

uvue渲染引擎

uvue支持的是vue3语法,支持组合式API和选项式API。详见vue语法

uvue在App端支持的css语法,是web的子集,类似于但优于nvue的css。仅支持flex布局,但也足以布局出需要的界面。详见css语法

使用该css子集,可保证跨端。如果把uvue页面编译到web平台,则web的其他css也都可以使用。

代码例子:

组合式API的写法

<template><view class="container"><button @click="add">加</button>{{ count }}<button @click="reduce">减</button></view>
</template><script lang="uts" setup>//这里只能写utslet count = ref(1);// 加一const add = () => {count.value++;}// 减一const reduce = () => {count.value++;}</script><style>.container{margin: auto;display: flex;flex-direction: row;align-items: center;}
</style>

选项式API写法

<template><view class="container"><button @click="add">加</button>{{ count }}<button @click="reduce">减</button></view>
</template><script lang="uts">export default {data() {return {count : 1,}},onLoad() {// 页面启动的生命周期,这里编写页面加载时的逻辑console.log('onLoad')},methods: {add : function () {this.count++;},reduce : function () {this.count--;},}}
</script><style>.container{margin: auto;display: flex;flex-direction: row;align-items: center;}
</style>

 

页面生命周期

<template><scroll-view :bounces="false"><view v-for="item in 90">{{ item }}</view></scroll-view>
</template><script setup lang="uts">onLoad((options : OnLoadOptions) => {console.log('onLoad', options)})onPageShow(() => {console.log('onPageShow');})onReady(() => {console.log('onReady');})onPullDownRefresh(() => {console.log('onPullDownRefresh');})onPageScroll((e : OnPageScrollOptions) => {console.log('onPageScroll');})onReachBottom(() => {console.log('onReachBottom');})onBackPress((options : OnBackPressOptions) : boolean | null => {console.log('onBackPress');return null})onPageHide(() => {console.log('onPageHide');})onUnload(() => {console.log('onUnload');})onResize((options : OnResizeOptions) => {console.log('onResize', options)})
</script><style>.container {height: 1200px;}
</style>

 

API 

uni-app x支持的API包括:

  1. uts的API 详见
  2. 全局API,前面不需要加uni.。如getApp、getCurrentPages
  3. uni.xxx的内置API。数量较多,详见
  4. uniCloud.xxx的内置API。详见
  5. dom的API 详见
  6. 原生API

由于 uts 可以直接调用 Android 和 iOS 的 api,所以 OS 和三方sdk的能力都可以在uts中调用。如下:

<script>import Build from 'android.os.Build';export default {onLoad() {console.log(Build.MODEL); //调用原生对象,返回手机型号console.log(uni.getSystemInfoSync().deviceModel); //调用uni API,返回手机型号。与上一行返回值相同}}
</script>

 

pages.json全局配置文件

pages.json 文件是 uni-app x 的页面管理配置文件,决定应用的首页、页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。

所有页面,均需在pages.json中注册,否则不会被打包到应用中。

在HBuilderX中新建页面,默认会在pages.json中自动注册。在HBuilderX中删除页面文件,也会在状态栏提示从pages.json中移除注册。

除了管理页面,pages.json支持对页面进行特殊配置,比如应用首页的tabbar、每个页面的顶部导航栏设置。

但这些uni-app中设计的功能,主要是为了解决页面由webview渲染带来的性能问题,由原生提供一些配置来优化。

uni-app x的app平台,页面不再由webview渲染,其实不需要原生提供特殊配置来优化。但为了开发的便利和多端的统一,也支持了tabbar和导航栏设置。
但不再支持uni-app的app-plus专用配置以及tabbar的midbutton。

如pages.json中配置的导航栏和tabbar功能无法满足你的需求,可以不在pages.json中配置,自己用view做导航栏和tabbar。

例子如下

{"pages": [//pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages{"path": "pages/tabBar/component","style": {"navigationBarTitleText": "内置组件","backgroundColor": "#F8F8F8"}},],"globalStyle": {"pageOrientation": "portrait","navigationBarTitleText": "Hello uniapp x","navigationBarTextStyle": "white","navigationBarBackgroundColor": "#007AFF","backgroundColorContent": "#efeff4","backgroundColor": "#efeff4","backgroundColorTop": "#F4F5F6","backgroundColorBottom": "#F4F5F6"},"tabBar": {"color": "#7A7E83","selectedColor": "#007AFF","borderStyle": "black","backgroundColor": "#F8F8F8","list": [{"pagePath": "pages/tabBar/component","iconPath": "static/component.png","selectedIconPath": "static/componentHL.png","text": "内置组件"},{"pagePath": "pages/tabBar/API","iconPath": "static/api.png","selectedIconPath": "static/apiHL.png","text": "接口"},]},"condition": {//模式配置,仅开发期间生效"current": 0, //当前激活的模式(list 的索引项)"list": [{"name": "", //模式名称"path": "", //启动页面,必选"query": "" //启动参数,在页面的onLoad函数里面得到}]}
}

总结

个人看一遍下来感觉只要会uniapp、vue、TypeScript,可以直接上手直接做,如果有什么不同可以去看官方文档,包看懂的~~

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【vue组件库搭建05】vitePress中使用vue/antd/demo预览组件
  • [Vite]Vite插件生命周期了解
  • Web漏洞扫描工具AppScan与AWVS测评及使用体验
  • 03:Spring MVC
  • vivado CLOCK_REGION、CLOCK_ROOT
  • Linux内核 -- 虚拟化之virtio驱动程序实现
  • VBA打开其他Excel文件
  • 算法day02 回文 罗马数字转整数
  • 从资金管理的角度 谈谈伦敦金投资技巧
  • 在 Azure 云中开始使用适用于 Ubuntu 的 Grafana
  • SpringMVC:SpringMVC执行流程
  • uniApp 封装VUEX
  • 【HarmonyOS NEXT】鸿蒙如何让List组件不满一屏时,还要能滑动和回弹
  • ONLYOFFICE8.1版本桌面编辑器测评
  • 白骑士的C语言教学高级篇 3.5 性能优化
  • [NodeJS] 关于Buffer
  • 4. 路由到控制器 - Laravel从零开始教程
  • docker-consul
  • js作用域和this的理解
  • magento 货币换算
  • Meteor的表单提交:Form
  • Promise面试题2实现异步串行执行
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 半理解系列--Promise的进化史
  • 给初学者:JavaScript 中数组操作注意点
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何进阶一名有竞争力的程序员?
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 事件委托的小应用
  • 首页查询功能的一次实现过程
  • 赢得Docker挑战最佳实践
  • ​iOS安全加固方法及实现
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • (4)Elastix图像配准:3D图像
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (备忘)Java Map 遍历
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (四)模仿学习-完成后台管理页面查询
  • (一) springboot详细介绍
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)可以带来幸福的一本书
  • .form文件_一篇文章学会文件上传
  • .Net 8.0 新的变化
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET 快速重构概要1
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET6 命令行启动及发布单个Exe文件
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET微信公众号开发-2.0创建自定义菜单