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 : string
    enable ?: boolean
    url ?: 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>
	//这里只能写uts
    let 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.。如getAppgetCurrentPages
  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,可以直接上手直接做,如果有什么不同可以去看官方文档,包看懂的~~

### 如何在 Uni-app Vue3 鸿蒙系统中集成和使用 ECharts #### 安装依赖库 要在Uni-app项目中引入ECharts,首先需要安装`echarts`包。可以通过npm或yarn完成此操作。 ```bash npm install echarts --save ``` 或者 ```bash yarn add echarts ``` 这一步骤确保了项目的node_modules目录下有最新版本的ECharts库文件[^2]。 #### 创建图表组件 创建一个新的Vue单文件组件用于封装ECharts实例。这里假设命名为`MyChart.vue`: ```vue <template> <div ref="chartRef" :style="{ width: '100%', height: '400px' }"></div> </template> <script setup lang="ts"> import { onMounted, ref, watchEffect } from "vue"; // 导入整个 ECharts 库 import * as echarts from "echarts"; const props = defineProps({ option: { type: Object, required: true, }, }); const chartRef = ref<HTMLDivElement | null>(null); onMounted(() => { nextTick().then(() => { const myChart = echarts.init(chartRef.value!); // 使用刚指定的配置项和数据显示图表。 myChart.setOption(props.option); }); }); </script> ``` 上述代码展示了如何初始化并设置ECharts选项,在模板里定义了一个容器用来承载图表,并利用`ref`获取DOM节点以便后续调用ECharts API方法. #### 在页面中使用自定义图表组件 接下来可以在任何其他`.vue`文件中注册并使用这个新创建的图表组件: ```vue <template> <view class="container"> <!-- 引入我们之前做的 MyChart 组件 --> <my-chart :option="barOptions"/> </view> </template> <script setup lang="ts"> import MyChart from "@/components/MyChart.vue"; // 替换成实际路径 import { reactive } from "vue"; const barOptions = reactive({ title: { text: "某地区蒸发量和降水量", subtext: "纯属虚构" }, tooltip: { trigger: "axis" }, legend: { data: ["蒸发量", "降水量"] }, xAxis: [ { type: "category", data: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"] } ], yAxis: [{type: "value"}], series: [ { name: "蒸发量", type: "bar", data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3] }, { name: "降水量", type: "bar", data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3] } ] }); </script> ``` 这段脚本说明了怎样向父级组件传递数据给子组件中的ECharts实例,从而动态更新图表内容. #### 处理鸿蒙环境下的兼容性问题 对于HarmonyOS设备而言,由于其特殊的渲染机制和服务框架结构,可能需要额外处理某些特定场景下的适配工作。比如调整样式以适应不同屏幕尺寸、优化性能表现等。此外还需注意API差异带来的影响,确保所使用的功能均能在目标平台上正常运作[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值