diff --git a/docs/api/dialog-page.md b/docs/api/dialog-page.md index 09ae0ee5e814b3f4a2879fd99bf9cc7c9b5aa907..6d342b8c8f10da634a125b25db9d476ffb383b4e 100644 --- a/docs/api/dialog-page.md +++ b/docs/api/dialog-page.md @@ -21,6 +21,7 @@ dialogPage和主page的区别: - dialogPage的背景固定为透明、大小为铺满应用。蒙层由页面内部实现,蒙层颜色、是否响应点击,均由页面内部处理。如果是模态,蒙层不应该允许点击;非模态,则点击蒙层应关闭dialogPage - dialogPage不使用uni.navigatorTo等路由API,而是单独提供了`openDialogPage`和`closeDialogPage` - dialogPage不影响页面栈和路由地址,在getCurrentPages里不能直接得到dialogPage(需在UniPage对象通过getDialogPages获取) +- 因为dialogPage不进入主页面栈,那么`uni.getElementById`是无法获取到dialogPage内的元素的。因为uni这个全局API是获取栈顶元素。如果想获取指定页面的元素,需获取到指定页面的UniPage对象,在这个对象上使用.getElementById方法。如果想获取当前dialogPage页面的元素,应该使用`this.$page.getElementById()`。 - dialogPage在Android上并不是一个activity,而是一个全屏view,它和主page所属同一个activity。 - dialogPage不响应iOS侧滑返回,即disableSwipeBack默认值为true。响应Android的back键和back手势,可通过dialogPage onBackPress生命周期控制是否阻止Android的back键和back手势关闭dialogPage。 - dialogPage默认不影响调用页面或其parentPage的show、hide生命周期。如需影响,比如弹出全屏界面时,需手动设置triggerParentHide diff --git a/docs/api/get-current-pages.md b/docs/api/get-current-pages.md index a6a28757954aa4044b6c6ce681e0f8a082dbbd30..41ecf90219a0ac1d7923f0b2e178346618f0c7c0 100644 --- a/docs/api/get-current-pages.md +++ b/docs/api/get-current-pages.md @@ -6,6 +6,10 @@ HBuilderX 4.31+,强化了页面对象,新增了UniPage对象。getCurrentPag UniPage对象强化了开发者对页面的管理功能,并且支持在uts插件中使用。 +`getCurrentPages()`获取的是主页面栈,不能直接获取[dialogPage](./dialog-page.md)页面。拿到主页面UniPage对象后,可以再通过getDialogPages()方法获取这个主页面的子弹窗页面栈。 + +通过`this.$page`,是另一种快速获取当前页面对象的方式。它得到的不是一个页面数组,而是一个具体的当前页面。并且这种方式支持主页面,也支持dialogPage。 + diff --git a/docs/api/get-element-by-id.md b/docs/api/get-element-by-id.md index 65c1dc5300b56b2f8688b232b856692610fbb4cd..c52f4a4efe01de311cda067a340c0f48f690ced1 100644 --- a/docs/api/get-element-by-id.md +++ b/docs/api/get-element-by-id.md @@ -10,8 +10,9 @@ uni是全局api,本方法获取的元素,是页面栈栈顶(不包括 dial 如需寻找特定页面上的Element,应使用[UniPage对象的getElementById方法](../api/get-current-pages.md#getelementbyid) -如果不确定当前页面是不是在页面栈顶,则推荐使用ref方式,`this.$refs`可以和当前代码调用的页面绑定。\ -与页面绑定的获取元素的方式是`this.$refs`获取的对象再进一步as为element。[详见](../tutorial/idref.md#ref方式) +而获取当前页面对象的方法,则是`this.$page`,这个方式可以获取到dialogPage页面,那么通用的、在当前页面获取UniElement的方式是:`this.$page.getElementById` + +另一种与页面绑定的获取元素的方式是`this.$refs`获取的组件对象再进一步as为element。[详见](../tutorial/idref.md#ref方式) diff --git a/docs/api/get-univerify-manager.md b/docs/api/get-univerify-manager.md index 66181a8bd45df12906eb0b2f02d293786bebae4d..8ba145436d222420f71cb46d20b03eb6e97afb47 100644 --- a/docs/api/get-univerify-manager.md +++ b/docs/api/get-univerify-manager.md @@ -282,7 +282,7 @@ uvue页面放置好上述5个UniElement后,在页面的登录按钮点击事 登录成功后通过`uni.navigateBack()`或`uni.closeDialogPage()`等方式关闭授权页。 hello uni-app x里有完整的自定义登录的示例代码,该示例中: -1. 首先在[预登陆页面](https://gitcode.net/dcloud/hello-uni-app-x/-/blob/alpha/pages/API/get-univerify-manager/get-univerify-manager.uvue)获取运营商返回的4项内容。点击自定义一键登陆后弹出dialogPage,并通过页面地址传参方式,将4项内容传给自定义登录页面。 +1. 首先在[预登陆页面](https://gitcode.net/dcloud/hello-uni-app-x/-/blob/alpha/pages/API/get-univerify-manager/get-univerify-manager.uvue)获取运营商返回的4项内容。点击自定义一键登陆后弹出[dialogPage](./dialog-page.md),并通过页面地址传参方式,将4项内容传给自定义登录页面。实际开发中,你可以使用dialogPage,也可以使用一个普通页面。 2. 在[自定义一键登陆页面](https://gitcode.net/dcloud/hello-uni-app-x/-/blob/alpha/pages/API/get-univerify-manager/univerify-custom-page.uvue),按规范放置合适的UniElement,点击登录后调用`customLogin`方法。登录成功后调用`uni.closeDialogPage()`关闭。 ## Tips diff --git a/docs/tutorial/idref.md b/docs/tutorial/idref.md index a10942349097420e8a18026b521032cf7884d3a4..346ce784a3bda75659e824219d5c38412bab4f8f 100644 --- a/docs/tutorial/idref.md +++ b/docs/tutorial/idref.md @@ -83,9 +83,10 @@ uni-app x提供了[uni.getElementById](../api/get-element.md)等多种方法获 通用的元素操作方法,比如getAttribute、setStyle,在Element上就可以操作。 -获取Element有很多方法,全局方法[uni.getElementById](../api/get-element.md)、[UniPage的getElementById](../api/get-current-pages.md#getelementbyid) - -还可以通过this.refs获取到vue实例然后as为Element。[见下](#ref方式) +获取Element有很多方法, +1. [uni.getElementById](../api/get-element.md)获取栈顶页面的元素(注意无法获取dialogPage页面的元素) +2. [UniPage的getElementById](../api/get-current-pages.md#getelementbyid)获取指定页面的元素。通过`this.$page.getElementById`可以获取当前页面的元素。 +3. 还可以通过this.refs获取到vue实例然后as为Element。[见下](#ref方式) UniVideoElement 继承自 UniElement,拥有video专用的一批方法。 diff --git a/docs/uts/README.md b/docs/uts/README.md index db85dc8fbf1636b77777c6f48cabd27547d05138..84f0f2cada333934d5893a028e7c3f0a68433417 100644 --- a/docs/uts/README.md +++ b/docs/uts/README.md @@ -384,3 +384,44 @@ let a:number = 1 //行尾可以不加分号 let b:boolean = false; //行尾可以加分号 let c:number = 3 ; let d:number = 4 // 同行多语句需要用分号分割 ``` + +## 设计思路@design +uts这门语言不是为了发明中国自己的语言而诞生的,它是为了寻找跨平台开发的最佳方案。 + +跨平台有几种做法: +1. 利用一种各平台都支持的语言,比如js。之前的uni-app就是这么做的。 +2. 把A平台的语言翻译成B、C、D平台的语言。比如kotlin编译为js。 +3. 重新设计一门与各平台无关的语言,独立的规范,较重的运行时。比如dart。还有跨windows、mac、linux的java,也是这种思路。 + +A翻译B、C、D其实是一条不归路。因为这些语言设计之初就是为了服务它自己的平台,所以A、B、C、D有很多无法兼容的设计,没办法顺畅翻译。想走这条路的产品也大多被扔进了垃圾桶。 + +**所以如果开发者期待uts完全兼容ts,那就期待错了。ts直接翻译为kotlin、swift是不现实的** + +而全新语言,又会有几个问题: +1. 较重的运行时,会增大发行包体积、增加内存消耗、减缓运行性能。 +2. 新语言与系统原生语言需要通信,通信耗时会造成性能损失。详见[评测](../select.md) + +而uts的设计,不是上述3种方案中的某个,也完美的规避了上述3个方案的缺点。 + +uts是全面了解ts、kotlin、swift、arkts等不同的语言后,全新设计的一套跨平台语言。 + +它抽象了各个平台语言的共性,保证了跨平台的兼容,比如uts设计了number类型,并且通过编译+运行时的综合方案,在全平台实现了number。 + +同时uts又支持各平台原生语言的所有特性,比如kotlin的int,只不过这些特性的写法需要写条件编译,因为它们无法跨平台。 + +由于编译为平台原生语言,所以uts天生没有跨语言通信成本,也不需要新语言较重的运行时,对包体积、内存占用、运行性能的影响非常小。 + +所以uts被称为最佳的跨平台解决方案。 + +但不容易兼得的是用户的历史习惯,uts在努力照顾ts开发者的习惯,尽可能贴近ts。 +- 只有在编译到浏览器或小程序等js环境时,开发者才能完全使用所有ts特性 +- 编译为kotlin和swift时,开发者需要做好准备,学习uts的跨平台约束 + +## 其他FAQ + +- Q:使用uts,万一uts编译器有bug、干坏事,怎么办? +1. uts发展已经2年了,已经有上千个项目和插件上线,语言虽然还需要继续完善,但本身不存在影响项目发布的bug。 +2. uts编译后的kt、swift代码,都在uni-app x项目的unpackage目录下,开发者都可以看到,可以放心使用。 + +- Q:uts不如js好用 +1. 我们承认js的灵活和易用在所有编程语言里名列前茅。如果你认为基于js的uni-app已经能满足你的跨平台需求那也很好。如果你追求原生的性能体验,那么选择uts虽然需要一定的学习和适应成本,但我们相信这个成本比任何其他方案都低。 \ No newline at end of file