page.md 6.4 KB
Newer Older
D
DCloud_LXH 已提交
1 2
# 页面简介

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
## 页面简介

uni-app x 项目中,页面文件的后缀名`.uvue`文件。

每个uvue文件,都是一个符合`Vue SFC规范`的 vue 文件。

在 uni-app x 中,后缀名是`.uvue`文件

uni-app x 只有 `.uvue`页面,不支持和vue页面并存(因vue是js驱动、webview渲染,uni-app x在app-Android中没有js引擎,app中渲染是原生渲染,无法使用vue页面)。

当然某些组件可以通过条件编译同时适配uni-app和uni-app x,所以在uni-app x的项目中,看到某些组件代码也有vue文件,但这些vue文件并不在uni-app x项目中生效。

另外uts组件插件的入口文件命名是index.vue。因为uts插件在uni-app和uni-app x中均可使用,所以文件后缀名为vue。\
但这个vue文件并不是真正的页面,它只是uts组件插件为了尽可能照顾开发者习惯而参考vue规范定义的原生组件入口文件。

uni-app x 在app-android上,每个页面都是一个全屏activity,不支持透明。

## 页面管理

### 新建页面

新建页面,默认保存在工程根目录下的`pages`目录下。

每次新建页面,均需在`pages.json`中配置`pages`列表;未在`pages.json -> pages` 中注册的页面,在编译阶段会被忽略。pages.json的完整配置参考:[页面配置](./collocation/pagesjson.md)

通过HBuilderX开发 `uni-app` 项目时,在项目上右键“新建页面”,HBuilderX会自动在`pages.json`中完成页面注册,开发更方便。
<!-- 
同时,HBuilderX 还内置了常用的页面模板,选择这些模板,可以大幅提升开发效率。

<div>
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/pages-add-02.png" style="max-width:450px"></img>
</div>
 -->
新建页面时,可以选择`是否创建同名目录`。创建目录的意义在于:

- 如果你的页面较复杂,需要拆分多个附属的uts、css、组件等文件,则使用目录归纳比较合适。
- 如果只有一个页面文件,大可不必多放一层目录。

### 删除页面

删除页面时,需做两件工作:

- 删除`.uvue`文件
- 删除`pages.json -> pages`列表项中的配置 (如使用HBuilderX删除页面,会在状态栏提醒删除pages.json对应内容,点击后会打开pages.json并定位到相关配置项)

### 页面改名

操作和删除页面同理,依次修改文件和 `pages.json`

### pages.json

pages.json是工程的页面管理配置文件,包括:页面路由注册、页面style参数配置(原生标题栏、下拉刷新...)、首页tabbar等众多功能。

其篇幅较长,另见 [pages.json](./collocation/pagesjson.md)

### 设置应用首页@startpage

`pages.json -> pages`配置项中的第一个页面,作为当前工程的首页(启动页)。

```json
{
	"pages": [
		{
			"path": "pages/index/index", //名字叫不叫index无所谓,位置在第一个,就是首页
			"style": {
				"navigationBarTitleText": "首页" //页面标题
			}
		},
		{
			"path": "pages/my",
			"style": {
				"navigationBarTitleText": "我的"
			}
		},
	]
}
```

## 页面内容构成

uvue页面基于 vue 单文件组件规范。一个页面内,有3个根节点标签:

- 模板区 `<template>`
- 脚本区 `<script>`
- 样式区 `<style>`

```vue
<template>
	<view class="content">
		<button @click="buttonClick">{{title}}</button>
	</view>
</template>

<script setup>
  let title = ref("Hello world") //定义一个响应式变量。类似于选项式的定义data
	const buttonClick = () => { //方法不再需要写在method下面
	  console.log("按钮被点了")
	}
	onReady(() => {
		console.log("页面onReady触发") // 页面生命周期,编写页面加载后的逻辑
	})
</script>

<style>
	.content {
		width: 750rpx;
		background-color: white;
	}
</style>
```

页面内容构成,另有[详细文档](./vue/README.md)
D
DCloud_LXH 已提交
115

D
DCloud_LXH 已提交
116
## 页面生命周期 @lifecycle
D
DCloud_LXH 已提交
117

118 119
<!-- PAGEINSTANCE.lifeCycle.compatibility -->

120 121
示例代码, [详见](./vue/README.md#lifecycle-options)

W
wanganxp 已提交
122
### 页面onLoad生命周期@onload
W
wanganxp 已提交
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150

页面初始化时,会触发onLoad生命周期。此时Dom还未构建渲染完毕(需要等onReady)。

所以onLoad页面常见的用途是开始联网取数,由于联网是异步的,在onLoad发起联网,等到获取到服务器数据后,也就可以更新到data上了。

页面的URL支持参数传递,这个参数也是在onLoad生命周期中获取。

通过uni.navigateTo API 或 `<navigator>`组件,可跳转到目标页面,比如从list页面跳转到detail页面,如下:

```uts
// 发起跳转,并传入post_id参数
uni.navigateTo({
  url: '/pages/template/list-news/detail/detail?post_id=' + post_id
})
```

```uts
// 在detail页面的onLoad中接收URL中传递的参数
export default {
  data() {
    return {
      post_id: ""
    }
  },
  onLoad(event : OnLoadOptions) { // 类型非必填,可自动推导
    this.post_id = event["post_id"] ?? "";
    // 可根据详情页id继续联网请求数据...
  },
D
DCloud_LXH 已提交
151
}
W
wanganxp 已提交
152 153
```

D
DCloud_LXH 已提交
154
::: warning 注意
W
wanganxp 已提交
155 156
- OnLoadOptions类型,可不填。不填时可自动推导。
- OnLoadOptions类型目前在web和Android的运行时类型不统一,web是对象,Android是map。[详见issues](https://issues.dcloud.net.cn/pages/issues/detail?id=967)
D
DCloud_LXH 已提交
157 158
  - 但仍然可以通过上述示例代码跨平台的获取入参。
  - 后续版本会统一类型为UTSJSONObject。
W
wanganxp 已提交
159
- App-iOS平台的窗体动画是异步的,onLoad时可能窗体动画已经开始,此时再设置页面的pageStyle(比如设置背景色),会出现闪烁现象。
D
DCloud_LXH 已提交
160
:::
W
wanganxp 已提交
161

W
wanganxp 已提交
162 163 164 165 166 167 168 169
### 页面onShow生命周期@onshow
onShow是在onLoad之后,它的意义在于,onLoad是页面创建时触发一次;而当页面隐藏(比如被新窗体遮挡),然后页面再恢复显示时,onLoad不会再触发,只会触发onShow。

tabbar页面切换时,老的tabbar页面会hide,新的tabbar页面会show。

onShow和onHide是成对出现的。

在组合式API中,组件可以监听应用和页面的生命周期。但由于应用和页面都有onShow和onHide,导致重名。所以在组合式的组件中监听页面的显示隐藏,改为了onPageShow和onPageHide。
W
wanganxp 已提交
170

D
DCloud_LXH 已提交
171
## 页面及组件生命周期流程图 @lifecycleflow
172

W
wanganxp 已提交
173 174
下图展示了一个新页面,从创建开始,包括其中的组件,完整的时序。

175
![](./static/uni-app-lifecycle-vue3.png)#{.zooming width=1000 margin=auto}
176 177 178


更多页面生命周期的详细介绍,另见 [uni-app文档](https://uniapp.dcloud.net.cn/tutorial/page.html)