diff --git "a/mini/framework/ACSS \350\257\255\346\263\225\345\217\202\350\200\203.md" "b/mini/framework/ACSS \350\257\255\346\263\225\345\217\202\350\200\203.md"
index 6f09cc93c..461f723d3 100644
--- "a/mini/framework/ACSS \350\257\255\346\263\225\345\217\202\350\200\203.md"
+++ "b/mini/framework/ACSS \350\257\255\346\263\225\345\217\202\350\200\203.md"
@@ -1,22 +1,22 @@
-ACSS 是一套样式语言,用于描述 AXML 的组件样式,决定 AXML 的组件的显示效果。
+ACSS 是一套样式语言,用于描述 AXML 的组件样式,决定 AXML 组件的显示效果。
-为适应广大前端开发者,ACSS 和 CSS 规则完全一致,100% 可以用。同时为更适合开发小程序,对 CSS 进行了扩充,ACSS 支持 px,rpx,vh,vw 等单位。
+为适应广大前端开发者,ACSS 和 CSS 规则完全一致,100% 可以用。同时,为更适合开发小程序,对 CSS 进行了扩充,ACSS 支持 `px`,`rpx`,`vh`,`vw` 等单位。
ACSS 已经帮开发者做了不同手机端的样式兼容性处理。
# rpx
-rpx(responsive pixel)可以根据屏幕宽度进行自适应,规定屏幕宽为 750rpx。以 Apple iPhone6 为例,屏幕宽度为 375px,共有 750 个物理像素,则 750 rpx = 375 px = 750 物理像素,1rpx = 0.5 px = 1 物理像素。
+rpx(responsive pixel)是根据屏幕宽度自适应的像素单位,规定屏幕宽为 750rpx。以 Apple iPhone6 为例,屏幕宽度为 375px,共有 750 个物理像素,则 750 rpx = 375 px = 750 物理像素,1 rpx = 0.5 px = 1 物理像素。
-| **设备** | **rpx 换算 px(屏幕宽度 / 750)** | **px 换算 rpx(750 / 屏幕宽度)** |
-| --- | --- | --- |
-| iPhone5 | 1rpx = 0.42px | 1px = 2.34rpx |
-| iPhone6 | 1rpx = 0.5px | 1px = 2rpx |
-| iPhone6 Plus | 1rpx = 0.552px | 1px = 1.81rpx |
+| 设备 | rpx 换算 px(屏幕宽度 / 750) | px 换算 rpx(750 / 屏幕宽度) |
+| ------------ | ----------------------------- | ----------------------------- |
+| iPhone5 | 1 rpx = 0.42 px | 1 px = 2.34 rpx |
+| iPhone6 | 1 rpx = 0.5 px | 1 px = 2 rpx |
+| iPhone6 Plus | 1 rpx = 0.552 px | 1 px = 1.81 rpx |
# 样式导入
-使用 `@import` 语句可以导入外联样式表,`@import` 后需要加上外联样式表相对路径,用`;` 表示结束。
+使用 `@import` 语句可以导入外联样式表,`@import` 后面需要加上外联样式表的相对路径,用分号(`;`)表示结束。
**示例代码**:
@@ -35,14 +35,13 @@ rpx(responsive pixel)可以根据屏幕宽度进行自适应,规定屏幕
}
```
-导入路径支持从 node_modules 目录载入第三方模块,例如 page.acss。
+导入路径支持从 node_modules 目录载入第三方模块,例如 third-party/page.acss。
```css
-@import './button.acss'; /*相对路径*/
-@import '/button.acss'; /*项目绝对路径*/
-@import 'third-party/page.acss'; /*第三方 npm 包路径*/
+@import './button.acss'; /* 相对路径 */
+@import '/button.acss'; /* 项目绝对路径 */
+@import 'third-party/page.acss'; /* 第三方 npm 包路径 */
```
-
# 内联样式
组件上支持使用 `style`、`class` 属性来控制样式。
@@ -52,12 +51,12 @@ rpx(responsive pixel)可以根据屏幕宽度进行自适应,规定屏幕
用于接收动态样式,样式在运行时会进行解析。行内样式不支持 `!important` 优先级规则。
```html
-
+
```
## class 属性
-用于接收静态样式,属性值是样式规则中类选择器名(样式类名)的集合,样式类名不需要带上`.`,多个类名间以空格分隔。请静态样式写进 class 中,避免将静态样式写进 style 中,以免影响渲染速度。
+用于接收静态样式,属性值是样式规则中类选择器名(样式类名)的集合,样式类名不需要带上 `.`,多个类名间以空格分隔。请将静态样式写进 class 中,避免将静态样式写进 style 中,以免影响渲染速度。
```html
@@ -69,17 +68,17 @@ rpx(responsive pixel)可以根据屏幕宽度进行自适应,规定屏幕
**注意**:
-- `.a-`,`.am-` 开头的类选择器为系统组件占用,不可使用。
+- `.a-`、`.am-` 开头的类选择器为系统组件占用,不可使用。
- 不支持属性选择器。
# 全局样式与局部样式
-- app.acss 中的样式为全局样式,作用于每一个页面。
-- 页面文件夹内的 .acss 文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖 app.acss 中相同的选择器。
+- `app.acss` 中的样式为全局样式,作用于每一个页面。
+- 页面文件夹内的 `.acss` 文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖 `app.acss` 中相同的选择器。
# 本地资源引用
-ACSS 文件里的本地资源引用请使用绝对路径的方式,不支持相对路径引用,例如下方示例。
+ACSS 文件里的本地资源引用请使用绝对路径的方式,不支持相对路径引用。例如下方示例。
```css
/* 支持 */
@@ -87,12 +86,11 @@ background-image: url('/images/ant.png');
/* 不支持 */
background-image: url('./images/ant.png');
```
-
# 常见问题
## Q:一个 axml 引用多个自定义组件或 template 模板、include 等,造成样式之间相互影响、样式污染怎么办?
-A:对于基础库小于 2.7.2 的小程序,可使用 class 命名空间处理样式隔离。从基础库版本 2.7.2 开始,可以在自定义组件的 JSON 文件中配置 styleIsolation,避免页面的样式影响到外部。例如:
+A:对于基础库版本小于 `2.7.2` 的小程序,可使用 class 命名空间处理样式隔离。从基础库版本 `2.7.2` 开始,可以在自定义组件的 `JSON` 文件中配置 `styleIsolation`,避免页面的样式影响到外部。例如:
```json
{
@@ -102,12 +100,12 @@ A:对于基础库小于 2.7.2 的小程序,可使用 class 命名空间处
该选项支持以下取值:
-- apply-shared 表示 app.acss 样式以及其他(设置了 shared 的页面和其他自定义组件)的样式将影响到自定义组件,但自定义组件 ACSS 中指定的样式不会影响外部。
-- shared(默认)表示 app.acss 样式以及其他(设置了 shared 的页面和其他自定义组件)的样式将影响到页面,自定义组件 ACSS 中指定的样式也会影响到外部。
+- `apply-shared` 表示 `app.acss` 样式以及其他设置了 `shared` 的页面和其他自定义组件的样式将影响到自定义组件,而自定义组件 `ACSS` 中定义的样式不会影响外部。
+- `shared`(默认)表示 `app.acss` 样式以及其他设置了 `shared` 的页面和其他自定义组件的样式将影响到页面,而自定义组件 `ACSS` 中指定的样式也会影响到外部。
-## Q:设置页面高度 100% 为什么没用?
+## Q:设置页面高度 `100%` 为什么没用?
-A:设置 100%,需要依赖父容器的高度,父容器没有高度那么 100% 就是 0。或者添加绝对定位也可解决,如不添加,会自适应页面的内容。
+A:设置为 `100%` 时,需要依赖父容器的高度。如果父容器没有高度,那么 `100%` 实际上就是 `0`。另外,也可以通过添加绝对定位解决问题。如果不添加绝对定位,页面的高度将会自适应内容的大小。
# 相关文档
diff --git "a/mini/framework/AXML/AXML\344\273\213\347\273\215.md" "b/mini/framework/AXML/AXML\344\273\213\347\273\215.md"
index 160984db0..3842f327d 100644
--- "a/mini/framework/AXML/AXML\344\273\213\347\273\215.md"
+++ "b/mini/framework/AXML/AXML\344\273\213\347\273\215.md"
@@ -1,6 +1,6 @@
[openvideo-axml 介绍](https://gw.alipayobjects.com/v/portal_cjapev/afts/video/A*jrdoTagCX1sAAAAAAAAAAAAAAQAAAQ)
-AXML 是小程序框架设计的一套标签语言,结合基础组件、事件系统,可以构建出小程序页面的结构。AXML 语法可分为五个部分:[数据绑定](https://opendocs.alipay.com/mini/framework/data-binding)、[条件渲染](https://opendocs.alipay.com/mini/framework/conditional-render)、[列表渲染](https://opendocs.alipay.com/mini/framework/list-render)、[模板](https://opendocs.alipay.com/mini/framework/axml-template)、[引用](https://opendocs.alipay.com/mini/framework/import)。
+AXML 是小程序框架设计的一套标签语言,结合基础组件和事件系统,可以构建出小程序页面的结构。AXML 语法可分为五个部分:[数据绑定](https://opendocs.alipay.com/mini/framework/data-binding)、[条件渲染](https://opendocs.alipay.com/mini/framework/conditional-render)、[列表渲染](https://opendocs.alipay.com/mini/framework/list-render)、[模板](https://opendocs.alipay.com/mini/framework/axml-template)、[引用](https://opendocs.alipay.com/mini/framework/import)。
# 数据绑定
@@ -8,7 +8,7 @@ AXML 是小程序框架设计的一套标签语言,结合基础组件、事件
```html
- {{ message }}
+{{ message }}
```
## .js 示例代码
@@ -17,22 +17,21 @@ AXML 是小程序框架设计的一套标签语言,结合基础组件、事件
// page.js
Page({
data: {
- message: 'Hello World',
- },
+ message: 'Hello World'
+ }
});
```
## 效果示例

-
# 列表渲染
## AXML 示例代码
```html
- {{ item }}
+{{item}}
```
## .js 示例代码
@@ -41,15 +40,14 @@ Page({
// page.js
Page({
data: {
- list: [1, 2, 3, 4, 5],
- },
+ list: [1, 2, 3, 4, 5]
+ }
});
```
## 效果示例

-
# 条件渲染
## AXML 示例代码
@@ -75,7 +73,6 @@ Page({
## 效果示例

-
# 模板
## AXML 示例代码
@@ -104,7 +101,7 @@ Page({
deadline: '2022-09-15',
},
taskB: {
- taskDescription: '读完三国演义',
+ taskDescription: '读完《三国演义》',
deadline: '2022-10-15',
},
},
diff --git "a/mini/framework/AXML/\345\210\227\350\241\250\346\270\262\346\237\223.md" "b/mini/framework/AXML/\345\210\227\350\241\250\346\270\262\346\237\223.md"
index cef398206..db0f29629 100644
--- "a/mini/framework/AXML/\345\210\227\350\241\250\346\270\262\346\237\223.md"
+++ "b/mini/framework/AXML/\345\210\227\350\241\250\346\270\262\346\237\223.md"
@@ -1,6 +1,6 @@
# a:for
-在组件上使用 `a:for` 属性可以绑定一个数组,即可使用数组中各项的数据重复渲染该组件。数组当前项的下标变量名默认为 `index`,数组当前项的变量名默认为 `item`。
+在组件上使用 `a:for` 属性可以绑定一个数组,以此使用数组中各项的数据来重复渲染该组件。数组当前项的下标变量名默认为 `index`,数组当前项的变量名默认为 `item`。
```html
{{index}}: {{item.message}}
@@ -21,7 +21,7 @@ Page({
});
```
-使用 `a:for-item` 可以指定数组当前元素的变量名。使用 `a:for-index` 可以指定数组当前下标的变量名。
+通过 `a:for-item` 可以自定义数组当前元素的变量名,`a:for-index` 允许指定数组当前下标的变量名。
```html
@@ -29,7 +29,7 @@ Page({
```
-`a:for` 支持嵌套。 以下是九九乘法表的嵌套示例代码。
+`a:for` 属性支持嵌套使用。下列代码示例展示了一个九九乘法表的嵌套 `a:for` 应用。
```html
@@ -38,7 +38,6 @@ Page({
```
-
# block a:for
与 `block a:if` 类似,可以将 `a:for` 用在 `` 标签上,以渲染一个包含多节点的结构块。
@@ -49,18 +48,17 @@ Page({
{{item}}
```
+# `a:key`
-# a:key
-
-如果列表项位置会动态改变或者有新项目添加到列表中,同时希望列表项保持特征和状态(例如 `` 中的输入内容,`` 的选中状态),需要使用 `a:key` 来指定列表项的唯一标识。 `a:key` 的值以两种形式来提供:
+如果列表项位置会动态改变或者有新项目添加到列表中,同时希望列表项保持特征和状态(例如 `` 中的输入内容,`` 的选中状态),需要使用 `a:key` 来指定列表项的唯一标识。`a:key` 的值以两种形式来提供:
-- 字符串:代表列表项某个属性,属性值需要是列表中唯一的字符串或数字,例如 ID,并且不能动态改变。
-- 保留关键字 `*this`,代表列表项本身,并且它是唯一的字符串或者数字,例如当数据改变触发重新渲染时,会校正带有 `key` 的组件,框架会确保数据重新被排序,而不是重新创建,这可以使组件保持自身状态,提高列表渲染效率。
+- 字符串:代表列表项某个属性,该属性值需要是列表中唯一的字符串或数字,例如 ID,并且不能动态改变。
+- 保留关键字 `*this`,代表列表项本身,并且它是唯一的字符串或者数字。例如,当数据改变触发重新渲染时,带有 `key` 的组件会被框架校正,确保数据重新排序而不是重新创建。这可以让组件保持自身状态,提高列表渲染效率。
**注意**:
-- 如不提供 `a:key`,则会提示 warning。
-- 如果明确知道列表是静态,或者不用关注其顺序,则可以忽略。
+- 如果不提供 `a:key`,则会出现警告提示。
+- 如果明确知道列表是静态的,或者不需要关注其顺序,可以省略 `a:key`。
下面是示例代码:
@@ -77,24 +75,23 @@ Page({
```javascript
Page({
data: {
- list: ['1', '2', '3', '4'],
+ list: ['1', '2', '3', '4']
},
bringToFront(e) {
const { value } = e.target.dataset;
- const list = this.data.list.concat();
+ const list = [...this.data.list];
const index = list.indexOf(value);
if (index !== -1) {
list.splice(index, 1);
list.unshift(value);
this.setData({ list });
}
- },
+ }
});
```
-
# key
-`key` 是比 `a:key` 更通用的写法,里面可以填充任意表达式和字符串。 **注意:** `key` 不能设置在 block 上。下面是示例代码:
+`key` 是比 `a:key` 更通用的写法,里面可以填充任意表达式和字符串。**注意**:`key` 不能设置在 `block` 上。下面是示例代码:
```html
diff --git "a/mini/framework/AXML/\345\274\225\345\205\245 SJS.md" "b/mini/framework/AXML/\345\274\225\345\205\245 SJS.md"
index 844c6a989..02a690a7a 100644
--- "a/mini/framework/AXML/\345\274\225\345\205\245 SJS.md"
+++ "b/mini/framework/AXML/\345\274\225\345\205\245 SJS.md"
@@ -1,4 +1,5 @@
-`import-sjs` 标签用于将 SJS 脚本文件定义的符号引入当前 AXML 文件,并在表达式中使用。更多关于 SJS 的介绍可查看 [SJS 介绍](https://opendocs.alipay.com/mini/framework/sjs)。
+`` 标签用于将 SJS 脚本文件定义的符号引入当前 AXML 文件,并在表达式中使用。了解更多关于 SJS 的信息,请访问 [SJS 介绍](https://opendocs.alipay.com/mini/framework/sjs)。
+
```javascript
// util.sjs
export default {
@@ -6,6 +7,7 @@ export default {
getMsg: x => x,
};
```
+
```html
@@ -13,32 +15,34 @@ export default {
使用函数 {{util.getMsg(msg)}}
```
-通过 `` 标签,只能使用 SJS 通过 `export` 语法导出的符号。并遵循如下规则。
-## 默认导出
-通过 `export default` 导出的 **默认导出** 符号,必须通过 `` 来引入。
`import-sjs` 功能标签的 `name` 属性必须是一个合法的标识符 `/^[A-Za-z_][A-Za-z0-9_]*$/`。
+通过 `` 标签,只能使用 SJS 通过 `export` 语法导出的符号。并遵循以下规则:
+## 默认导出
+通过 `export default` 导出的**默认导出**符号,必须通过 `` 来引入。`import-sjs` 功能标签的 `name` 属性必须是一个合法(满足 `/^[A-Za-z_][A-Za-z0-9_]*$/` 正则规则)的标识符。
## 具名导出
-通过 `export const a` 导出的 **具名** 符号,必须通过 `` 来引入。
`import-sjs` 功能标签的 `name` 属性满足以下规则
+通过 `export const a` 导出的**具名**符号,必须通过 `` 来引入。`import-sjs` 功能标签的 `name` 属性满足以下规则:
-- 是一个 `Object` 字面量表达式
-- `Object` 的 `key` 和 `value` 均是一个 **标识符**
+- 是一个 `Object` 字面量表达式。
+- `Object` 的 `key` 和 `value` 均是一个**标识符**。
以下是一个复杂示例:
+
```javascript
// helper.sjs
export const a = 1;
export function b() { return 2 }
```
+
```html
-
+
{{ c() }}:{{a}}:{{ b }}
{{ 2 }}:{{ 1 }}:{{ undefined }}
```
-需要注意:
+需要注意的是:
-- 如果 `name` 出现 **默认导出** 的同名,会在编译期直接覆盖(即不论 `` 标签的顺序,被覆盖的 _默认导出_ 符号在整个 AXML 中均不可访问)。
-- 如果 `name` 出现 **具名导出** 的同名,会直接抛出编译异常。
+- 如果 `name` 出现**默认导出**的同名,会在编译期直接覆盖(即`` 标签的顺序无关紧要,被覆盖的*默认导出*符号在整个 AXML 中均不可访问)。
+- 如果 `name` 出现**具名导出**的同名,会直接抛出编译异常。
diff --git "a/mini/framework/AXML/\345\274\225\347\224\250.md" "b/mini/framework/AXML/\345\274\225\347\224\250.md"
index d537d2994..730300581 100644
--- "a/mini/framework/AXML/\345\274\225\347\224\250.md"
+++ "b/mini/framework/AXML/\345\274\225\347\224\250.md"
@@ -1,5 +1,4 @@
AXML 提供两种文件引用方式 `import` 和 `include`。
-
# import
`import` 可以加载已经定义好的 `template`。
@@ -13,20 +12,21 @@ AXML 提供两种文件引用方式 `import` 和 `include`。
```
-在 index.axml 中引用 item.axml,就可以使用 `item` 模板。
+在 index.axml 中引用 item.axml 后,可以使用 `item` 模板。
```html
-
+
+
```
-import 有作用域的概念,只会 import 目标文件中定义的 template,而不会 import 目标文件 import 的 template。
+`import` 有作用域的概念,仅会 `import` 目标文件中定义的 `template`,而不会 `import` 目标文件 `import` 的 `template`。
-例如,C import B,B import A,在 C 中可以使用 B 定义的 template,在 B 中可以使用 A 定义的 template,但是 C 不能使用 A 中定义的 template。
+例如,A 中定义了 `template`,B `import` 了 A,在 B 中可以使用 A 定义的 `template`;C `import` 了 B,在 C 中可以使用 B 定义的 `template`,但是不能使用 A 中定义的 `template`。
```html
- A template
+ A template
```
@@ -34,7 +34,7 @@ import 有作用域的概念,只会 import 目标文件中定义的 template
- B template
+ B template
```
@@ -45,7 +45,6 @@ import 有作用域的概念,只会 import 目标文件中定义的 template
```
-
# include
`include` 可以将目标文件除 `` 外整个代码引入,相当于是拷贝到 `include` 位置。
@@ -54,9 +53,9 @@ import 有作用域的概念,只会 import 目标文件中定义的 template
```html
-
+
body
-
+
```
```html
@@ -71,14 +70,14 @@ import 有作用域的概念,只会 import 目标文件中定义的 template
# 引入路径
-模板引入路径支持相对路径、绝对路径,也支持从 node_modules 目录载入第三方模块。
+模板引入路径支持相对路径、绝对路径,也支持从 `node_modules` 目录载入第三方模块。
```html
-
+
-
+
-
+
```
diff --git "a/mini/framework/AXML/\346\225\260\346\215\256\347\273\221\345\256\232.md" "b/mini/framework/AXML/\346\225\260\346\215\256\347\273\221\345\256\232.md"
index 315c49992..c7edfbc34 100644
--- "a/mini/framework/AXML/\346\225\260\346\215\256\347\273\221\345\256\232.md"
+++ "b/mini/framework/AXML/\346\225\260\346\215\256\347\273\221\345\256\232.md"
@@ -5,7 +5,7 @@ AXML 中的动态数据与对应的 `Page` 中 `data` 内容绑定。
数据绑定使用 [Mustache](https://github.com/mustache/mustache.github.com) 语法将变量用两对大括号 `{{}}` 封装,可在多种语法场景下使用。
```html
- {{ message }}
+{{ message }}
```
```javascript
@@ -21,7 +21,7 @@ Page({
组件属性需使用双引号 `""` 封装。
```html
-
+
```
```javascript
@@ -31,7 +31,6 @@ Page({
},
});
```
-
## 控制属性
控制属性需使用双引号 `""` 封装。
@@ -44,7 +43,7 @@ Page({
Page({
data: {
condition: true,
- },
+ }
});
```
@@ -52,15 +51,14 @@ Page({
关键字需使用双引号封装 `""`。
-- true:Boolean 类型的 true,代表真值。
-- false:Boolean 类型的 false,代表假值。
+- `true`:Boolean 类型的 true,代表真值。
+- `false`:Boolean 类型的 false,代表假值。
```html
```
-**注意**: 不要直接写 `checked="false"`,计算结果是一个字符串,转成布尔值类型后代表真值。
-
+**注意**:不要直接写 `checked="false"`,计算结果是一个字符串,转成布尔值类型后代表真值。
# 运算
可用两对大括号 `{{}}` 封装简单的运算。支持如下几种方式。
@@ -71,7 +69,7 @@ Page({
Hidden
```
-## 算数运算
+## 算术运算
```html
{{a + b}} + {{c}} + d
@@ -82,23 +80,22 @@ Page({
data: {
a: 1,
b: 2,
- c: 3,
- },
+ c: 3
+ }
});
```
-页面输出: `3 + 3 + d`
+页面输出:`3 + 3 + d`
## 逻辑判断
```html
-
+
```
-
## 字符串运算
```html
-{{"hello" + name}}
+{{ "hello" + name }}
```
```javascript
@@ -112,7 +109,7 @@ Page({
## 数据路径运算
```html
-{{object.key}} {{array[0]}}
+{{ object.key }} {{ array[0] }}
```
```javascript
@@ -125,7 +122,6 @@ Page({
},
});
```
-
# 组合
可在 Mustache 语法内直接进行组合,构成新的对象或者数组。
@@ -139,8 +135,8 @@ Page({
```javascript
Page({
data: {
- zero: 0,
- },
+ zero: 0
+ }
});
```
@@ -161,7 +157,7 @@ Page({
});
```
-最终组合成的对象是 `{foo: 1, bar: 2}`。也可用解构运算符 `...` 来将一个对象展开:
+最终组合成的对象是 `{foo: 1, bar: 2}`。也可以使用解构运算符 `...` 来展开一个对象:
```html
@@ -182,7 +178,7 @@ Page({
});
```
-最终组合成的对象是 `{a: 1, b: 2, c: 3, d: 4, e: 5}`。如果对象 key 和 value 相同,也可以间接地表达。
+最终组合成的对象是 `{a: 1, b: 2, c: 3, d: 4, e: 5}`。如果对象的键(key)和值(value)相同,也可以省略值的部分,简写为键名:
```html
@@ -197,7 +193,7 @@ Page({
});
```
-最终组合成的对象是 `{foo: 'my-foo', bar:'my-bar'}`。 **注意:**上面的方式可以随意组合,但是变量名相同时,后边的变量会覆盖前面的变量,例如:
+最终组合成的对象是 `{foo: 'my-foo', bar: 'my-bar'}`。**注意**:上述方法可以任意组合。但是,如果变量名相同,后面的变量会覆盖前面的变量的值。例如:
```html
@@ -219,13 +215,12 @@ Page({
});
```
-最终组合成的对象是 `{a: 5, b: 3, c: 6}`。
-
+最终合并后的对象是 `{a: 5, b: 3, c: 6}`。
# 常见问题
-## Q:跳转页面时,如何清除 data 数据中的数据?
+## Q:跳转页面时,如何清除 `data` 数据中的数据?
-A:无法清除,可以在跳转时覆盖之前的 data 值。
+A:无法清除,可以在跳转时覆盖之前的 `data` 值。
# 相关文档
diff --git "a/mini/framework/AXML/\346\235\241\344\273\266\346\270\262\346\237\223.md" "b/mini/framework/AXML/\346\235\241\344\273\266\346\270\262\346\237\223.md"
index dd247a8a1..493410b51 100644
--- "a/mini/framework/AXML/\346\235\241\344\273\266\346\270\262\346\237\223.md"
+++ "b/mini/framework/AXML/\346\235\241\344\273\266\346\270\262\346\237\223.md"
@@ -3,36 +3,36 @@
在框架中,使用 `a:if="{{condition}}"` 来判断是否需要渲染该代码块。
```html
- True
+True
```
-也可以使用 `a:elif` 和 `a:else` 添加一个 **else** 块。
+也可以使用 `a:elif` 和 `a:else` 添加一个 `else` 块。
```html
- 1
- 2
- 3
+1
+2
+3
```
# block a:if
-因为 `a:if` 是控制属性,需要在标签中使用。如果要一次性判断多个组件标签,可以使用 `` 标签包装多个组件,并使用 `a:if` 来控制属性。
+因为 `a:if` 是控制属性,需要在标签中使用。如果需要一次性判断多个组件标签,可以使用 `` 标签包装这些组件,并使用 `a:if` 作为控制属性。
```html
- view1
- view2
+ view1
+ view2
```
-**说明**:`` 并不是一个组件,只是一个包装元素,不会在页面中做任何渲染,只接受控制属性。
+**说明**:`` 并不是一个组件,它只是一个包装元素,不会在页面中进行渲染,仅接受控制属性。
# 对比 a:if 与 hidden
-- `a:if` 中的模板可能包含数据绑定,所以当 `a:if` 的条件值切换时,框架有局部渲染的过程,用于确保条件块在切换时销毁或重新渲染。此外, `a:if` 在初始渲染条件为 false 时,不触发任何渲染动作,当条件第一次变成 true 时才开始局部渲染。
-- `hidden` 控制显示与隐藏,组件始终会被渲染。
+- 使用 `a:if` 时,因其内部可能包含数据绑定,所以当条件值变化时,框架会进行局部渲染,确保条件块在切换时能够销毁或重新渲染。此外,当 `a:if` 初始条件为 `false` 时不会进行渲染,仅在条件首次变为 `true` 时开始局部渲染。
+- `hidden` 属性用于控制显示和隐藏,但组件始终会被渲染。
-一般来说,`a:if` 有更高的切换消耗而 `hidden` 有更高的初始渲染消耗。因此,在需要频繁切换的情景下,用 `hidden` 更好。如果在运行时条件改变不多则 `a:if` 较好。
+通常情况下,`a:if` 在切换时的消耗更大,而 `hidden` 在初始渲染时的消耗更大。因此,在需要频繁切换的场景中更适合使用 `hidden`,而在条件变化不频繁的运行时,`a:if` 更为合适。
# 相关文档
diff --git "a/mini/framework/AXML/\346\250\241\346\235\277.md" "b/mini/framework/AXML/\346\250\241\346\235\277.md"
index bbc94996e..12aaa35c1 100644
--- "a/mini/framework/AXML/\346\250\241\346\235\277.md"
+++ "b/mini/framework/AXML/\346\250\241\346\235\277.md"
@@ -1,14 +1,14 @@
-AXML 提供模板 `template`,可以在模板中定义代码片段,然后在不同地方调用。 建议使用 `template` 方式引入模板片段,因为 `template` 会指定其作用域,只使用 `data` 传入的数据,如果 `template` 的 `data` 没有改变,该片段 UI 不会重新渲染。
+AXML 提供模板 `template`,可以在模板中定义代码片段,然后在不同地方调用。建议使用 `template` 方式引入模板片段,因为 `template` 会指定其作用域,只使用 `data` 传入的数据;如果 `template` 的 `data` 没有改变,该片段 UI 不会重新渲染。
# 定义模板
-使用 name 属性申明模板名,然后在 `` 内定义代码片段。
+使用 `name` 属性申明模板名,然后在 `` 内定义代码片段。
```html
-
@@ -17,10 +17,9 @@ AXML 提供模板 `template`,可以在模板中定义代码片段,然后在
```
-
# 使用模板
-使用 **is** 属性,声明需要的模板,然后将需要的 **data** 传入,例如:
+使用 `is` 属性声明需要的模板,然后将需要的 `data` 传入,比如:
```html
@@ -32,26 +31,27 @@ Page({
item: {
index: 0,
msg: 'this is a template',
- time: '2019-04-19',
- },
- },
+ time: '2019-04-19'
+ }
+ }
});
```
-`is` 属性可以使用 Mustache 语法,来动态决定具体渲染哪个模板。
+`is` 属性可以利用 Mustache 语法动态决定具体渲染哪个模板。
-```javascript
+```html
odd
+
even
+
-
+
```
-
# 模板作用域
模板有其作用域,只能使用 `data` 传入的数据。除了直接由 `data` 传入数据外,也可以通过 onXX 事件绑定页面逻辑进行函数处理。如下代码所示:
@@ -71,8 +71,8 @@ Page({
```html
-
-
+
+
```
```javascript
@@ -81,15 +81,16 @@ Page({
item: {
index: 0,
msg: 'this is a template',
- time: '2019-04-22',
- },
+ time: '2019-04-22'
+ }
},
onClickButton(e) {
console.log('button clicked', e);
- },
+ }
});
```
+
# 相关文档
- [引用](https://opendocs.alipay.com/mini/framework/import)
diff --git "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/SJS \344\273\213\347\273\215.md" "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/SJS \344\273\213\347\273\215.md"
index 914af11a8..3400cfc69 100644
--- "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/SJS \344\273\213\347\273\215.md"
+++ "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/SJS \344\273\213\347\273\215.md"
@@ -1,9 +1,9 @@
-SJS(Safe/Subset JavaScript)是小程序定义的一套脚本语言,由它导出的变量/函数可以 [在 `AXML` 中使用](https://opendocs.alipay.com/mini/framework/import-sjs)。
+SJS(Safe/Subset JavaScript)是小程序定义的一套脚本语言,由它导出的变量/函数可以[在 AXML 中使用](https://opendocs.alipay.com/mini/framework/import-sjs)。
## 语言概述
**语法定义**
-SJS 是 JavaScript 语言的子集,并不等同于 JavaScript。具体可参考:
+SJS 是 JavaScript 语言的子集,并不等同于 JavaScript。具体可参考以下链接:
- [变量](https://opendocs.alipay.com/mini/framework/sjs-variable)
- [数据类型](https://opendocs.alipay.com/mini/framework/datatype)
- [运算符](https://opendocs.alipay.com/mini/framework/operator)
@@ -11,16 +11,12 @@ SJS 是 JavaScript 语言的子集,并不等同于 JavaScript。具体可参
- [基础类库](https://opendocs.alipay.com/mini/framework/basic-library)
**模块管理**
-- SJS 文件的扩展名必须为 `.sjs`,每个 .sjs 文件为一个模块,使用 export 导出变量和函数,使用 import 引入依赖的其他 SJS 模块。
-- SJS 也可引用 npm 包,但只能引用其中的 .sjs 文件。
+- SJS 文件的扩展名必须为 `.sjs`。每个 `.sjs` 文件为一个模块,使用 `export` 导出变量和函数,使用 `import` 引入依赖的其他 SJS 模块。
+- SJS 还可以引用 npm 包,但只能引用其中的 `.sjs` 文件。
**运行环境**
-- SJS 运行在小程序渲染层,与小程序的 JavaScript 运行环境(逻辑层)隔离,因而不能调用 JS 文件中定义的函数,也不能调用小程序提供的 API。
-- SJS 中定义的函数可用于响应基础组件的事件以避免逻辑层和渲染层的频繁通信,但有一定的限制,详见 [SJS 响应事件](https://opendocs.alipay.com/mini/01og7z)。
-
-
-## 使用示例
-
+- SJS 运行在小程序渲染层,与小程序的 JavaScript 运行环境(逻辑层)隔离。因此它不能调用 JS 文件中定义的函数,也不能调用小程序提供的 API。
+- SJS 中定义的函数可以用于响应基础组件的事件,以避免逻辑层和渲染层的频繁通信。但是,这样做有一定的限制,具体详情请查看[SJS 响应事件](https://opendocs.alipay.com/mini/01og7z)。
```javascript
// pages/index/foo.sjs
@@ -48,8 +44,8 @@ export const y = 4 + five;
Page({
data: {
message: 'hello javascript',
- value: 3.14159,
- },
+ value: 3.14159
+ }
});
```
diff --git "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/SJS \345\223\215\345\272\224\344\272\213\344\273\266.md" "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/SJS \345\223\215\345\272\224\344\272\213\344\273\266.md"
index 8debb09d9..3752f4963 100644
--- "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/SJS \345\223\215\345\272\224\344\272\213\344\273\266.md"
+++ "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/SJS \345\223\215\345\272\224\344\272\213\344\273\266.md"
@@ -1,40 +1,39 @@
# 简介
-复杂的交互场景下,如果通过 setData 去更新视图,体验上较为卡顿。例如,要实现元素跟随用户手指拖动而移动的效果,需要经过如下响应过程:
+在复杂的交互场景下,如果通过 `setData` 去更新视图,体验上可能会比较卡顿。例如,想要实现元素跟随用户手指拖动而移动的效果,需要经过如下响应流程:
-1. 用户手指移动,触发基础组件的 touchMove 事件,web-view 将该事件通信到 worker。
-2. worker 执行该事件回调,并 setData 更新数据。
-3. web-view 收到数据更新信息,进而改变元素样式,实现元素移动。
+1. 用户手指移动,触发基础组件的 `touchMove` 事件,`web-view` 将该事件通信到 `worker`。
+2. `worker` 执行该事件回调,并通过 `setData` 更新数据。
+3. `web-view` 收到数据更新信息,然后改变元素样式,实现元素移动。
-上述过程中,web-view 和 worker 之间的来回通信耗时较大,不满足高性能和极速响应的要求。因此,要支持此种富交互场景,必须减少通信次数,允许在 web-view 侧直接响应事件。SJS 函数支持响应基础组件的事件,无需数据更新,可直接驱动视图元素的样式、类名等的变更,也可查询元素的布局信息等。
+上述过程中,`web-view` 和 `worker` 之间的通信耗时较大,并不能满足对高性能和极速响应的要求。因此,要支持此类富交互场景,我们需要减少通信次数,允许在 `web-view` 侧直接响应事件。SJS 函数支持响应基础组件的事件,无需数据更新,就可以直接驱动视图元素的样式、类名等变更,也可以查询元素的布局信息等。
# 使用限制
-- 不支持响应原生组件(如 map)和用户自定义组件的事件。
-- 响应事件能力依赖基础库 [2.6.7](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 或更高版本。若版本较低,建议采取 [兼容处理](https://opendocs.alipay.com/mini/framework/compatibility)。
-- `>>>` 选择器依赖基础库 **2.7.3** 或更高版本。若版本较低,建议采取 **兼容处理**。
-- 属性监听能力依赖基础库 **2.7.7** 或更高版本。若版本较低,建议采取 **兼容处理**。
+- 不支持响应原生组件(如 `map`)和用户自定义组件的事件。
+- 响应事件的能力依赖基础库 [2.6.7](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 或更高版本。如果基础库版本较低,建议采取 [兼容处理](https://opendocs.alipay.com/mini/framework/compatibility)。
+- `>>>` 选择器依赖基础库 **2.7.3** 或更高版本。如果版本较低,建议采取 **兼容处理**。
+- 属性监听的能力依赖基础库 **2.7.7** 或更高版本。如果版本较低,建议采取 **兼容处理**。
## selector 语法
-selector 类似于 CSS 的选择器,但仅支持下列语法。
+`selector` 类似于 CSS 的选择器,但只支持以下语法:
-- ID 选择器:#the-id。
-- class 选择器(可以连续指定多个):.a-class.another-class。
-- 子元素选择器:.the-parent > .the-child。
-- 后代选择器:.the-ancestor .the-descendant。
-- 跨自定义组件的后代选择器:.the-ancestor >>> .the-descendant(基础库 [2.7.3](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持)。
-- 多选择器的并集:#a-node, .some-other-nodes。
+- ID 选择器:`#the-id`。
+- class 选择器(可以连续指定多个):`.a-class.another-class`。
+- 子元素选择器:`.the-parent > .the-child`。
+- 后代选择器:`.the-ancestor .the-descendant`。
+- 跨自定义组件的后代选择器:`.the-ancestor >>> .the-descendant`(基础库 [2.7.3](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持)。
+- 多选择器的并集:`#a-node, .some-other-nodes`。
-判定 `>>>` 选择器是否可用,可通过如下方法查询:
+判断 `>>>` 选择器是否可用,可以通过以下代码查询:
```javascript
my.canIUse('sjs.event.selector.deep');
```
-
# 示例代码
-在 .sjs 文件中定义函数:
+在 `.sjs` 文件中定义函数:
```javascript
// index.sjs
@@ -44,7 +43,7 @@ function handleEvent(event, ownerComponent) {
'font-size': '28rpx',
});
// 不往上冒泡,相当于同时调用了
- // event.stopPropagation() 和
+ // event.stopPropagation() 和
// event.preventDefault()
return false;
}
@@ -59,7 +58,7 @@ export default {
};
```
-接着,可以在 .axml 中使用回调:
+接着,可以在 `.axml` 中使用这些回调:
```html
@@ -69,76 +68,77 @@ export default {
onTouchStart="{{sjs.handleEvent}}"
>
```
-
# 使用方法
## 事件回调
### 入参
-接受两个参数:
-| **参数** | **描述** |
-| --- | --- |
-| event | [事件对象](https://opendocs.alipay.com/mini/framework/event-object),额外地还提供了如下属性:
- instance: event.currentTarget 基础组件的 Descriptor 描述对象。
- preventDefault():允许阻止原生事件的默认行为。
stopPropagation():行为等同于使用 catch\* 事件回调。
composedPath():获取事件路径,基础库 [2.7.3](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2)起支持。 |
-| ownerComponent | 基础组件所在自定义组件/页面的 Descriptor 描述对象。 |
+接受两个参数:
+
+| 参数 | 描述 |
+| -------------- | ---------------------------------------------------------------------------------------------------- |
+| event | [事件对象](https://opendocs.alipay.com/mini/framework/event-object),额外地还提供了如下属性:
1. instance:event.currentTarget 基础组件的 Descriptor 描述对象。
2. preventDefault():允许阻止原生事件的默认行为。
stopPropagation():行为等同于使用 catch* 事件回调。
composedPath():获取事件路径,基础库 [2.7.3](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持。 |
+| ownerComponent | 基础组件所在自定义组件/页面的 Descriptor 描述对象。 |
#### 1. event.preventDefault()
+
**Native 渲染引擎**:暂不支持。
-对于限定的以下事件:
+
+对于限定的以下事件:
- touchStart
- touchMove
- touchEnd
- touchCancel
-可以通过 event.preventDefault() 阻止 web-view 中的事件默认行为。其它事件(如 tap 等)调用此方法无效。
+可以通过 event.preventDefault() 阻止 web-view 中的事件默认行为。其他事件(如 tap 等)调用此方法无效。
#### 2. event.stopPropagation()
-阻止该事件继续向父基础组件触发。等同于使用了 catch\* 事件回调。
+阻止该事件继续向父基础组件触发。等同于使用了 catch* 事件回调。
#### 3. 自定义组件/页面 Descriptor 描述对象
SJS 函数的第二个参数 ownerComponent 指向该事件 event.currentTarget 所在的自定义组件/页面的 Descriptor 对象,具有如下方法:
-| **方法** | **参数** | **描述** |**渲染引擎兼容性** |
-| --- | --- | --- |------ |
+| 方法 | 参数 | 描述 | 渲染引擎兼容性 |
+| ---------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------ | ---------------- |
| selectComponent | selector | 选择该自定义组件/页面/基础组件的匹配指定选择器的后代基础组件的 Descriptor 描述对象。selector 选择器字符串。插槽能被提供者选中,而不能被使用者选中。 |仅 WebView |
| selectAllComponents | selector | 选择该自定义组件/页面/基础组件的匹配指定选择器的所有后代基础组件的 Descriptor 描述对象。selector 选择器字符串。插槽能被提供者选中,而不能被使用者选中。 |仅 WebView |
-| getState | - | 获取其状态对象。当有局部变量需要存储起来后续使用的时候使用此方法。 |- |
-| callMethod | (method, arg) | 调用 worker 侧所在自定义组件/页面的自定义方法。
- method 方法名称。
- arg 方法传参。
|- |
-| requestAnimationFrame | fn | 同浏览器平台,仅能被同 Descriptor 对象的 cancelAnimationFrame 取消。返回该请求对应的标识符(可用于取消)。fn 回调函数。 |仅 WebView |
-| cancelAnimationFrame | id | 取消指定的 `requestAnimationFrame`。仅能取消由该 Descriptor 自己发起的。id 标识符(`requestAnimationFrame` 返回值)。 |仅 WebView |
-| selectOwnerComponent | - | 获取父自定义组件的 Descriptor 描述对象。使用插件时,宿主小程序内的对象会跳过选择属于插件的父自定义组件,插件内的对象也会跳过选择属于宿主小程序的父自定义组件。
基础库 [2.7.3](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持。 |仅 WebView|
-| setTimeout | (fn, timeout) | 同浏览器平台,仅能被同 Descriptor 对象的 clearTimeout 取消,返回该请求对应的标识符(可用于取消)。
- fn 回调函数。
- timeout 超时时间。
|- |
-| clearTimeout | id | 取消指定的 `setTimeout`。仅能取消由该 Descriptor 自己发起的。id 标识符(`setTimeout` 返回值)。 |- |
-
+| getState | - | 获取状态对象。当有局部变量需要存储起来后续使用时,使用此方法。 | - |
+| callMethod | (method, arg) | 调用 worker 侧所在自定义组件/页面的自定义方法。
1. method 方法名称。
2. arg 方法传参。 | - |
+| requestAnimationFrame | fn | 同浏览器平台,仅能被同 Descriptor 对象的 cancelAnimationFrame 取消。返回该请求对应的标识符(可用于取消)。fn 为回调函数。 | 仅 WebView |
+| cancelAnimationFrame | id | 取消指定的 `requestAnimationFrame`。仅能取消由该 Descriptor 自己发起的。id 为 `requestAnimationFrame` 返回的标识符。 | 仅 WebView |
+| selectOwnerComponent | - | 获取父自定义组件的 Descriptor 描述对象。使用插件时,会跳过选择属于插件的父自定义组件,也会跳过选择属于宿主小程序的父自定义组件。
支持基础库 [2.7.3](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起。 | 仅 WebView |
+| setTimeout | (fn, timeout) | 同浏览器平台,仅能由同 Descriptor 对象的 clearTimeout 取消,返回该请求对应的标识符(可用于取消)。
1. fn 为回调函数。
2. timeout 为超时时间。 | - |
+| clearTimeout | id | 取消指定的 `setTimeout`。仅能取消由该 Descriptor 自己发起的。id 为 `setTimeout` 返回的标识符。 | - |
#### 4. 基础组件 Descriptor 描述对象
-通过 event.instance 可以获得 event.currentTarget 的 Descriptor 描述对象,除了上述自定义组件/页面的方法外,还具有如下方法:
+通过 `event.instance` 可以获得 `event.currentTarget` 的 Descriptor 描述对象,除了上述自定义组件/页面的方法外,还具有如下方法:
-| **方法** | **参数** | **描述** |**渲染引擎兼容性** |
-| --- | --- | --- |----- |
-| getComputedStyle | props | 获得相应计算样式值的键值对象。props 指定样式属性名的字符串数组。 | 仅 WebView |
-| getBoundingClientRect | - | 同浏览器平台。 | 仅 WebView |
-| getDataset | - | 获取基础组件的 dataset。与 `event.currentTarget.dataset` 一致。 | - |
-| hasClass | className | 判定是否具有指定样式名。不允许探测 a-\* 开头的样式名。className 样式名字符串。 | - |
-| addClass | (...classNames) | 添加指定样式名(可多个),不允许添加 a-\* 开头的样式名。 | - |
-| removeClass | (...classNames) | 移除指定样式名(可多个),不允许移除 a-\* 开头的样式名。 | - |
-| setStyle | style | 添加指定的行内样式。支持 rpx。设置的样式优先级比组件 axml 里面定义的样式高。每次调用都会覆盖上一次的调用。
style 样式字符串或键值对象。 | - |
-| getDOMProperty | properties | properties 基础元素的 DOM 属性名数组。
基础库 [2.7.4](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持。获取基础元素的 DOM 属性。支持的属性如下:
| 仅 WebView |
-| setDOMProperty | properties | properties 基础元素的 DOM 属性对象。
基础库 **2.7.4** 起支持。设置基础元素的 DOM 属性。支持的属性如下:
| 仅 WebView |
+| 方法 | 参数 | 描述 | 渲染引擎兼容性 |
+| --- | --- | --- | ----- |
+| `getComputedStyle` | `props` | 获得相应计算样式值的键值对象。`props` 指定样式属性名的字符串数组。 | 仅 WebView |
+| `getBoundingClientRect` | - | 同浏览器平台。 | 仅 WebView |
+| `getDataset` | - | 获取基础组件的 `dataset`。与 `event.currentTarget.dataset` 一致。 | - |
+| `hasClass` | `className` | 判定是否具有指定样式名。不允许探测以 `a-*` 开头的样式名。`className` 为样式名字符串。 | - |
+| `addClass` | `(...classNames)` | 添加指定样式名(可多个),不允许添加以 `a-*` 开头的样式名。 | - |
+| `removeClass` | `(...classNames)` | 移除指定样式名(可多个),不允许移除以 `a-*` 开头的样式名。 | - |
+| `setStyle` | `style` | 添加指定的行内样式。支持 `rpx`。设置的样式优先级比组件 `axml` 里面定义的样式高。每次调用都会覆盖上一次的调用。
`style` 为样式字符串或键值对象。 | - |
+| `getDOMProperty` | `properties` | `properties` 为基础元素的 DOM 属性名数组。
基础库 2.7.4 起支持。获取基础元素的 DOM 属性。支持的属性如下:
| 仅 WebView |
+| `setDOMProperty` | `properties` | `properties` 为基础元素的 DOM 属性对象。
基础库 2.7.4 起支持。设置基础元素的 DOM 属性。支持的属性如下:
| 仅 WebView |
-#### 5. composedPath()
+#### 5. `composedPath()`
基础库 [2.7.3](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持,获取事件路径。返回值为数组,数组的元素为基础元素的 Descriptor 描述对象。使用插件时,宿主小程序内的事件路径会跳过属于插件的描述对象,插件内的事件路径也会跳过属于宿主小程序的描述对象。
### 返回值
-当 SJS 函数返回布尔值 false 时,等同于同时调用:
+当 SJS 函数返回布尔值 `false` 时,等同于同时调用:
-- event.preventDefault()
-- event.stopPropagation()
+- `event.preventDefault()`
+- `event.stopPropagation()`
## 属性监听
@@ -148,11 +148,11 @@ SJS 函数的第二个参数 ownerComponent 指向该事件 event.currentTarget
接受四个参数:
-| **参数** | **描述** |
-| -------------- | --------------------------------------------------- |
-| newValue | 被监听属性的新值。 |
-| oldValue | 被监听属性的旧值。 |
-| ownerComponent | 基础组件所在自定义组件/页面的 Descriptor 描述对象。 |
-| instance | 基础组件的 Descriptor 描述对象。 |
+| 参数 | 描述 |
+| --- | --- |
+| `newValue` | 被监听属性的新值。 |
+| `oldValue` | 被监听属性的旧值。 |
+| `ownerComponent` | 基础组件所在自定义组件/页面的 Descriptor 描述对象。 |
+| `instance` | 基础组件的 Descriptor 描述对象。 |
基础组件初始化时会立即回调一次监听函数。当被监听属性值更新后,即新旧值不相等时,会再次触发回调。
diff --git "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/esnext.md" "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/esnext.md"
index d7a0011d4..4c84743a3 100644
--- "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/esnext.md"
+++ "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/esnext.md"
@@ -2,21 +2,21 @@ SJS 支持部分 ES6 语法。
# let & const
-```JavaScript
-function test(){
+```javascript
+function test() {
let a = 5;
if (true) {
let b = 6;
}
console.log(a); // 5
- console.log(b); // 引用错误:b 未定义
+ console.log(b); // ReferenceError: b is not defined 引用错误:b 未定义
}
```
# 箭头函数
-```JavaScript
-const a = [1,2,3];
+```javascript
+const a = [1, 2, 3];
const double = x => x * 2; // 箭头函数
console.log(a.map(double));
var bob = {
@@ -35,14 +35,14 @@ console.log(bob.printFriends());
```JavaScript
var handler = 1;
var obj = {
- handler, // 对象属性
- toString() { // 对象方法
- return "string";
+ handler, // 对象属性,变量名与属性名相同时可以省略属性名
+ toString() { // 对象方法,使用简洁语法定义
+ return "string";
},
};
```
-**注意**:不支持 super 关键字,不能在对象方法中使用 super。
+**注意**:不支持 `super` 关键字,不能在对象方法中使用 `super`。
# 模板字符串(template string)
@@ -51,29 +51,35 @@ const h = 'hello';
const msg = `${h} alipay`;
```
+**说明**:使用模板字符串,可以在字符串中嵌入变量。使用反引号(``)包裹字符串,并在变量名前添加美元符号($)和大括号({})。
# 解构赋值(Destructuring)
```JavaScript
-// array 解构赋值
-var [a, ,b] = [1,2,3];
+// 数组解构赋值
+var [a, , b] = [1, 2, 3];
a === 1;
b === 3;
+
// 对象解构赋值
var { op: a, lhs: { op: b }, rhs: c }
= getASTNode();
+
// 对象解构赋值简写
-var {op, lhs, rhs} = getASTNode();
+var { op, lhs, rhs } = getASTNode();
+
// 函数参数解构赋值
-function g({name: x}) {
+function g({ name: x }) {
console.log(x);
}
-g({name: 5});
+g({ name: 5 });
+
// 解构赋值默认值
var [a = 1] = [];
a === 1;
-// 函数参数:解构赋值 + 默认值
-function r({x, y, w = 10, h = 10}) {
+
+// 函数参数解构赋值加默认值
+function r({ x, y, w = 10, h = 10 }) {
return x + y + w + h;
}
-r({x:1, y:2}) === 23;
+r({ x: 1, y: 2 }) === 23;
```
diff --git "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\345\217\230\351\207\217.md" "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\345\217\230\351\207\217.md"
index 7b1fca169..0953e7f08 100644
--- "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\345\217\230\351\207\217.md"
+++ "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\345\217\230\351\207\217.md"
@@ -2,9 +2,9 @@ SJS 中的变量均为值的引用。
# 语法规则
-- `var` 与 JavaScript 中表现一致,会有变量提升。
-- 支持 const 与 let,与 JavaScript 表现一致。
-- 只声明变量而不赋值,默认值为 `undefined`。
+- `var` 与 JavaScript 中的表现一致,会有变量提升现象。
+- 支持 `const` 和 `let`,与 JavaScript 的行为一致。
+- 只声明变量而不赋值时,默认值为 `undefined`。
```javascript
var num = 1;
@@ -13,15 +13,14 @@ var undef; // undef === undefined
const n = 2;
let s = 'string';
```
-
# 变量名
## 命名规则
-变量命名必须符合下面两个规则:
+变量命名必须符合以下两个规则:
-- 首字符必须是:字母(a-z,A-Z),下划线(\_)。
-- 首字母以外的字符可以是:字母(a-z,A-Z),下划线(\_),数字(0-9)。
+- 首字符必须是:字母(a-z,A-Z),下划线(_)。
+- 首字母以外的字符可以是:字母(a-z,A-Z),下划线(_),数字(0-9)。
## 保留标识符
diff --git "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\345\237\272\347\241\200\347\261\273\345\272\223.md" "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\345\237\272\347\241\200\347\261\273\345\272\223.md"
index 769076723..42feb5cc3 100644
--- "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\345\237\272\347\241\200\347\261\273\345\272\223.md"
+++ "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\345\237\272\347\241\200\347\261\273\345\272\223.md"
@@ -64,16 +64,18 @@ console.log('null' === JSON.stringify(null));
console.log('222' === JSON.stringify(222));
console.log('"222"' === JSON.stringify('222'));
console.log('true' === JSON.stringify(true));
-console.log(undefined === JSON.stringify(function () {}));
+console.log(undefined === JSON.stringify(function() {}));
console.log(undefined === JSON.parse(JSON.stringify()));
console.log(undefined === JSON.parse(JSON.stringify(undefined)));
console.log(null === JSON.parse(JSON.stringify(null)));
console.log(222 === JSON.parse(JSON.stringify(222)));
console.log('222' === JSON.parse(JSON.stringify('222')));
console.log(true === JSON.parse(JSON.stringify(true)));
-console.log(undefined === JSON.parse(JSON.stringify(function () {})));
+console.log(undefined === JSON.parse(JSON.stringify(function() {})));
```
+> 注意:在使用 `JSON.stringify()` 方法时,函数将被忽略或转换为 `undefined`,示例中多次演示了此行为。
+
# Math
## 属性
diff --git "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\346\225\260\346\215\256\347\261\273\345\236\213.md" "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\346\225\260\346\215\256\347\261\273\345\236\213.md"
index f54b14dd8..b6d2469f2 100644
--- "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\346\225\260\346\215\256\347\261\273\345\236\213.md"
+++ "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\346\225\260\346\215\256\347\261\273\345\236\213.md"
@@ -1,20 +1,21 @@
-SJS 目前支持如下数据类型:
-
-- **string**:字符串。
-- **boolean**:布尔值。
-- **number**:数值。
-- **object**:对象。
-- **function**:函数。
-- **array**:数组。
-- **date**:日期。
-- **regexp**:正则表达式。
-
+SJS 目前支持以下数据类型:
+
+- **String**:字符串。
+- **Boolean**:布尔值。
+- **Number**:数值。
+- **Object**:对象。
+- **Function**:函数。
+- **Array**:数组。
+- **Date**:日期。
+- **Regexp**:正则表达式。
# 判断数据类型
-SJS 提供了 constructor 与 typeof 两种方式判断数据类型。
+SJS 提供了 `constructor` 与 `typeof` 两种方式判断数据类型。
## constructor
+使用对象的 `constructor` 属性,可以确定数据的具体类型。这种方法适用于多种基本数据类型和引用类型,包括 `Number`、`String`、`Boolean`、`Object`、`Function`、`Array`、`Date` 和 `RegExp`。以下是使用 `constructor` 属性判断数据类型的例子:
+
```javascript
const number = 10;
console.log(number.constructor); // "Number"
@@ -24,26 +25,28 @@ const boolean = true;
console.log(boolean.constructor); // "Boolean"
const object = {};
console.log(object.constructor); // "Object"
-const func = function () {};
+const func = function() {};
console.log(func.constructor); // "Function"
const array = [];
console.log(array.constructor); // "Array"
-const date = getDate();
+const date = new Date();
console.log(date.constructor); // "Date"
-const regexp = getRegExp();
+const regexp = new RegExp();
console.log(regexp.constructor); // "RegExp"
```
## typeof
+`typeof` 是 JavaScript 中的一个运算符,它返回一个字符串,指明未经计算的操作数的类型。对于包括 `number`、`boolean`、`object`、`function` 和 `undefined` 在内的大多数基础和引用类型,`typeof` 都能返回预期的类型。不过要注意,对于数组、日期和正则表达式,`typeof` 都会返回 `'object'`,这是因为这些类型在 JavaScript 中本质上都是特殊的对象。下面展示了如何用 `typeof` 方法判断不同类型的变量:
+
```javascript
const num = 100;
const bool = false;
const obj = {};
-const func = function () {};
+const func = function() {};
const array = [];
-const date = getDate();
-const regexp = getRegExp();
+const date = new Date();
+const regexp = new RegExp();
console.log(typeof num); // 'number'
console.log(typeof bool); // 'boolean'
console.log(typeof obj); // 'object'
@@ -54,7 +57,6 @@ console.log(typeof regexp); // 'object'
console.log(typeof undefined); // 'undefined'
console.log(typeof null); // 'object'
```
-
# string
## 语法
@@ -74,10 +76,10 @@ const str = `${a} alipay`;
## 属性
-- constructor:返回值 `"String"`。
+- constructor:返回值为 "String"。
- length
-**说明:** 除 `constructor` 属性外,其它属性的具体含义请参考 ES5 标准。
+**说明:**除 `constructor` 属性外,其他属性的具体含义请参考 ES5 标准。
## 方法
@@ -102,8 +104,7 @@ const str = `${a} alipay`;
- trim
**说明:** 具体使用请参考 ES5 标准。
-
-# number
+# 数值(Number)
## 语法
@@ -114,22 +115,22 @@ const PI = 3.141592653589793;
## 属性
-constructor:返回值 `"Number"`。
+`constructor`:返回 `"Number"`。
## 方法
-- toString
-- toLocaleString
-- valueOf
-- toFixed
-- toExponential
-- toPrecision
+- `toString`
+- `toLocaleString`
+- `valueOf`
+- `toFixed`
+- `toExponential`
+- `toPrecision`
-**说明:** 具体使用请参考 ES5 标准。
+**说明**:具体使用请参考 ES5 标准。
-# boolean
+# 布尔值(Boolean)
-布尔值只有两个特定的值:true 和 false。
+布尔值只有 `true` 和 `false` 两个特定的值。
## 语法
@@ -139,15 +140,14 @@ const a = true;
## 属性
-constructor:返回值`"Boolean"`。
+`constructor`:返回 `"Boolean"`。
## 方法
-- toString
-- valueOf
-
-**说明:** 具体使用请参考 ES5 标准。
+- `toString`
+- `valueOf`
+**说明**:具体使用请参考 ES5 标准。
# object
## 语法
@@ -161,15 +161,15 @@ o = {
val: {}, // 对象的 value 可以是任何类型
};
// 对象属性的读操作
-console.log(1 === o['string']);
+console.log(1 === o['str']);
console.log(2 === o.constVar);
// 对象属性的写操作
-o['string']++;
-o['string'] += 10;
+o['str']++;
+o['str'] += 10;
o.constVar++;
o.constVar += 10;
// 对象属性的读操作
-console.log(12 === o['string']);
+console.log(12 === o['str']);
console.log(13 === o.constVar);
```
@@ -183,23 +183,27 @@ o = {
b() {}, // 对象方法
};
const { a, b, c: d, e = 'default' } = { a: 1, b: 2, c: 3 }; // 对象解构赋值 & default
-const { a, ...other } = { a: 1, b: 2, c: 3 }; // 对象解构赋值
+const { a, ...others } = { a: 1, b: 2, c: 3 }; // 对象解构赋值
const f = { ...others }; // 对象解构
```
## 属性
-constructor:返回值 `"Object"`。
+`constructor`:返回字符串 `"Object"`。
```javascript
-console.log('Object' === { a: 2, b: '5' }.constructor);
+console.log('Object' === { a: 2, b: '5' }.constructor.name);
```
-## 方法
+**修改说明**:
-toString:返回字符串 `"[object Object]"`。
+1. 代码注释中“对象的 key 也可以是符合变量定义规则的标识符”,原注释给出的例子是 `constVar`,对应读操作中使用的键为 `constVar`,而非 `string`。
-# function
+2. 代码注释中原有的对 ES6 语法的解释 `// 支持` 可能不够明确,可以在其他地方详细解释 ES6 对象语法的新增特性。所以在此保留了原注释。
+
+3. 关于 `constructor` 属性的解释部分,更正文本为返回字符串 `"Object"`,为了更精确地反映 JavaScript 中的属性获取方式,特别是当属性为函数时,应该使用 `.name` 获取函数的名称。所以对应的代码示例进行了相应调整。
+`toString`:返回字符串 `"[object Object]"`。
+# 函数
## 语法
@@ -209,31 +213,31 @@ function a(x) {
return x;
}
// 方法 2:函数表达式
-var b = function (x) {
+var b = function(x) {
return x;
};
// 方法 3:箭头函数
const double = x => x * 2;
-function f(x = 2) {} // 函数参数默认
+function f(x = 2) {} // 函数参数默认值
function g({ name: n = 'xiaoming', ...other } = {}) {} // 函数参数解构赋值
-function h([a, b] = []) {} // 函数参数解构赋值
+function h([a, b] = []) {} // 函数参数数组解构赋值
// 匿名函数、闭包
-var c = function (x) {
- return function () {
+var c = function(x) {
+ return function() {
return x;
};
};
var d = c(25);
-console.log(25 === d());
+console.log(d() === 25); // 此行代码用于验证闭包功能
```
-function 中可以使用 `arguments` 关键字。
+函数中可以使用 `arguments` 关键字。
```javascript
-var a = function () {
- console.log(2 === arguments.length);
- console.log(1 === arguments[0]);
- console.log(2 === arguments[1]);
+var a = function() {
+ console.log(arguments.length === 2); // 输出参数数量是否为2
+ console.log(arguments[0] === 1); // 检查第一个参数是否为1
+ console.log(arguments[1] === 2); // 检查第二个参数是否为2
};
a(1, 2);
```
@@ -245,23 +249,22 @@ true;
true;
true;
```
-
## 属性
-- constructor:返回值 `"Function"`。
-- length:返回函数的形参个数。
+- `constructor`:返回值为 `"Function"`。
+- `length`:返回函数的形参个数。
## 方法
-toString:返回字符串 `"[function Function]"`。
+`toString` 方法:返回字符串 `"[function Function]"`。
## 示例
```javascript
var f = function (a, b) {};
-console.log('Function' === f.constructor);
-console.log('[function Function]' === f.toString());
-console.log(2 === f.length);
+console.log('Function' === f.constructor); // 判断 f 的构造函数是否为 'Function'
+console.log('[function Function]' === f.toString()); // 调用 f 的 toString 方法,并判断是否返回预期字符串
+console.log(2 === f.length); // 判断 f 的形参个数是否为 2
```
输出:
@@ -271,133 +274,129 @@ true
true
true
```
-
# array
## 语法
```javascript
-var a = []; // 空数组
-a = [5, '5', {}, function () {}]; // 非空数组,数组元素可以是任何类型
-const [b, , c, d = 5] = [1, 2, 3]; // 数组解构赋值 & 默认值
-const [e, ...other] = [1, 2, 3]; // 数组解构赋值
-const f = [...other]; // 数组解构
+var a = []; // 空数组
+a = [5, '5', {}, function () {}]; // 非空数组,数组元素可以是任何类型
+const [b, , c, d = 5] = [1, 2, 3]; // 数组解构赋值 & 默认值
+const [e, ...other] = [1, 2, 3]; // 数组解构赋值
+const f = [...other]; // 数组解构
```
## 属性
-- constructor:返回值 `"Array"`。
-- length
+- `constructor`:返回构造函数的引用,即“Array”。
+- `length`:返回数组中元素的数量。
-**说明:** 除 `constructor` 属性外,其它属性的具体含义请参考 ES5 标准。
+**说明:** 除 `constructor` 属性外,其他属性的具体含义请参考 ES5 标准。
## 方法
-- toString
-- concat
-- join
-- pop
-- push
-- reverse
-- shift
-- slice
-- sort
-- splice
-- unshift
-- indexOf
-- lastIndexOf
-- every
-- some
-- forEach
-- map
-- filter
-- reduce
-- reduceRight
-
-**说明:** 具体使用请参考 ES5 标准。
-
+数组对象提供了多种方法,包括:
+
+- `toString`:将数组转换为字符串并返回。
+- `concat`:用于连接两个或多个数组。
+- `join`:将数组中的元素连接成字符串并返回。
+- `pop`:删除数组的最后一个元素并返回该元素。
+- `push`:向数组的末尾添加一个或多个元素,并返回新数组的长度。
+- `reverse`:颠倒数组中元素的顺序。
+- `shift`:删除数组的第一个元素并返回该元素。
+- `slice`:选取数组的一部分并返回一个新数组。
+- `sort`:对数组的元素进行排序。
+- `splice`:用于添加或删除数组中的元素。
+- `unshift`:向数组的开头添加一个或多个元素,并返回新数组的长度。
+- `indexOf`:搜索指定元素,并返回其位置。
+- `lastIndexOf`:搜索指定元素,并返回其最后出现的位置。
+- `every`:检测数组所有元素是否都符合指定条件。
+- `some`:检测数组中的元素是否有符合指定条件的。
+- `forEach`:数组每个元素都执行一次回调函数。
+- `map`:通过指定函数处理每个元素,并返回处理后的数组。
+- `filter`:创建一个包含通过测试的元素数组。
+- `reduce`:将数组元素计算为一个值(从左到右)。
+- `reduceRight`:将数组元素计算为一个值(从右到左)。
+
+**说明:** 具体使用方法请参考 ES5 标准。
# date
## 语法
-生成 `date` 对象需要使用 `getDate` 函数,返回一个当前时间的对象。
+生成 `date` 对象需要使用 `getDate` 函数,该函数返回当前时间的对象。
```javascript
-getDate()
-getDate(milliseconds)
-getDate(datestring)
-getDate(year, month[, date[, hours[, minutes[, seconds[, milliseconds]]]]])
+getDate();
+getDate(milliseconds);
+getDate(datestring);
+getDate(year, month[, date[, hours[, minutes[, seconds[, milliseconds]]]]]);
```
## 参数
-- milliseconds:从 1970 年 1 月 1 日 00:00:00 UTC 开始计算的毫秒数。
-- datestring:日期字符串,其格式为 `"month day, year hours:minutes:seconds"`。
-
+- `milliseconds`:自 1970 年 1 月 1 日 00:00:00 UTC 起的毫秒数。
+- `datestring`:日期字符串,格式为 "month day, year hours:minutes:seconds"。
## 属性
-constructor:返回值`"Date"`。
-
-## 方法
-
-- toString
-- toDateString
-- toTimeString
-- toLocaleString
-- toLocaleDateString
-- toLocaleTimeString
-- valueOf
-- getTime
-- getFullYear
-- getUTCFullYear
-- getMonth
-- getUTCMonth
-- getDate
-- getUTCDate
-- getDay
-- getUTCDay
-- getHours
-- getUTCHours
-- getMinutes
-- getUTCMinutes
-- getSeconds
-- getUTCSeconds
-- getMilliseconds
-- getUTCMilliseconds
-- getTimezoneOffset
-- setTime
-- setMilliseconds
-- setUTCMilliseconds
-- setSeconds
-- setUTCSeconds
-- setMinutes
-- setUTCMinutes
-- setHours
-- setUTCHours
-- setDate
-- setUTCDate
-- setMonth
-- setUTCMonth
-- setFullYear
-- setUTCFullYear
-- toUTCString
-- toISOString
-- toJSON
-
-**说明:** 具体使用请参考 ES5 标准。
+`constructor`:返回值 `"Date"`。
+
+**方法**:
+
+- `toString`
+- `toDateString`
+- `toTimeString`
+- `toLocaleString`
+- `toLocaleDateString`
+- `toLocaleTimeString`
+- `valueOf`
+- `getTime`
+- `getFullYear`
+- `getUTCFullYear`
+- `getMonth`
+- `getUTCMonth`
+- `getDate`
+- `getUTCDate`
+- `getDay`
+- `getUTCDay`
+- `getHours`
+- `getUTCHours`
+- `getMinutes`
+- `getUTCMinutes`
+- `getSeconds`
+- `getUTCSeconds`
+- `getMilliseconds`
+- `getUTCMilliseconds`
+- `getTimezoneOffset`
+- `setTime`
+- `setMilliseconds`
+- `setUTCMilliseconds`
+- `setSeconds`
+- `setUTCSeconds`
+- `setMinutes`
+- `setUTCMinutes`
+- `setHours`
+- `setUTCHours`
+- `setDate`
+- `setUTCDate`
+- `setMonth`
+- `setUTCMonth`
+- `setFullYear`
+- `setUTCFullYear`
+- `toUTCString`
+- `toISOString`
+- `toJSON`
-## 示例
+**说明**:具体使用请参考 ES5 标准。
```javascript
-let date = getDate(); //返回当前时间对象
-date = getDate(1500000000000);
-// Fri Jul 14 2017 10:40:00 GMT+0800 (中国标准时间)
-date = getDate('2016-6-29');
-// Fri June 29 2016 00:00:00 GMT+0800 (中国标准时间)
-date = getDate(2017, 6, 14, 10, 40, 0, 0);
-// Fri Jul 14 2017 10:40:00 GMT+0800 (中国标准时间)
+let date = new Date(); // 返回当前时间对象
+date = new Date(1500000000000);
+// 2017 年 7 月 14 日 10:40:00 GMT+0800 (中国标准时间)
+date = new Date('2016-6-29');
+// 2016 年 6 月 29 日 00:00:00 GMT+0800 (中国标准时间)
+date = new Date(2017, 6, 14, 10, 40, 0, 0);
+// 2017 年 7 月 14 日 10:40:00 GMT+0800 (中国标准时间)
```
-
# regexp
## 语法
@@ -410,33 +409,33 @@ getRegExp(pattern[, flags])
## 参数
-- pattern: 正则的内容。
-- flags:修饰符,只能包括一下字符: `g` 、`i` 、`m`。
+- `pattern`(字符串):定义正则表达式的文本。
+- `flags`(字符串):修饰符,只能包括以下字符:`g`、`i`、`m`。
## 属性
-- constructor:返回字符串 `"RegExp"`。
-- global
-- ignoreCase
-- lastIndex
-- multiline
-- source
+- `constructor`:该属性的值为字符串 `"RegExp"`。
+- `global`
+- `ignoreCase`
+- `lastIndex`
+- `multiline`
+- `source`
-**说明**:除 `constructor` 属性外,其它属性的具体含义请参考 ES5 标准。
+**说明**:除 `constructor` 属性外,其它属性的具体含义,详见 ES5 标准。
## 方法
-- exec
-- test
-- toString
+- `exec`
+- `test`
+- `toString`
-**说明**:具体使用请参考 ES5 标准。
+**说明**:具体方法的使用,请参照 ES5 标准。
## 示例
```javascript
var reg = getRegExp('name', 'img');
-console.log('name' === reg.source);
+console.log(true === reg.source === 'name');
console.log(true === reg.global);
console.log(true === reg.ignoreCase);
console.log(true === reg.multiline);
diff --git "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\346\263\250\351\207\212.md" "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\346\263\250\351\207\212.md"
index 047ca423c..9906c8c69 100644
--- "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\346\263\250\351\207\212.md"
+++ "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\346\263\250\351\207\212.md"
@@ -1,12 +1,12 @@
-注释方法和 JavaScript 一致,可以使用以下方法对 SJS 代码进行注释:
+注释方法与 JavaScript 一致,可以使用以下方法对 SJS 代码进行注释:
```javascript
// page.sjs
-// 方法一:这是一个单行注释
+// 这是一个单行注释
/*
-方法二:这是一个多行注释
-中间的内容都会被注释
+这是一个多行注释。
+中间的内容都会被注释。
*/
let h = 'hello';
-const w = ' alipay';
+const w = 'alipay';
```
diff --git "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\350\257\255\345\217\245.md" "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\350\257\255\345\217\245.md"
index 9b3eb2742..c214ba318 100644
--- "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\350\257\255\345\217\245.md"
+++ "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\350\257\255\345\217\245.md"
@@ -1,10 +1,24 @@
# if 语句
-在 .sjs 文件中,可以使用以下格式的 if 语句 :
-
-- if (expression) statement : 当 expression 为 truthy 时,执行 statement。
-- if (expression) statement1 else statement2 : 当 expression 为 truthy 时,执行 statement1。 否则,执行 statement2。
-- if ... else if ... else statementN 通过该句型,可以在 statement1 ~ statementN 之间选其中一个执行。
+在 .sjs 文件中,可以使用以下格式的 if 语句:
+
+- 当 `expression` 为 truthy 时,执行 `statement`。
+
+ ```plain
+ if (expression) statement;
+ ```
+
+- 当 `expression` 为 truthy 时,执行 `statement1`。否则,执行 `statement2`。
+
+ ```plain
+ if (expression) statement1 else statement2;
+ ```
+
+- 通过 if ... else if ... else 结构,在 `statement1` ~ `statementN` 之间选其中一个执行。
+
+ ```plain
+ if ... else if ... else statementN;
+ ```
**示例语法**:
@@ -16,18 +30,20 @@ if (表达式)
if (表达式) {
代码块;
}
+
// if ... else
if (表达式) 语句;
else 语句;
if (表达式)
语句;
-else
+else
语句;
if (表达式) {
代码块;
} else {
代码块;
}
+
// if ... else if ... else ...
if (表达式) {
代码块;
@@ -39,8 +55,7 @@ if (表达式) {
代码块;
}
```
-
-# switch 语句
+# Switch 语句
**示例语法**:
@@ -58,8 +73,8 @@ switch (表达式) {
}
```
-- `default` 分支可以省略不写。
-- `case` 关键词后面只能使用:`变量`,`数字`,`字符串`。
+`default` 分支可以省略不写。
+`case` 关键词后面只能使用:`变量`、`数字`、`字符串`。
**示例代码**:
@@ -85,7 +100,6 @@ switch (exp) {
```plain
number 10
```
-
# for 语句
**示例语法**:
@@ -98,7 +112,7 @@ for (语句; 语句; 语句) {
}
```
-支持使用 `break`,`continue` 关键词。
+支持使用 `break` 和 `continue` 关键词。
**示例代码**:
@@ -115,7 +129,6 @@ for (var i = 0; i < 3; ++i) {
0
1
```
-
# while 语句
**示例语法**:
@@ -123,7 +136,7 @@ for (var i = 0; i < 3; ++i) {
```plain
while (表达式)
语句;
-while (表达式){
+while (表达式) {
代码块;
}
do {
diff --git "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\350\277\220\347\256\227\347\254\246.md" "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\350\277\220\347\256\227\347\254\246.md"
index 6115ae69b..75d497074 100644
--- "a/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\350\277\220\347\256\227\347\254\246.md"
+++ "b/mini/framework/SJS \350\257\255\346\263\225\345\217\202\350\200\203/\350\277\220\347\256\227\347\254\246.md"
@@ -2,119 +2,115 @@
```javascript
var a = 10,
- b = 20;
+ b = 20;
// 加法运算
-console.log(30 === a + b); //true
+console.log(30 === a + b); // true
// 减法运算
-console.log(-10 === a - b); //true
+console.log(-10 === a - b); // true
// 乘法运算
-console.log(200 === a * b); //true
+console.log(200 === a * b); // true
// 除法运算
-console.log(0.5 === a / b); //true
+console.log(0.5 === a / b); // true
// 取余运算
-console.log(10 === a % b); //true
+console.log(10 === a % b); // true
```
-加法 `+` 运算符可用作字符串拼接。
+加法 `+` 运算符可用于字符串拼接。
```javascript
var a = 'hello',
- b = ' alipay';
+ b = ' alipay';
// 字符串拼接
-console.log('hello alipay' === a + b); //true
+console.log('hello alipay' === a + b); // true
```
-
# 比较运算符
-```plain
+```javascript
var a = 10, b = 20;
// 小于
-console.log(true === (a < b)); //true
+console.log(true === (a < b)); // true
// 大于
-console.log(false === (a > b)); //true
+console.log(false === (a > b)); // true
// 小于等于
-console.log(true === (a <= b)); //true
+console.log(true === (a <= b)); // true
// 大于等于
-console.log(false === (a >= b)); //true
+console.log(false === (a >= b)); // true
// 等号
-console.log(false === (a == b)); //true
+console.log(false === (a == b)); // true
// 非等号
-console.log(true === (a != b)); //true
+console.log(true === (a != b)); // true
// 全等号
-console.log(false === (a === b)); //true
+console.log(false === (a === b)); // true
// 非全等号
-console.log(true === (a !== b)); //true
+console.log(true === (a !== b)); // true
```
# 二元逻辑运算符
```javascript
-var a = 10,
- b = 20;
+var a = 10, b = 20;
// 逻辑与
-console.log(20 === (a && b)); //true
+console.log(20 === (a && b)); // true
// 逻辑或
-console.log(10 === (a || b)); //true
+console.log(10 === (a || b)); // true
// 逻辑否,取反运算
-console.log(false === !a); //true
+console.log(false === !a); // true
```
-
# 位运算符
```javascript
var a = 10,
- b = 20;
+ b = 20;
// 左移运算
-console.log(80 === a << 3); //true
+console.log(80 === a << 3); // true
// 无符号右移运算
-console.log(2 === a >> 2); //true
+console.log(2 === a >> 2); // true
// 带符号右移运算
-console.log(2 === a >>> 2); //true
+console.log(2 === a >>> 2); // true
// 与运算
-console.log(2 === (a & 3)); //true
+console.log(2 === (a & 3)); // true
// 异或运算
-console.log(9 === (a ^ 3)); //true
+console.log(9 === (a ^ 3)); // true
// 或运算
-console.log(11 === (a | 3)); //true
+console.log(11 === (a | 3)); // true
```
-
# 赋值运算符
```javascript
var a = 10;
a = 10;
a *= 10;
-console.log(100 === a); //true
+console.log(100 === a); // true
a = 10;
a /= 5;
-console.log(2 === a); //true
+console.log(2 === a); // true
a = 10;
a %= 7;
-console.log(3 === a); //true
+console.log(3 === a); // true
a = 10;
a += 5;
-console.log(15 === a); //true
+console.log(15 === a); // true
a = 10;
a -= 11;
-console.log(-1 === a); //true
+console.log(-1 === a); // true
a = 10;
a <<= 10;
-console.log(10240 === a); //true
+console.log(10240 === a); // true
a = 10;
a >>= 2;
-console.log(2 === a); //true
+console.log(2 === a); // true
a = 10;
a >>>= 2;
-console.log(2 === a); //true
+console.log(2 === a); // true
a = 10;
a &= 3;
-console.log(2 === a); //true
+console.log(2 === a); // true
a = 10;
a ^= 3;
-console.log(9 === a); //true
+console.log(9 === a); // true
a = 10;
a |= 3;
-console.log(11 === a); //true
+console.log(11 === a); // true
```
# 一元运算符
@@ -123,25 +119,25 @@ console.log(11 === a); //true
var a = 10,
b = 20;
// 自增运算
-console.log(10 === a++); //true
-console.log(12 === ++a); //true
+console.log(10 === a++); // true
+console.log(12 === ++a); // true
// 自减运算
-console.log(12 === a--); //true
-console.log(10 === --a); //true
+console.log(12 === a--); // true
+console.log(10 === --a); // true
// 正值运算
-console.log(10 === +a); //true
+console.log(10 === +a); // true
// 负值运算
-console.log(0 - 10 === -a); //true
+console.log(0 - 10 === -a); // true
// 否运算
-console.log(-11 === ~a); //true
+console.log(-11 === ~a); // true
// 取反运算
-console.log(false === !a); //true
+console.log(false === !a); // true
// delete 运算
-console.log(true === delete a.fake); //true
+console.log(true === delete a.fake); // true
// void 运算
-console.log(undefined === void a); //true
+console.log(undefined === void a); // true
// typeof 运算
-console.log('number' === typeof a); //true
+console.log('number' === typeof a); // true
```
# 三元运算符
@@ -150,7 +146,7 @@ console.log('number' === typeof a); //true
var a = 10,
b = 20;
// 条件运算符
-console.log(20 === (a >= 10 ? a + 10 : b + 10)); //true
+console.log(20 === (a >= 10 ? a + 10 : b + 10)); // true
```
# 逗号运算符
@@ -159,9 +155,8 @@ console.log(20 === (a >= 10 ? a + 10 : b + 10)); //true
var a = 10,
b = 20;
// 逗号运算符
-console.log(20 === (a, b)); //true
+console.log(20 === (a, b)); // true
```
-
# 运算符优先级
SJS 运算符的优先级与 JavaScript 一致。
diff --git "a/mini/framework/\344\272\213\344\273\266\347\263\273\347\273\237/\344\272\213\344\273\266\344\273\213\347\273\215.md" "b/mini/framework/\344\272\213\344\273\266\347\263\273\347\273\237/\344\272\213\344\273\266\344\273\213\347\273\215.md"
index 613ea00ac..9ae818bee 100644
--- "a/mini/framework/\344\272\213\344\273\266\347\263\273\347\273\237/\344\272\213\344\273\266\344\273\213\347\273\215.md"
+++ "b/mini/framework/\344\272\213\344\273\266\347\263\273\347\273\237/\344\272\213\344\273\266\344\273\213\347\273\215.md"
@@ -2,12 +2,11 @@
- 事件是视图层到逻辑层的通讯方式。
- 事件可以将用户的行为反馈到逻辑层进行处理。
-- 事件可以绑定在组件上,当达到触发条件,就会执行逻辑层中对应的事件函数。
-- 事件对象可以携带额外信息,如 id、dataset、touches。
-
+- 事件可以绑定在组件上,当达到触发条件时,就会执行逻辑层中对应的事件函数。
+- 事件对象可以携带额外信息,如 `id`、`dataset`、`touches`。
# 使用方式
-若要在组件中绑定一个事件处理函数,如 `onTap`,则需要在该页面的 .js 文件中的 `Page` 里定义`onTap` 对应的事件处理函数。
+若要在组件中绑定一个事件处理函数,例如 `onTap`,则需要在该页面的.js文件中的`Page`里定义 `onTap` 对应的事件处理函数。
```html
@@ -15,7 +14,7 @@
```
-在相应的 `Page` 中定义相应的事件处理函数 `tapName`,参数为事件对象 event。
+在相应的 `Page` 中定义相应的事件处理函数 `tapName`,参数为事件对象 `event`。
```javascript
Page({
@@ -25,7 +24,7 @@ Page({
});
```
-控制台输出 event 信息如下所示:
+控制台输出 `event` 信息如下所示:
```json
{
@@ -49,44 +48,47 @@ Page({
}
```
-使用组件(基础组件、扩展组件和自定义组件)时,组件里有哪些可用的事件取决于组件本身是否支持,支持的事件会在具体组件的文档里明确列出。
-
+使用组件(基础组件、扩展组件和自定义组件)时,组件里有哪些可用的事件取决于组件本身是否支持。支持的事件会在具体组件的文档里明确列出。
# 事件类型
-事件分为冒泡事件和非冒泡事件:
+本文介绍了小程序中的两种事件类型:冒泡事件和非冒泡事件。
+
+冒泡事件:以关键字 `on` 为前缀。当组件上的该事件被触发后,事件会向父节点传递。
-- 冒泡事件:以关键字 `on` 为前缀,当组件上的事件被触发,该事件会向父节点传递。
-- 非冒泡事件:以关键字 `catch` 为前缀,当组件上的事件被触发,该事件不会向父节点传递。
+非冒泡事件:以关键字 `catch` 为前缀。当组件上的该事件被触发后,事件不会向父节点传递。
-事件绑定的写法同组件的属性,以 key、value 的形式。
+事件的绑定写法与组件的属性相同,采用 key 和 value 的形式。
-- key 以 `on` 或 `catch` 开头,然后跟上事件的类型,如 `onTap`、`catchTap`。
-- value 是一个字符串,对应 Page 中定义的函数名,不存在时触发事件会报错。
+- key 以 `on` 或 `catch` 开头,并紧接事件类型,如 `onTap`、`catchTap`。
+- value 是一个字符串,对应于 Page 中定义的函数名。如果该函数名不存在,触发事件时会报错。
```html
view1
view2
- view3
+ view3
```
-上面代码中,点击 view3 会先后触发 handleTap3 和 handleTap2(因为 tap 事件会冒泡到 view2,而 view2 阻止了 tap 事件冒泡,不再向父节点传递),点击 view2 会触发 handleTap2,点击 view1 会触发 handleTap1。
+如上代码所示,点击 view3 时,会依次触发 `handleTap3` 和 `handleTap2`(因为 `tap` 事件会冒泡至 view2,但 view2 阻止了 tap 事件冒泡,不再向父节点传递)。点击 view2 时,会触发 `handleTap2`。点击 view1 时,会触发 `handleTap1`。
-所有会发生冒泡的事件:
-| **类型** | **触发条件** |
-| --------- | -------- |
-| touchStart | 触摸动作开始。 |
-| touchMove | 触摸后移动。 |
-| touchEnd | 触摸动作结束。 |
-| touchCancel | 触摸动作被打断,如来电提醒,弹窗。 |
-| tap | 触摸后马上离开。 |
-| longTap | 触摸后,超过 500ms 再离开。 |
+所有会发生冒泡的事件如下表所示:
+
+| 类型 | 触发条件 |
+|-----------|------------------------------------|
+| touchStart | 触摸动作开始 |
+| touchMove | 触摸后移动 |
+| touchEnd | 触摸动作结束 |
+| touchCancel | 触摸动作被打断,如来电提醒、弹窗 |
+| tap | 触摸后马上离开 |
+| longTap | 触摸后,超过 500ms 再离开 |
# 事件的捕获阶段
-自基础库 [2.8.5](https://opendocs.alipay.com/mini/framework/lib) 、IDE [3.4.3](https://opendocs.alipay.com/mini/ide/download) 起,触摸类事件支持在捕获阶段触发。捕获阶段位于冒泡阶段之前,且在捕获阶段中,事件到达节点的顺序与冒泡阶段恰好相反。需要在捕获阶段监听事件时,可以采用 capture-on、capture-catch 关键字,后者将中断捕获阶段和取消冒泡阶段。 在下面的代码中,点击 inner view 会先后调用 handleTap2、handleTap4、handleTap3、handleTap1。
+
+自基础库 [2.8.5](https://opendocs.alipay.com/mini/framework/lib) 、IDE [3.4.3](https://opendocs.alipay.com/mini/ide/download) 起,触摸类事件支持在捕获阶段触发。捕获阶段位于冒泡阶段之前,且在捕获阶段中,事件到达节点的顺序与冒泡阶段恰好相反。需要在捕获阶段监听事件时,可以采用 `capture-on`、`capture-catch` 关键字,后者将中断捕获阶段和取消冒泡阶段。在下面的代码中,点击 `inner view` 会先后调用 `handleTap2`、`handleTap4`、`handleTap3`、`handleTap1`。
+
```html
outer view
@@ -95,7 +97,9 @@ Page({
```
-如果将上面代码中的第一个 capture-on 改为 capture-catch,将只触发 handleTap2。
+
+如果将上面代码中的第一个 `capture-on` 改为 `capture-catch`,将只触发 `handleTap2`。
+
```html
outer view
@@ -104,20 +108,22 @@ Page({
```
+
## 支持冒泡的组件和事件明细
-| **组件** | **事件明细** |
-| ------------ | -------------------------------------|
-| view | - tap
- longTap
- touchStart
- touchEnd
- touchMove
- touchCancel
|
-| text | - tap
|
-| image | - tap
- longTap
- touchStart
- touchEnd
- touchMove
- touchCancel
|
-| scroll-view | - touchStart
- touchEnd
- touchMove
- touchCancel
|
-| swiper | - touchStart
- touchEnd
- touchMove
- touchCancel
|
-| button | |
-| rich-text | - tap
- longTap
- touchStart
- touchEnd
- touchMove
- touchCancel
|
-| movable-view | - tap
- touchStart
- touchEnd
- touchMove
- touchCancel
|
+| 组件 | 事件明细 |
+|--------------|----------------------------------------------------------------------------------|
+| view | `tap`、`longTap`、`touchStart`、`touchEnd`、`touchMove`、`touchCancel` |
+| text | `tap` |
+| image | `tap`、`longTap`、`touchStart`、`touchEnd`、`touchMove`、`touchCancel` |
+| scroll-view | `touchStart`、`touchEnd`、`touchMove`、`touchCancel` |
+| swiper | `touchStart`、`touchEnd`、`touchMove`、`touchCancel` |
+| button | `tap` |
+| rich-text | `tap`、`longTap`、`touchStart`、`touchEnd`、`touchMove`、`touchCancel` |
+| movable-view | `tap`、`touchStart`、`touchEnd`、`touchMove`、`touchCancel` |
+
# 常见问题
## Q:大 box 的事件覆盖了小 box 的事件,点击小 box 也执行了大 box 的事件如何解决?
-A:推荐使用关键字为 `catch` 前缀的非冒泡事件来阻止事件冒泡,可查看 [非冒泡事件](https://opendocs.alipay.com/mini/framework/events#%E4%BA%8B%E4%BB%B6%E7%B1%BB%E5%9E%8B)。
+A:推荐使用关键字为 `catch` 前缀的非冒泡事件来阻止事件冒泡,可查看 [非冒泡事件](https://opendocs.alipay.com/mini/framework/events#事件类型)。
diff --git "a/mini/framework/\344\272\213\344\273\266\347\263\273\347\273\237/\344\272\213\344\273\266\345\257\271\350\261\241.md" "b/mini/framework/\344\272\213\344\273\266\347\263\273\347\273\237/\344\272\213\344\273\266\345\257\271\350\261\241.md"
index cb50d4bdc..442e9c8d6 100644
--- "a/mini/framework/\344\272\213\344\273\266\347\263\273\347\273\237/\344\272\213\344\273\266\345\257\271\350\261\241.md"
+++ "b/mini/framework/\344\272\213\344\273\266\347\263\273\347\273\237/\344\272\213\344\273\266\345\257\271\350\261\241.md"
@@ -1,15 +1,14 @@
组件触发事件时,逻辑层绑定该事件的处理函数会收到一个事件对象。
-
# BaseEvent 基础事件
BaseEvent 基础事件对象属性列表:
-| **属性** | **类型** | **描述** | **最低版本** |
-| --------- | -------- | ---------------------------- |---------------------------- |
-| type | String | 事件类型。 |- |
-| timeStamp | Integer | 事件生成时的时间戳。 |- |
-| target | Object | 触发事件的组件的属性值集合。 |- |
-| mark | Object | 事件标记数据。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib) |
+| 属性 | 类型 | 描述 | 最低版本 |
+| --------- | -------- | ---------------------------- |-------- |
+| type | String | 事件类型。 | - |
+| timeStamp | Integer | 事件生成时的时间戳。 | - |
+| target | Object | 触发事件的组件的属性值集合。 | - |
+| mark | Object | 事件标记数据。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib) |
## type
@@ -21,7 +20,7 @@ BaseEvent 基础事件对象属性列表:
## target
-`dataset` 在组件中可以定义数据,这些数据将会通过事件传递给逻辑层。 以 `data-` 开头,由连字符 `-` 连接多个单词,所有字母必须小写,如 `data-element-type`,最终会在 `event.target.dataset` 中会将连字符转成驼峰 `elementType`。示例代码:
+`dataset` 在组件中可定义数据,这些数据将会通过事件传递给逻辑层。以 `data-` 开头,由连字符 `-` 连接多个单词,所有字母必须小写,例如 `data-element-type`。最终,这些自定义属性会在 `event.target.dataset` 中转换成驼峰命名法形式,如 `elementType`。下面是一个示例代码:
```html
DataSet Test
@@ -30,23 +29,23 @@ BaseEvent 基础事件对象属性列表:
```javascript
Page({
bindViewTap: function (event) {
- event.target.dataset.alphaBeta === 1; // - 会转为驼峰写法
+ event.target.dataset.alphaBeta === 1; // "-" 会转为驼峰写法
},
});
```
触发事件的源组件对象,属性列表如下:
-| **属性** | **类型** | **描述** |
-| --- | --- | --- |
-| id | String | 事件源组件的 id。 |
-| tagName | String | 当前组件的类型。 |
-| dataset | Object | 绑定事件的组件上由 `data-` 开头的自定义属性的集合。 |
-| targetDataset | Object | 实际触发事件的组件上由 `data-` 开头的自定义属性的集合。 |
-
+| 属性 | 类型 | 描述 |
+| ------------ | ------ |---------------------------------------------------------- |
+| id | String | 事件源组件的 id。 |
+| tagName | String | 当前组件的类型。 |
+| dataset | Object | 组件上由 `data-` 开头,定义的自定义属性集合,以驼峰法命名。 |
+| targetDataset| Object | 实际触发事件的组件上,由 `data-` 开头的自定义属性集合。 |
## mark
-自基础库 [2.8.5](https://opendocs.alipay.com/mini/framework/lib) 、IDE [3.4.3](https://opendocs.alipay.com/mini/ide/download) 起,可以使用 mark 来识别具体触发事件的 target 节点。此外, mark 还可以用于承载一些自定义数据(类似于 `dataset` )。
-当事件触发时,事件冒泡路径上所有的 mark 会被合并,并返回给事件回调函数(即使事件不是冒泡事件,也会 mark)。
+
+自基础库 [2.8.5](https://opendocs.alipay.com/mini/framework/lib) 、IDE [3.4.3](https://opendocs.alipay.com/mini/ide/download) 起,可以使用 `mark` 来识别具体触发事件的 target 节点。此外,`mark` 还可以用于承载一些自定义数据(类似于 `dataset`)。
+当事件触发时,事件冒泡路径上所有的 `mark` 会被合并,并返回给事件回调函数(即使事件不是冒泡事件,也会合并 `mark`)。
**代码示例**:
```html
@@ -54,58 +53,59 @@ Page({
```
-在上述 AXML 中,如果按钮被点击,将触发 onViewTap 和 onButtonTap 两个事件,事件携带的 event.mark 将包含 myMark 和 anotherMark 两项。
+在上述 AXML 中,如果按钮被点击,将触发 `onViewTap` 和 `onButtonTap` 两个事件,事件携带的 `e.mark` 将包含 `myMark` 和 `anotherMark` 两项。
```javascript
Page({
onViewTap: function (e) {
- e.mark.myMark === "last" // true
- e.mark.anotherMark === "leaf" // true
+ e.mark.myMark === "last"; // true
+ e.mark.anotherMark === "leaf"; // true
}
})
```
-mark 和 `dataset` 很相似,主要区别在于:mark 会包含从触发事件的节点到根节点上所有的 `mark:` 属性值,而 `dataset` 仅包含一个节点的 `data-` 属性值。
+`mark` 和 `dataset` 很相似,主要区别在于:`mark` 会包含从触发事件的节点到根节点上所有的 `mark:` 属性值,而 `dataset` 仅包含一个节点的 `data-` 属性值。
**注意**:
-- 如果存在同名的 mark ,父节点的 mark 会被子节点覆盖。
-- 在自定义组件中接收事件时,mark 不包含自定义组件外的节点的 mark。
-- 不同于 `dataset`,节点的 mark 不会做连字符和大小写转换。
+- 如果存在同名的 `mark`,父节点的 `mark` 会被子节点覆盖。
+- 在自定义组件中接收事件时,`mark` 不包含自定义组件外的节点的 `mark`。
+- 不同于 `dataset`,节点的 `mark` 不会做连字符和大小写转换。
# CustomEvent 自定义事件对象
-CustomEvent 自定义事件对象(继承自 BaseEvent),属性列表如下:
-| **属性** | **类型** | **描述** |
-| --- | --- | --- |
-| detail | Object | 额外的信息。 |
+`CustomEvent` 自定义事件对象(继承自 `BaseEvent`),属性列表如下:
+
+| **属性** | **类型** | **描述** |
+|----------|-----------|--------------------|
+| detail | `Object` | 额外的信息 |
## detail
-自定义事件所携带的数据。表单组件事件会携带用户的输入信息,例如 [switch 单选开关](https://opendocs.alipay.com/mini/component/switch) onChange 触发时可通过 `event.detail.value` 获取用户选择的状态值,媒体的错误事件会携带错误信息,更多信息请参见各组件文档事件说明。
+自定义事件所携带的数据。表单组件事件会携带用户的输入信息,例如 [switch 单选开关](https://opendocs.alipay.com/mini/component/switch) `onChange` 触发时可通过 `event.detail.value` 获取用户选择的状态值,媒体的错误事件会携带错误信息,更多信息请参见各组件文档事件说明。
# TouchEvent 触摸事件对象
TouchEvent 触摸事件对象(继承自 BaseEvent),属性列表:
-| **属性** | **类型** | **描述** |
-| -------------- | -------- | ------------------------------------ |
-| touches | Array | 当前停留在屏幕中的触摸点信息的数组。 |
-| changedTouches | Array | 当前变化的触摸点信息的数组。 |
+| 属性 | 类型 | 描述 |
+| --------- | ---- | ------------------------------------ |
+| touches | Array | 当前停留在屏幕中的触摸点信息的数组。 |
+| changedTouches | Array | 当前变化的触摸点信息的数组。 |
-`touches` 是一个数组,每个元素为一个 Touch 对象( canvas 触摸事件中携带的 touches 是 CanvasTouch 的数组),表示当前停留在屏幕上的触摸点。 changedTouches 数据格式同 touches。 表示有变化的触摸点,如从无变有(touchstart),位置变化(touchmove),从有变无(touchend、touchcancel)。
+`touches` 是一个数组,每个元素为一个 `Touch` 对象(在 `canvas` 触摸事件中携带的 `touches` 是 `CanvasTouch` 数组),表示当前停留在屏幕上的触摸点。`changedTouches` 的数据格式同 `touches`。表示有变化的触摸点,如从无变有(`touchstart`),位置变化(`touchmove`),从有变无(`touchend`、`touchcancel`)。
## Touch 对象
-| **属性** | **类型** | **描述** |
-| --- | --- | --- |
-| identifier | Number | 触摸点的标识符。 |
-| pageX, pageY | Number | 距离文档左上角的距离,左上角为原点 ,横向为 X 轴,纵向为 Y 轴。 |
-| clientX, clientY | Number | 距离页面可显示的区域(屏幕除去导航条)的距离,左上角为原点,横向为 X 轴,纵向为 Y 轴。 |
+| 属性 | 类型 | 描述 |
+| --------- | ------ | ---------------------------------------------------- |
+| identifier | Number | 触摸点的标识符。 |
+| pageX, pageY | Number | 触摸点距离文档左上角的距离,左上角为原点,横向为 X 轴,纵向为 Y 轴。 |
+| clientX, clientY | Number | 触摸点距离页面可显示区域(屏幕除去导航条)的距离,左上角为原点,横向为 X 轴,纵向为 Y 轴。 |
## CanvasTouch 对象
-| **属性** | **类型** | **描述** |
-| --- | --- | --- |
-| identifier | Number | 触摸点的标识符。 |
-| x, y | Number | 距离 Canvas 左上角的距离,Canvas 的左上角为原点 ,横向为 X 轴,纵向为 Y 轴。 |
+| 属性 | 类型 | 描述 |
+| --------- | ------ | ----------------------------------------- |
+| identifier | Number | 触摸点的标识符。 |
+| x, y | Number | 触摸点距离 `Canvas` 左上角的距离,`Canvas` 的左上角为原点,横向为 X 轴,纵向为 Y 轴。 |
## 示例
diff --git "a/mini/framework/\345\205\274\345\256\271.md" "b/mini/framework/\345\205\274\345\256\271.md"
index 7b8162cbd..73a8af938 100644
--- "a/mini/framework/\345\205\274\345\256\271.md"
+++ "b/mini/framework/\345\205\274\345\256\271.md"
@@ -1,12 +1,11 @@
-小程序基础库在 **minor**/**patch** 位的升级会带来 **基础组件** / **API 接口** / **运行时特性** 等功能的新增和优化,开发者可以通过以下方式进行低版本的判断和兼容。
-
+小程序基础库在 **minor**/**patch** 位的升级会带来 **基础组件**/**API 接口**/**运行时特性** 等功能的新增和优化,开发者可以通过以下方式进行低版本的判断和兼容。
# 版本号判断
-小程序基础库的版本号和客户端的版本号格式均为 `major.minor.patch` 字符串,在组件、API 等页面描述中需要包含各个功能所需求的最低基础库版本号或者客户端版本号。
+小程序基础库的版本号和客户端的版本号格式均为 `major.minor.patch`,在组件、API 等页面描述中需要包含各个功能所需的最低基础库版本号或客户端版本号。
开发者可以通过以下方式获取当前的基础库版本号和客户端版本号:
-```JavaScript
+```javascript
/**
* @description 基础库版本
* @example "2.6.8"
@@ -17,26 +16,26 @@ const sdkVersion = my.SDKVersion;
* @example "10.2.15"
*/
const clientVersion =
- my.env.clientVersion || // 基础库 1.24.10 及以上,基础库 2.4.10 及以上存在该属性
+ my.env.clientVersion || // 基础库 `1.24.10` 及以上,基础库 `2.4.10` 及以上存在该属性
my.getSystemInfoSync().clientVersion;
```
-关于 `x.y.z` 形式 `.` 分隔数字字符串的判断函数,有如下示例:
+关于 `x.y.z` 形式,`.` 分隔数字字符串的判断函数,有如下示例:
-```JavaScript
+```javascript
/**
- * @param {string} v1
- * @param {string} v2
- * @returns {-1 | 0 | 1}
+ * @param {string} v1 版本号1
+ * @param {string} v2 版本号2
+ * @returns {-1 | 0 | 1} 比较结果
*/
function compareVersion(v1, v2) {
- var s1 = v1.split(".");
- var s2 = v2.split(".");
+ var s1 = v1.split('.');
+ var s2 = v2.split('.');
var len = Math.max(s1.length, s2.length);
for (let i = 0; i < len; i++) {
- var num1 = parseInt(s1[i] || "0");
- var num2 = parseInt(s2[i] || "0");
+ var num1 = parseInt(s1[i] || '0');
+ var num2 = parseInt(s2[i] || '0');
if (num1 > num2) {
return 1;
@@ -48,13 +47,12 @@ function compareVersion(v1, v2) {
return 0;
}
-// v1 > v2 则返回值为 1
-1 === compareVersion("2.6.8", "1.24.10");
+// `v1` > `v2` 则返回值为 `1`
+1 === compareVersion('2.6.8', '1.24.10');
-// v1 = v2 则返回值为 0
-0 === compareVersion("2.6", "2.6.0");
+// `v1` = `v2` 则返回值为 `0`
+0 === compareVersion('2.6', '2.6.0');
```
-
# canIUse 检测
基础库提供了 [my.canIUse](https://opendocs.alipay.com/mini/api/can-i-use) 接口,可用于以下各类兼容性判断。
@@ -64,13 +62,13 @@ function compareVersion(v1, v2) {
对于新增 API,可以参照以下代码来判断当前基础库是否支持该 API:
```JavaScript
-if (my.getLocation) {
- my.getLocation();
+if (my.canIUse('getLocation')) {
+ my.getLocation();
} else {
// 如果希望用户在最新版本的客户端上体验您的小程序,可以这样提示
my.alert({
- title: '提示',
- content: '当前支付宝版本过低,无法使用此功能,请升级最新版本支付宝'
+ title: '提示',
+ content: '当前支付宝版本过低,无法使用此功能,请升级到最新版本支付宝。'
});
}
```
@@ -80,10 +78,10 @@ if (my.getLocation) {
对于现有 API 新增的入参,可以参照以下示例代码进行判断:
```JavaScript
-if (my.canIUse("getLocation.object.type")) {
- // 支持
+if (my.canIUse('getLocation.object.type')) {
+ // 支持
} else {
- // 不支持,需要处理兼容问题
+ // 不支持,需要处理兼容问题。
}
```
@@ -92,16 +90,15 @@ if (my.canIUse("getLocation.object.type")) {
对于现有 API 新增了返回值,可以参照以下代码来判断:
```JavaScript
-if (my.canIUse("getSystemInfo.return.storage")) {
- // 支持
+if (my.canIUse('getSystemInfo.return.storage')) {
+ // 支持
} else {
- // 不支持,需要处理兼容问题
+ // 不支持,需要处理兼容问题。
}
```
-
## 新增基础组件属性检测
-对于现有基础组件新增属性,在低版本基础库上会静默忽略该属性,针对性降级处理可参照以下代码:
+对于现有基础组件新增属性,在低版本基础库上会静默忽略该属性。针对性降级处理可参照以下代码:
.js 示例代码:
@@ -109,7 +106,7 @@ if (my.canIUse("getSystemInfo.return.storage")) {
// page.js
Page({
data: {
- canIUseButtonShare: my.canIUse("button.open-type.share"),
+ canIUseButtonShare: my.canIUse('button.open-type.share'),
},
});
```
@@ -118,29 +115,29 @@ Page({
```HTML
-
+
```
# 设置最低基础库版本
-为解决低版本基础库无法兼容小程序新功能的问题,开发者可设置小程序最低基础库版本要求。登录 [开放平台控制台](https://openhome.alipay.com/dev/workspace) > 进入对应小程序详情页 > **设置** > **基础设置**,可设置小程序的最低基础库版本。若小程序用户使用的基础库版本低于设置的最低版本要求,则无法正常使用小程序,并将提示用户更新支付宝版本。设置版本号后,小程序需重新发版才会生效。
+为解决低版本基础库无法兼容小程序新功能的问题,开发者可以设置小程序的最低基础库版本要求。登录 [开放平台控制台](https://openhome.alipay.com/dev/workspace) > 进入对应小程序详情页 > **设置** > **基础设置**,即可设置小程序的最低基础库版本。若小程序用户使用的基础库版本低于设置的最低版本要求,则无法正常使用小程序,并将提示用户更新支付宝版本。设置版本号后,小程序需重新发版才会生效。

-点击 **最低基础库版本**, 对应的 **设置** 按钮,可看到不同的最低基础库版本对应的受影响用户 UV 占比,即近 30 天内访问小程序的用户的基础库版本小于所选版本的占比。开发者可据此设置小程序的最低基础库版本。选中需设置为最低基础库版本的版本号,点击 **确定** 按钮,即设置成功。
+点击**最低基础库版本**对应的**设置**按钮,可以看到不同最低基础库版本对应的受影响用户 UV 占比。该占比指的是近 30 天内访问小程序的用户中基础库版本小于所选版本的比例。开发者可以据此设置小程序的最低基础库版本。选中需设置为最低基础库版本的版本号,点击**确定**按钮,设置即成功。

-此时,**最低基础库版本** 设置项对应的状态变为 **已设置**。
+此时,**最低基础库版本**设置项对应的状态变为**已设置**。

# 常见问题
-## Q:小程序 API 如果不兼容该怎么处理?
+**Q:小程序 API 如果不兼容该怎么处理?**
-A:可以使用 [my.canIUse(String)](https://opendocs.alipay.com/mini/api/can-i-use) 做兼容判断,如果需要可以使用 my.ap.updateAlipayClient 对支付宝端进行提示升级。
+**A**:可以使用[my.canIUse](https://opendocs.alipay.com/mini/api/can-i-use) 进行兼容性判断。必要时,可利用 my.ap.updateAlipayClient 向支付宝端用户提示升级。
# 相关文档
diff --git "a/mini/framework/\345\210\206\345\214\205\345\212\240\350\275\275.md" "b/mini/framework/\345\210\206\345\214\205\345\212\240\350\275\275.md"
index a20043e97..5fbbf44de 100644
--- "a/mini/framework/\345\210\206\345\214\205\345\212\240\350\275\275.md"
+++ "b/mini/framework/\345\210\206\345\214\205\345\212\240\350\275\275.md"
@@ -1,20 +1,19 @@
**版本要求**:
- 基础库 1.14.0 或更高版本。
-- 支付宝客户端 10.1.60 或更高版本,若版本较低,建议做 [兼容处理](https://opendocs.alipay.com/mini/framework/compatibility)。
+- 支付宝客户端 10.1.60 或更高版本。若版本较低,建议做[兼容处理](https://opendocs.alipay.com/mini/framework/compatibility)。
- [小程序开发者工具](https://opendocs.alipay.com/mini/ide/overview) 0.40 或更高版本。
为了满足日益复杂的小程序业务需求,同时提升首次打开速度,支付宝小程序从客户端 10.1.60 版本开始支持分包加载功能。
-开发者可以按需将小程序划分为若干个不同的子包。小程序使用分包功能时,会默认有一个主包,启动页面和 tabBar 所有页面都放在主包中,同时包含了小程序所需的公共资源(例如 JS 脚本等)。在服务端构建时,会根据开发者的配置,打成不同的分包,用户在使用小程序进入对应分包的页面时,客户端会下载该分包,并进行解析和渲染。
+开发者可以按需将小程序划分为若干个不同的子包。当小程序使用分包功能时,会默认有一个主包,启动页面和 tabBar 所有页面都放在主包中。同时,主包包含了小程序所需的公共资源,例如 JS 脚本等。在服务端构建时,会根据开发者的配置,打成不同的分包。用户在使用小程序进入对应分包的页面时,客户端会下载该分包,并进行解析和渲染。
# 使用建议
-- 对体积较大的小程序项目,建议使用此功能。
-- 主包只保留最常用的核心页面(首页、tabBar 页面和其它公共资源),将小程序中不经常使用的页面放到多个分包中,启动时只加载主包,使用时按需下载分包,不要一次性下载整个代码包,以提升首页启动速度。
-- 对于经常会访问到的待跳转页面,尽可能将该页面所在的分包配置成分包预下载,以提升页面跳转速度。
-- 如果小程序由不同的团队协作开发,建议使用此功能。
-
+- 对于体积较大的小程序项目,建议使用此功能。
+- 主包应只保留最常用的核心页面(例如首页、tabBar 页面)和小程序的其它公共资源。不经常使用的页面应放到多个分包中。启动时,只加载主包,并在使用时按需下载分包,避免一次性下载整个代码包,以提升首页启动速度。
+- 对于用户经常访问的待跳转页面,尽可能将该页面所在的分包配置为分包预下载,以便提升页面跳转速度。
+- 如果小程序由不同团队协作开发,建议使用此功能。
# 使用方法
## 配置方法
@@ -38,7 +37,7 @@
└── index
```
-开发者在 app.json 文件的 `subPackages` 字段中声明小程序的分包结构:
+开发者在 `app.json` 文件的 `subPackages` 字段中声明小程序的分包结构:
```json
{
@@ -58,38 +57,38 @@
`subPackages` 字段的配置说明如下:
-| **字段** | **类型** | **说明** |
-| -------- | ----------- | -------------- |
-| root | String | 分包根目录。 |
-| pages | StringArray | 分包页面路径。 |
-
+| 字段 | 类型 | 说明 |
+| ----- | ----------- | ------------ |
+| root | String | 分包根目录 |
+| pages | StringArray | 分包页面路径 |
## 打包与引用原则
-- 开发者配置 `subPackages` 后,服务端将按 `subPackages` 配置的路径进行打包,`subPackages` 配置路径外的目录将被默认打包到主包中。
-- 启动页面和 tabBar 的所有页面都必须放在主包中。
-- 每个分包的根目录不能是另外一个分包内的子目录。
+- 开发者配置 `subPackages` 后,服务端将按 `subPackages` 配置的路径进行打包,配置路径外的目录默认打包到主包中。
+- 启动页面和 tabBar 的所有页面必须放在主包中。
+- 每个分包的根目录不能是其他分包的子目录。
- 主包页面路径不能属于任何一个分包的根目录下。
-- 分包之间不能相互引用对方包中的资源(例如图片和 JS 脚本等),分包可以引用主包和自己包内的资源。
-- 分包和主包是分别独立打包的,同一个 JS 模块会在主包和分包中分别存在。
+- 分包之间不可引用对方包中的资源(例如图片和 JS 脚本等),分包可以引用主包和自己包内的资源。
+- 分包和主包是分别独立打包的,同一 JS 模块在主包和分包中会分别存在。
## 分包大小限制
-- 整个小程序所有分包大小不超过 8MB。
-- 单个分包或主包大小不能超过 2MB。
+- 整个小程序所有分包大小不得超过 8 MB。
+- 单个分包或主包大小不得超过 2 MB。
-**说明**:目前对分包个数没有限制。
+**说明**:目前对分包个数无限制。
## 查看当前分包大小
-若已完成分包加载配置,可在小程序开发者工具点击 **详情** 查看小程序当前分包大小。
+若已完成分包加载配置,可在小程序开发者工具中点击 **详情**,查看小程序当前分包大小。
## 低版本兼容
-支付宝服务端构建平台负责处理低版本客户端的兼容,服务端会编译并打包成两份源码包,一份是分包后的代码包,另一份是整包的兼容代码包。支持分包的新客户端使用分包,不支持分包的低版本客户端使用整包。
+支付宝服务端构建平台负责处理低版本客户端的兼容问题。服务端会编译打包两份源码包,一份是分包后的代码包,另一份是整包的兼容代码包。支持分包的新客户端使用分包,不支持分包的低版本客户端使用整包。
+下面是根据《优秀技术文档的写作标准》修改后的文本:
## 分包预下载
-开发者可以通过在 app.json 里的 `preloadRule` 字段进行配置,在进入小程序某个页面时,由框架自动下载可能需要的分包,以提升分包页面的启动速度。一个典型的分包预加载配置如下:
+开发者可以通过 `app.json` 里的 `preloadRule` 字段进行配置,在进入小程序某个页面时,由框架自动下载可能需要的分包,以提升分包页面的启动速度。一个典型的分包预加载配置如下:
```json
{
@@ -128,18 +127,22 @@
}
```
-`preloadRule` 字段中,`key` 是页面路径,`value` 是进入此页面后预下载的配置,每个配置的选项说明如下:
+`preloadRule` 字段中,`key` 是页面路径,`value` 是进入此页面后预下载的配置。每个配置的选项说明如下:
-| **字段** | **类型** | **是否必须** | **默认值** | **说明** |
-| --- | --- | --- | --- | --- |
-| packages | StringArray | 是 | 无 | 进入页面后预下载的分包的 root。 |
-| network | String | 否 | all | 在指定网络下进行预下载。
- all:不限网络。
- wifi:仅 wifi 下预下载。
|
+| 字段 | 类型 | 是否必须 | 默认值 | 说明 |
+| -------- | ------------ | -------- | ------ | ------------------------------------------ |
+| packages | StringArray | 是 | 无 | 进入页面后预下载的分包的 root。 |
+| network | String | 否 | all | 在指定网络下进行预下载。
all:不限网络。
wifi:仅在 wifi 网络下预下载。 |
+**注意**:
+- `preloadRule` 字段内的 `network` 可以不填,其默认值是 `all`,即不限制网络状态。
+- `packages` 内填写的是需要预下载的分包的 root。
+- 请确认网络状态与预下载设置相符合,例如,如果设置为 `wifi`,则会仅在 wifi 状态下进行预下载。
# 常见问题
## Q:小程序超过大小限制,应该分包还是减少模块?
-A:小程序最大限制是 2MB,如果超过了可以进行代码优化,把一些图片放到服务器中来减小包的大小。如果实在没法控制,可以使用小程序分包。
+A:小程序最大限制是 2MB。如果超过,首先尝试通过代码优化减少包大小,例如将图片资源迁移到服务器。若包大小仍难以控制,可以考虑使用小程序的分包功能。
# 相关文档
diff --git "a/mini/framework/\345\234\272\346\231\257\345\200\274\345\210\227\350\241\250.md" "b/mini/framework/\345\234\272\346\231\257\345\200\274\345\210\227\350\241\250.md"
index 0a712428c..c9da961f5 100644
--- "a/mini/framework/\345\234\272\346\231\257\345\200\274\345\210\227\350\241\250.md"
+++ "b/mini/framework/\345\234\272\346\231\257\345\200\274\345\210\227\350\241\250.md"
@@ -1,6 +1,5 @@
-
# 场景值列表
-| **场景值ID** | **场景值说明** | **图例** |
+| 场景值 ID | 场景值说明 | 图例 |
| --- | --- | --- |
| 1000 | 首页十二宫格及更多 | [查看](https://mdn.alipayobjects.com/portal_mdssth/afts/img/A*61_6SpPPDI4AAAAAAAAAAAAAAQAAAQ/original) |
| 1002 | 我的小程序入口 | [查看](https://mdn.alipayobjects.com/portal_mdssth/afts/img/A*EgpkTLXbTJAAAAAAAAAAAAAAAQAAAQ/original) |
@@ -15,14 +14,13 @@
| 1038 | 从另一个小程序返回 | - |
| 1200 | 市民中心(原城市服务频道) | [查看](https://mdn.alipayobjects.com/portal_mdssth/afts/img/A*fG0-RobYOmwAAAAAAAAAAAAAAQAAAQ/original) |
| 1201 | 芝麻信用频道 | [查看](https://mdn.alipayobjects.com/portal_mdssth/afts/img/A*2pglQJ395soAAAAAAAAAAAAAAQAAAQ/original) |
-| 1202 | 出行(原车主服务频道) | [查看](https://mdn.alipayobjects.com/portal_mdssth/afts/img/A*F25OSrRjo3UAAAAAAAAAAAAAAQAAAQ/original) |
+| 1202 | 出行(原车主服务频道) | [查看](https://mdn.alipayobjects.com/portal_mdssth/afts/img/A*F25OSrRjo3UAAAAAAAAAAAAAAQAAAQ/original) |
| 1205 | 支付宝就业小程序 | [查看](https://mdn.alipayobjects.com/portal_mdssth/afts/img/A*1trPRJFjcBwAAAAAAAAAAAAAAQAAAQ/original) |
| 1208 | 支付宝学生特惠小程序 | [查看](https://mdn.alipayobjects.com/portal_mdssth/afts/img/A*ommwQLakgp0AAAAAAAAAAAAAAQAAAQ/original) |
| 1209 | 支付宝会员频道 | [查看](https://mdn.alipayobjects.com/portal_mdssth/afts/img/A*iFraTIWBs9QAAAAAAAAAAAAAAQAAAQ/original) |
-| 1400 | 付费流量(通过商家数字推广平台,灯火等投放的广告) | - |
+| 1400 | 付费流量(通过商家数字推广平台,灯火等投放的广告) | - |
| 1401 | 卡包 | - |
| 1403 | 支付成功页 | - |
-| 1300 | 第三方 APP(如钉钉)打开,在跳转链接中传入访问来源参数:chInfo=ch_orderCenter,
跳转链接拼接方法,可查看 [小程序跳转 FAQ](https://opendocs.alipay.com/mini/0090ty)。| - |
-| 1305 | 支付宝 push 消息(同 1014)。 | - |
-| 0000 | 其他渠道场景渠道。 | - |
-
+| 1300 | 第三方 APP(如钉钉)打开,在跳转链接中传入访问来源参数:`chInfo=ch_orderCenter`,跳转链接拼接方法,可查看[小程序跳转 FAQ](https://opendocs.alipay.com/mini/0090ty)。 | - |
+| 1305 | 支付宝 `push` 消息(同 1014)。 | - |
+| 0000 | 其他渠道场景 | - |
diff --git "a/mini/framework/\345\237\272\347\241\200\345\272\223/\345\237\272\347\241\200\345\272\223 2.x \345\215\207\347\272\247.md" "b/mini/framework/\345\237\272\347\241\200\345\272\223/\345\237\272\347\241\200\345\272\223 2.x \345\215\207\347\272\247.md"
index 00b51fc89..d7244b983 100644
--- "a/mini/framework/\345\237\272\347\241\200\345\272\223/\345\237\272\347\241\200\345\272\223 2.x \345\215\207\347\272\247.md"
+++ "b/mini/framework/\345\237\272\347\241\200\345\272\223/\345\237\272\347\241\200\345\272\223 2.x \345\215\207\347\272\247.md"
@@ -1,72 +1,80 @@
# 简介
-为了进一步优化小程序体验,支付宝在基础库 1.x 的基础上,升级迭代了基础库 2.x,相比于基础库 1.x,基础库 2.x 有以下特点:
+为了进一步优化小程序体验,支付宝在基础库 1.x 的基础上,升级迭代了基础库 2.x。相比于基础库 1.x,基础库 2.x 有以下特点:
- 启动性能、渲染性能、内存占用等方面均有大幅改善。
- 在自定义组件系统、SJS 脚本、插件接入、按需加载上提供了更丰富及完备的能力。
-- 在开放能力上提供了更多基础组件、API。
+- 在开发能力上提供了更多基础组件、API。
- 在开发者工具上提供了更详细的调试面板、热更新能力。
-基础库 2.x 完全兼容于基础库 1.x ,自 2020 年起已稳定运行至今,完整更新日志见 [基础库 2.x 更新日志](https://opendocs.alipay.com/mini/ide/framework-changelog-v2)。
+
+基础库 2.x 完全兼容于基础库 1.x,自 2020 年起已稳定运行至今,完整更新日志见[基础库 2.x 更新日志](https://opendocs.alipay.com/mini/ide/framework-changelog-v2)。
# 升级步骤
## 第一步:IDE 配置
-[下载](https://opendocs.alipay.com/mini/ide/download) 开发者工具(v2.5.3 Beta 版或以上)最新版本,在 **详情** > **项目配置**中,勾选 **启用小程序基础库 2.0 构建**,IDE 会在配置文件 **mini.project.json** 中把 **enableAppxNg** 字段设置为 **true**。
+[下载](https://opendocs.alipay.com/mini/ide/download)开发者工具(v2.5.3 Beta 版或以上)的最新版本,在**详情** > **项目配置**中,勾选**启用小程序基础库 2.0 构建**,IDE 会在配置文件**mini.project.json**中把**enableAppxNg**字段设置为**true**。

也可以直接修改代码切换到基础库 2.x:
1. 在小程序项目目录下,找到 mini.project.json 配置文件(若无则可以新建)。
-2. 在 mini.project.json 中,配置上 `enableAppxNg: true` 字段。
+2. 在 mini.project.json 中,配置上`enableAppxNg: true`字段。
## 第二步:调试
-配置完毕后,在 **调试器** > **控制台**,输入 [my.SDKVersion](https://opendocs.alipay.com/mini/api/sdk-version) 回车,能够看到当前的基础库版本。
+
+配置完毕后,在**调试器** > **控制台**,输入[my.SDKVersion](https://opendocs.alipay.com/mini/api/sdk-version)回车,能够看到当前的基础库版本。
+

真机调试模式也可以在右侧设备信息查看基础库版本。
+

## 第三步:上传发布
-上传小程序版本后,可以先生成 [体验版](https://opendocs.alipay.com/mini/ide/beta) 进行基础库 2.x 预览验证,确认无误后提审并灰度上架。
+
+上传小程序版本后,可以先生成[体验版](https://opendocs.alipay.com/mini/ide/beta)进行基础库 2.x 预览验证,确认无误后提审并灰度上架。
+

如上架过程中出现问题,可以直接回滚至上一个未启用基础库 2.x 的版本。
-
+
# 常见问题
-如果在升级过程中遇到任何问题,可点击界面右侧 **在线咨询** 联系技术支持。
+
+如果在升级过程中遇到任何问题,可点击界面右侧**在线咨询**联系技术支持。
## 运行时
-请观察启用基础库 2.x 之后线上异常报错的变化趋势,建议使用 [质量洞察](https://opendocs.alipay.com/mini/ide/quality-insight) 先行排查,如遇无法排查问题可点击界面右侧 **在线咨询** 联系技术支持。
+
+请观察启用基础库 2.x 之后线上异常报错的变化趋势,建议使用[质量洞察](https://opendocs.alipay.com/mini/ide/quality-insight)先行排查,如遇无法排查问题可点击界面右侧**在线咨询**联系技术支持。
+
## 编译
基础库 2.x 的编译模式更为严格,以下是一些常见编译问题。
-### Q:提示“Please set enableNodeModuleBabelTransform to true or add "xxx" to node_modules_es6_whitelist in mini.project.json for node_modules babel transform”,如何处理?
+### Q:提示“Please set enableNodeModuleBabelTransform to true or add 'xxx' to node_modules_es6_whitelist in mini.project.json for node_modules babel transform”,如何处理?
A:一般情况下是由于存在 ES6 以上语法导致。
-- 看报错的模块是否是 node_modules 内的模块。
- - 如果不是,则说明存在外部资源引用,检查本地项目下是否有源码文件做了 npm link 。
- - 如果是,按照提示添加 enableNodeModuleBabelTransform 或添加 node_modules_es6_whitelist,看问题是否解决。
-- 如果仍然未解决,可能有如下两种可能:
- - 该依赖并非存放在 app.json 所在目录下的 node_modules,而是上级目录或者 npm link 到了外部目录,这种情况下需要将该依赖移动到 app.json 所在目录下的 node_modules。
- - 该依赖为多级嵌套 node_modules 内,目前由于各种历史原因,并未支持多级 node_modules 嵌套解析,这种情况下建议安装一遍相同版本依赖,做成小程序的直接依赖即可解决。
-- 如果还未解决,准备好复现代码压缩包,联系支付宝技术支持排查。
+- 查看报错的模块是否是 node_modules 内的模块。
+ - 如果不是,则说明存在外部资源引用。请检查本地项目下是否有源码文件做了 npm link。
+ - 如果是,按照提示添加 enableNodeModuleBabelTransform 或添加 node_modules_es6_whitelist,然后查看问题是否能解决。
+- 如果问题仍未解决,可能存在以下两种情况:
+ - 该依赖并非存放在 app.json 所在目录下的 node_modules,而是上级目录或者 npm link 到了外部目录。这种情况下需要将该依赖移动到 app.json 所在目录下的 node_modules。
+ - 该依赖存在于多级嵌套的 node_modules 内。目前由于各种历史原因,并未支持多级 node_modules 的嵌套解析。这种情况下,建议重新安装同版本依赖,使其变为小程序的直接依赖,以解决问题。
+- 若依然未能解决问题,准备好复现问题的代码压缩包,并联系支付宝技术支持进行排查。
### Q:提示“SyntaxError: identifier(foo) is disallowed in sjs”,如何处理?
-A:foo 变量未定义,可能是变量定义的写法不标准引起的,尝试在代码中报错的位置向上寻找变量定义的位置,检查一下语法。
+A:foo 变量未定义,可能是变量定义的写法不规范导致。建议检查错误提示中的代码位置,并向上追溯查找变量定义位置,以修正语法。
-示例代码
+示例代码:
```JavaScript
-varfoo = 'bar'; // 这里应该改成 'var foo'
+var foo = 'bar'; //原文为 varfoo,此处应改为 var foo
console.log(foo);
```
+Q:提示 "no multiple condition",如何处理?
-### Q:提示“no multiple condition”,如何处理?
-
-A:原因:同一个 中 `a:else` , `a:if` 属性不能同时存在,需要根据实际的业务逻辑修改。详情可查看 [条件渲染](https://opendocs.alipay.com/mini/framework/conditional-render) 。
+A:原因:同一个元素中 `a:else` 和 `a:if` 属性不能同时存在,需要根据实际的业务逻辑修改。详情可查看 [条件渲染](https://opendocs.alipay.com/mini/framework/conditional-render)。
报错代码:
@@ -89,12 +97,11 @@ A:原因:同一个 中 `a:else` , `a:if` 属性不能同时存在,需要
...
```
-
### Q:错误信息:foo => foo 应该为 JSON 格式,如何处理?
-A:原因: AXML 中不支持箭头函数,在老基础库中的变现为构建成功,但是箭头函数返回值永远为 false。
+A:原因:AXML 中不支持箭头函数。在老基础库中,这会导致构建成功,但箭头函数的返回值永远为 false。
-解决:下面一类 case,可以将 AXML 中的函数写到 SJS 中,详情可查看 [sjs 介绍](https://opendocs.alipay.com/mini/framework/sjs) 。
+解决:以下类别的 case,可以将 AXML 中的函数写到 SJS 中。详情可查看 [SJS 介绍](https://opendocs.alipay.com/mini/framework/sjs)。
报错代码:
@@ -110,11 +117,13 @@ A:原因: AXML 中不支持箭头函数,在老基础库中的变现为构建
```JavaScript
// pages/home/index.sjs
function filterFooList(fooList) {
- return fooList.filter(foo => (!!foo))
+ return fooList.filter(function(foo) {
+ return !!foo;
+ });
}
export default {
- filterFooList,
+ filterFooList
};
```
@@ -126,12 +135,12 @@ export default {
```
-### Q:Error: app.json 中 tabBar.items[x].pagePath 未为字符串,如何处理?
-A:原因: app.json 中的 tabBar 配置不合法,表现为整个 tabBar 不显示。
+### Q:错误信息:app.json 中 tabBar.items[x].pagePath 未为字符串,如何处理?
-解决方案: 删除 app.json 中的 tabBar 配置。
+A:原因:app.json 中的 tabBar 配置不合法,表现为整个 tabBar 不显示。
+解决方案:删除 app.json 中的 tabBar 配置。
### Q:提示“Module Error (from xxx): pages/foo/index.acss:2:3: Unexpected }”,如何处理?
A:原因:ACSS 语法不标准。
@@ -153,4 +162,3 @@ A:原因:ACSS 语法不标准。
padding-right: 3rpx;
}
```
-
diff --git "a/mini/framework/\345\237\272\347\241\200\345\272\223/\345\237\272\347\241\200\345\272\223\344\273\213\347\273\215.md" "b/mini/framework/\345\237\272\347\241\200\345\272\223/\345\237\272\347\241\200\345\272\223\344\273\213\347\273\215.md"
index f892c41c3..b5abc0dff 100644
--- "a/mini/framework/\345\237\272\347\241\200\345\272\223/\345\237\272\347\241\200\345\272\223\344\273\213\347\273\215.md"
+++ "b/mini/framework/\345\237\272\347\241\200\345\272\223/\345\237\272\347\241\200\345\272\223\344\273\213\347\273\215.md"
@@ -1,29 +1,27 @@
-基础库是负责小程序框架的加载的容器,提供小程序框架需要的标准组件和标准 API 接口。
+基础库负责加载小程序框架,提供所需的标准组件和 API 接口。
# 基础库与客户端的关系
-小程序能力需要支付宝客户端来支撑,每一版基础库新增能力都需要特定版本以上客户端才能运行,高版本基础库的某些新能力无法兼容低版本客户端,关于基础库兼容方法,可参见 [兼容](https://opendocs.alipay.com/mini/framework/compatibility) 文档。
+小程序的能力依赖于支付宝客户端,新版基础库增加的新能力,要求特定版本以上的客户端才能运行。低版本客户端无法兼容高版本基础库的部分新功能。关于基础库兼容性的更多信息,参见[兼容](https://opendocs.alipay.com/mini/framework/compatibility)文档。
-通过 [my.SDKVersion](https://opendocs.alipay.com/mini/api/sdk-version) 查看当前基础库版本号。
+通过[my.SDKVersion](https://opendocs.alipay.com/mini/api/sdk-version)可查看当前基础库版本号。
# 基础库更新时机
-当基础库准备更新时,会在客户端内进行逐步灰度直到全量发布。
-
新版本发布后一般会在 1~2 星期内覆盖 98% 以上的用户,查看 [更新日志](https://opendocs.alipay.com/mini/00d5f5)。
-
当用户客户端更新至最新基础库后,小程序就会运行在最新的基础库上。
-
-随着基础库的不断更新,老版本客户端不支持的能力越来越多,所以基础库支持范围有一个最低客户端版本的要求,即部分老版本客户端以后将无法更新到最新的基础库,会停留在某一历史版本。例如,如果用户的支付宝客户端版本是 **1.0.0** 版本,那么基础库最多更新到 **1.1.0**,详情可查看 [v1.x 版本](https://opendocs.alipay.com/mini/ide/framework-changelog)。
+基础库更新前,会在客户端内逐步灰度,直至全面发布。新版本发布后,一般在 1~2 星期内,会覆盖 98% 以上用户,请查看[更新日志](https://opendocs.alipay.com/mini/00d5f5)。当用户客户端升级到最新的基础库后,小程序便会在最新的基础库上运行。
+由于基础库不断更新,不支持新能力的老版本客户端越来越多。因此,最低客户端版本是基础库支持范围的一个前提条件。这意味着,部分老版本客户端将无法更新至最新的基础库,而是停留在某个历史版本。例如,若用户支付宝客户端版本为 **1.0.0**,则基础库最多只能更新至 **1.1.0**。详情请参阅[v1.x 版本](https://opendocs.alipay.com/mini/ide/framework-changelog)。
# 基础库版本分布
-当前小程序基础库存在 **1.x** 和 **2.x** 版本,在新版本客户端上同时存在,详情可查看 [基础库 2.x 升级](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2),对应的版本分布如下:
+当前小程序基础库存在 1.x 和 2.x 版本,在新版本客户端上同时存在,详情可查看[基础库 2.x 升级](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2)。对应的版本分布如下:
## v2.x
-更新时间:2024 年 01 月 11 日。
-> \- 代表此版本占比低于 0.01%。
+更新时间:2024 年 1 月 11 日。
+
+> “-” 代表此版本占比低于 0.01%。
-| **基础库版本** | **用户占比** | **支付宝客户端最低版本** |
+| 基础库版本 | 用户占比 | 支付宝客户端最低版本 |
| --- | --- | --- |
| >=2.9.11 | 95.73% | 10.1.92 |
| 2.9.9 | 3.86% | 10.1.92 |
@@ -37,8 +35,8 @@
| 2.8.17 | 0.01% | 10.1.92 |
| 2.8.15 | - | 10.1.92 |
| 2.8.12 | - | 10.1.92 |
-| 2.8.11 | - | 10.1.92 |
-| 2.8.10 | 0.01%| 10.1.92 |
+| 2.8.11 | - | 10.1.92 |
+| 2.8.10 | 0.01% | 10.1.92 |
| 2.8.9 | - | 10.1.92 |
| 2.8.8 | 0.01% | 10.1.92 |
| 2.8.7 | - | 10.1.92 |
@@ -58,34 +56,34 @@
| 2.7.18 | - | 10.1.92 |
| 2.7.17 | - | 10.1.92 |
| 2.7.16 | - | 10.1.92 |
-| 其它 | 0.15% | 10.1.92 |
+| 其他 | 0.15% | 10.1.92 |
## v1.x
更新时间:2021 年 12 月 13 日。
-| **基础库版本** | **用户占比** | **支付宝客户端最低版本** |
-| -------------- | ------------ | ------------------------ |
-| >=1.25.4 | 99.18% | 10.1.75 |
-| 1.25.3 | 0.02% | 10.1.75 |
-| 1.25.1 | 0.02% | 10.1.75 |
-| 1.24.13 | 0.74% | 10.1.75 |
-| 其它 | 0.04% | - |
+| 基础库版本 | 用户占比 | 支付宝客户端最低版本 |
+| ----------- | ------- | ------------------ |
+| >=1.25.4 | 99.18% | 10.1.75 |
+| 1.25.3 | 0.02% | 10.1.75 |
+| 1.25.1 | 0.02% | 10.1.75 |
+| 1.24.13 | 0.74% | 10.1.75 |
+| 其它 | 0.04% | - |
# 设置最低基础库版本
-登录 [开放平台控制台](https://open.alipay.com/dev/workspace) > 进入小程序详情页 > **小程序信息** > **基础设置**,可设置小程序的最低基础库版本。若小程序用户使用的基础库版本低于设置的最低版本要求,则无法正常使用小程序,并将提示用户更新支付宝版本。设置版本号后,小程序需重新发版才会生效。
+登录 [开放平台控制台](https://open.alipay.com/dev/workspace),进入小程序详情页 > **小程序信息** > **基础设置**,可设置小程序的最低基础库版本。如果小程序用户使用的基础库版本低于设置的最低版本要求,则无法正常使用小程序,并会提示用户更新支付宝版本。设置版本号后,应重新发布小程序,该设置才会生效。
-**注意**:请确保已完成 [基础库 2.x 升级](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2),才能将最低基础库版本号设置为基础库 2.0 对应的版本号,否则在真机上会一直提示升级支付宝版本。
+**注意**:请确保已完成[基础库 2.x 升级](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2),才能将最低基础库版本号设置为基础库 2.0 对应的版本号,否则在真机上会一直提示升级支付宝版本。

-点击 **最低基础库版本** 对应的 **设置** 按钮,可看到不同的最低基础库版本对应的受影响用户 UV 占比,即近 30 天内访问小程序的用户的基础库版本小于所选版本的占比。开发者可据此设置小程序的最低基础库版本。
+点击 **最低基础库版本** 对应的 **设置** 按钮,可查看不同的最低基础库版本对应的受影响用户 UV 占比。即近 30 天内访问小程序的用户中,基础库版本低于所选版本的用户占比。开发者可据此设置小程序的最低基础库版本。
-选中需设置为最低基础库版本的版本号,点击 **确定** 按钮,即设置成功。
+选择需设置为最低基础库版本的版本号,点击 **确定** 按钮,即可完成设置。

-此时,**最低基础库版本** 设置项对应的状态变为 **已设置**。
+此时,**最低基础库版本** 设置项对应的状态显示为 **已设置**。

@@ -93,14 +91,13 @@
## Q:如何更新基础库版本?
-A:没有 API 去执行更新的,是根据支付宝客户端版本来更新的。
+A:目前没有可直接调用的 API 完成更新。基础库的更新依赖于支付宝客户端的版本升级。
## Q:如何切换 IDE 使用的基础库?
-A:支付宝小程序 IDE 从 2.9 版本开始,支持切换运行的基础库版本。若要切换基础库版本,请点开模拟器顶部的四叶草设置菜单,点击 **设置**,便可以选择基础库版本进行模拟运行。**注意**:使用该功能需要保持网络通畅。
+A:从支付宝小程序 IDE 2.9 版本起,支持切换要运行的基础库版本。想切换基础库版本,可点击模拟器顶部的四叶草设置菜单,选择 **设置**,之后选择相应的基础库版本进行模拟运行。**注意**:使用该功能时,应保持网络畅通。

-
# 相关文档
- [兼容](https://opendocs.alipay.com/mini/framework/compatibility)
diff --git "a/mini/framework/\345\237\272\347\241\200\350\203\275\345\212\233/\350\207\252\345\256\232\344\271\211 tabBar.md" "b/mini/framework/\345\237\272\347\241\200\350\203\275\345\212\233/\350\207\252\345\256\232\344\271\211 tabBar.md"
index 2ababd48e..c1a36577d 100644
--- "a/mini/framework/\345\237\272\347\241\200\350\203\275\345\212\233/\350\207\252\345\256\232\344\271\211 tabBar.md"
+++ "b/mini/framework/\345\237\272\347\241\200\350\203\275\345\212\233/\350\207\252\345\256\232\344\271\211 tabBar.md"
@@ -1,9 +1,10 @@
# 简介
-[tabBar](https://opendocs.alipay.com/mini/00prvl) 作为支付宝小程序基础能力,提供底部操作栏进行切换页面。自定义 tabBar 作为补充能力,可以让开发者更加灵活地设置 tabBar,以满足更多个性化的场景。
在自定义 tabBar 模式下:
-- 开发者需要提供一个自定义组件来进行 tabBar 的渲染及交互。
-- 与 tabBar 样式相关的接口将失效。如 [my.hideTabBar](https://opendocs.alipay.com/mini/api/at18z8) 等。
-- 每个页面的 tabBar 组件实例是不同的,可通过 [getTabBar](https://opendocs.alipay.com/mini/framework/page-detail#Page.getTabBar) 接口获取 tabBar 组件实例。
+[tabBar](https://opendocs.alipay.com/mini/00prvl) 作为支付宝小程序基础能力,提供底部操作栏进行切换页面。自定义 `tabBar` 作为补充能力,可以让开发者更加灵活地设置 `tabBar`,以满足更多个性化的场景。
在自定义 `tabBar` 模式下:
+
+- 开发者需要提供一个自定义组件来进行 `tabBar` 的渲染及交互。
+- 与 `tabBar` 样式相关的接口将失效。例如 [my.hideTabBar](https://opendocs.alipay.com/mini/api/at18z8) 等。
+- 每个页面的 `tabBar` 组件实例是不同的,可通过 [getTabBar](https://opendocs.alipay.com/mini/framework/page-detail#Page.getTabBar) 接口获取 `tabBar` 组件实例。
## 版本要求
@@ -11,64 +12,63 @@
- 支付宝客户端 10.2.63 及以上版本。
- [小程序开发者工具](https://opendocs.alipay.com/mini/ide/overview) 3.1.2 及以上版本。
-若版本较低,则显示原始 tabBar,为保证兼容性,tabBar 的相关配置**建议完整声明**。
-
+若版本较低,则显示原始 `tabBar`,为保证兼容性,`tabBar` 的相关配置**建议完整声明**。
# 使用流程
## 1. 配置信息
-在现有 tabBar 配置基础上新增`customize`字段。
+在现有 tabBar 配置基础上新增 `customize` 字段。
### app.json 示例
```json
{
- "pages": [
- "pages/index/index",
- "pages/index/index2"
- ],
- "tabBar": {
- "customize": true,
- "items": [
- {
- "pagePath": "pages/index/index",
- "name": "Tab 1"
- },
- {
- "pagePath": "pages/index2/index",
- "name": "Tab 2"
- }
- ]
- }
+ "pages": [
+ "pages/index/index",
+ "pages/index2/index"
+ ],
+ "tabBar": {
+ "customize": true,
+ "items": [
+ {
+ "pagePath": "pages/index/index",
+ "name": "Tab 1"
+ },
+ {
+ "pagePath": "pages/index2/index",
+ "name": "Tab 2"
+ }
+ ]
+ }
}
```
## 2. 添加 tabBar 文件
约定在代码根目录下添加 tabBar 入口文件。
```powershell
-├── customize-tab-bar # 自定义 tabBar 文件
+├── customize-tab-bar # 自定义 tabBar 文件
│ ├── index.acss
│ ├── index.axml
│ ├── index.js
│ └── index.json
├── components
-│ └── ...
+│ └── ...
├── pages
-│ └── ...
+│ └── ...
├── app.acss
├── app.js
├── app.json
├── mini.project.json
└── ...
```
+## 编写 tabBar 代码
-## 3. 编写 tabBar 代码
-编码规范可查看 [自定义组件](https://opendocs.alipay.com/mini/framework/custom-component-overview)。该自定义组件将完全接管 tabBar 的渲染及交互,同时,新增 [getTabBar](https://opendocs.alipay.com/mini/framework/page-detail#Page.getTabBar) 接口可获取自定义 tabBar 组件实例。
+编码规范可查看[自定义组件](https://opendocs.alipay.com/mini/framework/custom-component-overview)。该自定义组件将完全接管 tabBar 的渲染及交互。同时,新增[getTabBar](https://opendocs.alipay.com/mini/framework/page-detail#Page.getTabBar)接口,可获取自定义 tabBar 组件实例。
### 示例代码
#### customize-tab-bar/index.axml
```html
-
+
{{item.name}}
@@ -84,43 +84,41 @@ Component({
list: [
{
pagePath: "/pages/index/index",
- name: "customize1",
+ name: "customize1"
},
{
pagePath: "/pages/index2/index",
- name: "customize2",
- },
- ],
+ name: "customize2"
+ }
+ ]
},
methods: {
tap(e) {
- const data = e.target.dataset;
+ const data = e.currentTarget.dataset;
my.switchTab({
- url: data.value.pagePath,
+ url: data.value.pagePath
});
- },
- },
-})
+ }
+ }
+});
```
-
-#### pages/index/index.js
```javascript
Page({
onShow() {
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
this.getTabBar().setData({
- selected: 0,
+ selected: 0
});
}
- },
-})
+ }
+});
```
# 注意事项
-自定义 tabBar 默认 `z-index:10000`,若不满足项目实际场景可通过类名 `a-customize-tab-bar` 进行覆盖。
+自定义 tabBar 默认 `z-index:10000`,若符合项目实际需求外,可通过类名 `.a-customize-tab-bar` 进行覆盖。
```css
/* app.acss */
-.a-customize-tab-bar{
- z-index:999;
+.a-customize-tab-bar {
+ z-index: 999;
}
```
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/app.acss \345\205\250\345\261\200\346\240\267\345\274\217.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/app.acss \345\205\250\345\261\200\346\240\267\345\274\217.md"
index 37a73e85b..4c3155eb3 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/app.acss \345\205\250\345\261\200\346\240\267\345\274\217.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/app.acss \345\205\250\345\261\200\346\240\267\345\274\217.md"
@@ -1 +1 @@
-`app.acss` 作为全局样式,作用于当前小程序的所有页面。 有关 **acss** 更详细的文档可查看 [ACSS 语法参考](https://opendocs.alipay.com/mini/framework/acss) 。
+`app.acss` 作为全局样式,作用于当前小程序的所有页面。有关 **ACSS** 更详细的文档可查看 [ACSS 语法参考](https://opendocs.alipay.com/mini/framework/acss)。
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/app.js \346\263\250\345\206\214\345\260\217\347\250\213\345\272\217.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/app.js \346\263\250\345\206\214\345\260\217\347\250\213\345\272\217.md"
index c93cb81b4..86efc1237 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/app.js \346\263\250\345\206\214\345\260\217\347\250\213\345\272\217.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/app.js \346\263\250\345\206\214\345\260\217\347\250\213\345\272\217.md"
@@ -1,18 +1,18 @@
-# App(object: Object)
+# App(object:Object)
-`App()` 用于注册小程序,接受一个 `Object` 作为属性,用来配置小程序的生命周期等。`App()` 必须在 `app.js` 中调用,必须调用且只能调用一次。
+`App()` 用于注册小程序,接受一个 `Object` 作为属性,用于配置小程序的生命周期等。`App()` 必须在 `app.js` 中调用,必须调用且只能调用一次。
# object 属性说明
-| **属性** | **类型** | **描述** | **触发时机** | **基础库最低版本** |
-| --- | --- | --- | --- | --- |
-| onLaunch | Function | 生命周期回调:监听小程序初始化 | 当小程序初始化完成时触发,全局只触发一次。
参数也可以使用 [my.getLaunchOptionsSync](https://opendocs.alipay.com/mini/api/getLaunchOptionsSync) 获取。 | - |
-| onShow | Function | 生命周期回调:监听小程序显示 | 当小程序启动,或从后台进入前台显示时触发。
也可以使用 [my.onAppShow](https://opendocs.alipay.com/mini/api/nn7do1)绑定监听。 | - |
-| onHide | Function | 生命周期回调:监听小程序隐藏 | 当当前页面被隐藏时触发,例如跳转、按下设备 Home 键离开。
也可以使用 [my.onAppHide](https://opendocs.alipay.com/mini/api/tv6qvi) 绑定监听。 | - |
-| onError | Function | 监听小程序错误 | 当小程序发生 js 错误时触发。
也可以使用 [my.onError](https://opendocs.alipay.com/mini/00nnsx) 绑定监听。 | - |
-| onShareAppMessage | Function | 全局分享配置 | 调用分享时触发,如:点击页面菜单右上角的 **分享** 按钮时。 | - |
+| 属性 | 类型 | 描述 | 触发时机 | 基础库最低版本 |
+|---------------------|----------|----------------------------|------------------|-----------------------------------------|
+| onLaunch | Function | 生命周期回调:监听小程序初始化 | 当小程序初始化完成时触发,全球只触发一次。
参数也可以使用 [my.getLaunchOptionsSync](https://opendocs.alipay.com/mini/api/getLaunchOptionsSync) 获取。 | - |
+| onShow | Function | 生命周期回调:监听小程序显示 | 当小程序启动,或从后台进入前台显示时触发。
也可以使用 [my.onAppShow](https://opendocs.alipay.com/mini/api/nn7do1) 绑定监听。 | - |
+| onHide | Function | 生命周期回调:监听小程序隐藏 | 当当前页面被隐藏时触发,例如跳转、按下设备 Home 键离开。
也可以使用 [my.onAppHide](https://opendocs.alipay.com/mini/api/tv6qvi) 绑定监听。 | - |
+| onError | Function | 监听小程序错误 | 当小程序发生 js 错误时触发。
也可以使用 [my.onError](https://opendocs.alipay.com/mini/00nnsx) 绑定监听。 | - |
+| onShareAppMessage | Function | 全局分享配置 | 调用分享时触发,如:点击页面菜单右上角的 **分享** 按钮时。 | - |
| onUnhandledRejection | Function | 监听 unhandledrejection 事件 | 当 Promise 被 reject 且没有 reject 处理器时,会触发 onUnhandledRejection 事件。
也可以使用 [my.onUnhandledRejection](https://opendocs.alipay.com/mini/00nd0f) 绑定监听。 | [1.24.1](https://opendocs.alipay.com/mini/framework/lib) |
-| onPageNotFound | Function | 监听页面不存在 | 小程序要打开的页面不存在时触发。
也可以使用 [my.onPageNotFound](https://opendocs.alipay.com/mini/01zdng) 绑定监听。
不支持处理 [路由 API](https://opendocs.alipay.com/mini/api/fu8l65) 失败场景。 | [2.7.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| onPageNotFound | Function | 监听页面不存在 | 小程序要打开的页面不存在时触发。
也可以使用 [my.onPageNotFound](https://opendocs.alipay.com/mini/01zdng) 绑定监听。
不支持处理 [路由 API](https://opendocs.alipay.com/mini/api/fu8l65) 失败场景。 | [2.7.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
**前台/后台定义:**
@@ -20,26 +20,25 @@
- 当用户再次进入支付宝或再次打开小程序时,小程序会从后台进入前台。
- 只有当小程序进入后台 5 分钟后,或占用系统资源过高,才会被真正销毁。
- 小程序是否销毁、是否进入后台,也与小程序自身业务逻辑、当前内存资源占用有关。
-
## onLaunch(object: Object) 及 onShow(object: Object)
object 属性说明:
-| **属性** | **类型** | **描述** |
-| --- | --- | --- |
+| 属性 | 类型 | 描述 |
+| ---- | ------ | ---- |
| query | Object | 当前小程序的 query,从启动参数的 query 字段解析而来,解析规则可查看 [小程序全局 / 页面参数设置以及解析细节](https://opendocs.alipay.com/mini/03durs)。 |
| scene | String | 启动小程序的 [场景值](https://opendocs.alipay.com/mini/framework/scene)。 |
| path | String | 当前小程序的页面地址,从启动参数 page 字段解析而来,page 忽略时默认为首页。 |
| referrerInfo | Object | 来源信息。 |
-比如,启动小程序的 scheme 如下:
+比如,启动小程序的 scheme 如下:
```javascript
alipays://platformapi/startapp?appId=1999&query=number%3D1&page=x%2Fy%2Fz
```
- 小程序首次启动时,`onLaunch` 方法可获取 `query`、`path` 等属性值。
-
+
- 小程序处于后台时,如果从 scheme、扫二维码打开,需要在 `onShow` 方法中获取 `query`、`path` 等属性值。
```javascript
@@ -47,14 +46,14 @@ App({
onLaunch(options) {
// 第一次打开
console.log(options.query);
- // {number:1}
+ // {number: 1}
console.log(options.path);
// x/y/z
},
onShow(options) {
// 从后台被 scheme 重新打开
console.log(options.query);
- // {number:1}
+ // {number: 1}
console.log(options.path);
// x/y/z
},
@@ -63,38 +62,37 @@ App({
`referrerInfo` 子属性说明:
-| **属性** | **类型** | **描述** | **最低版本** |
-| --------- | -------- | ------------------------ | ------------ |
-| appId | String | 来源小程序。 | - |
-| extraData | Object | 来源小程序传过来的数据。 | - |
+| 属性 | 类型 | 描述 | 最低版本 |
+| --------- | ------ | ---------------------- | -------- |
+| appId | String | 来源小程序。 | - |
+| extraData | Object | 来源小程序传过来的数据。| - |
**注意**:
- 不要在 `onShow()` 中进行 [my.redirectTo](https://opendocs.alipay.com/mini/api/fh18ky) 或 [my.navigateTo](https://opendocs.alipay.com/mini/api/zwi8gx) 等操作页面栈的行为。
- 不要在 `onLaunch()` 里调用 [getCurrentPages](https://opendocs.alipay.com/mini/framework/getcurrentpages) 方法,因为此时 `page` 还未生成。
-- app.json 应用配置 `behavior` 支持配置项 `decodeQuery`,当设置为 `disable` 后,不会再对键值额外再做 `decodeComponent`,可查看 [小程序全局 / 页面参数设置以及解析细节](https://opendocs.alipay.com/mini/03durs)。
-
-## onHide()
+- `app.json` 应用配置 `behavior` 支持配置项 `decodeQuery`,当设置为 `disable` 后,不会再对键值额外再做 `decodeURIComponent`,可查看 [小程序全局 / 页面参数设置以及解析细节](https://opendocs.alipay.com/mini/03durs)。
+## onHide
-小程序从前台进入后台时触发 `onHide()` 。示例代码:
+当小程序从前台进入后台时,会触发 `onHide()` 方法。示例代码如下:
```javascript
App({
onHide() {
// 进入后台时
console.log('app hide');
- },
+ }
});
```
## onError(error, stack)
-小程序应用发生脚本错误时触发。事件也可以通过 [my.onError](https://opendocs.alipay.com/mini/00nnsx) 进行监听。其参数列表如下:
+小程序在发生脚本错误时,会触发 `onError` 事件。也可以通过 [my.onError](https://opendocs.alipay.com/mini/00nnsx) 监听该事件。参数列表如下:
-| **属性** | **类型** | **说明** |
+| 属性 | 类型 | 说明 |
| --- | --- | --- |
-| error | String | 异常描述,一般为 `Error` 对象的 `message` 字段。 |
-| stack | String | 异常堆栈,一般为 `Error` 对象的 `stack` 字段。
基础库 [2.6.6](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 及以上支持。 |
+| error | String | 异常描述,通常是 `Error` 对象的 `message` 字段。 |
+| stack | String | 异常堆栈,通常是 `Error` 对象的 `stack` 字段。
自基础库版本 [2.6.6](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持。 |
示例代码:
@@ -103,39 +101,38 @@ App({
onError(error, stack) {
// 小程序执行出错时
console.log(error);
- // 基础库2.6.6 开始支持stack参数
+ // 自基础库 2.6.6 起支持 stack 参数
console.error(stack);
- },
+ }
});
```
## onShareAppMessage(object: Object)
-全局分享配置。当页面未设置 `page.onShareAppMessage` 时,调用分享会执行全局的分享设置,具体详情请参见 [页面事件处理函数](https://opendocs.alipay.com/mini/framework/page-detail#%E9%A1%B5%E9%9D%A2%E4%BA%8B%E4%BB%B6%E5%A4%84%E7%90%86%E5%87%BD%E6%95%B0)。
-
+全局分享配置。当页面未定义 `page.onShareAppMessage` 方法时,调用分享功能将执行这个全局的分享设置。具体细节请参考 [页面事件处理函数](https://opendocs.alipay.com/mini/framework/page-detail#%E9%A1%B5%E9%9D%A2%E4%BA%8B%E4%BB%B6%E5%A4%84%E7%90%86%E5%87%BD%E6%95%B0)。
## onUnhandledRejection(object: Object)
-当`Promise` 被 `reject` 且没有 `reject` 处理器时触发。也可使用 [my.onUnhandledRejection](https://opendocs.alipay.com/mini/00nd0f) 绑定监听。参数和注意事项与 [my.onUnhandledRejection](https://opendocs.alipay.com/mini/00nd0f) 一致。示例代码:
+当 `Promise` 被 `reject` 且没有 `reject` 处理器时触发。你也可以通过绑定 `my.onUnhandledRejection` 监听来处理。参数及注意事项与 [`my.onUnhandledRejection`](https://opendocs.alipay.com/mini/00nd0f) 保持一致。示例代码:
```javascript
App({
onUnhandledRejection(res) {
- // 当小程序代码的Promise 被 reject 且没有 reject 处理器时触发。
+ // 当小程序代码中的 Promise 被 reject 且没有 reject 处理器时触发。
console.log(res.reason, res.promise);
- //res.reason 是reject原因,res.promise 是被reject的Promise对象
+ // res.reason 是 reject 原因,res.promise 是被 reject 的 Promise 对象。
},
});
```
## onPageNotFound(object: Object)
-小程序要打开的页面不存在时触发。也可以使用 [my.onPageNotFound](https://opendocs.alipay.com/mini/01zdng) 绑定监听。参数和注意事项与 my.onPageNotFound 一致。示例代码:
+小程序尝试打开的页面不存在时触发。你也可以使用 [`my.onPageNotFound`](https://opendocs.alipay.com/mini/01zdng) 绑定监听。参数和注意事项与 `my.onPageNotFound` 一致。示例代码:
```javascript
App({
onPageNotFound(res) {
my.redirectTo({
- url: '/pages/...',
+ url: '/pages/...' // 小程序不存在的页面路径
}); // 如果是 tabbar 页面,请使用 my.switchTab
},
});
@@ -143,20 +140,19 @@ App({
# globalData 全局数据
-`App()` 中可以设置全局数据 `globalData`。示例代码:
+在 `App()` 中可以设置应用的全局数据 `globalData`。示例代码:
```javascript
// app.js
App({
- globalData: 1,
+ globalData: 1, // 设置全局变量值
});
```
-
# 更多
-开发者可以添加任意的函数或数据变量到 Object 参数中,用 this 可以访问。
+开发者可以添加任意的函数或数据变量到 Object 参数中,用 `this` 可以访问。
-也可在 app.js 引入其他的公共方法,将方法挂载到 app.js 下。
+也可以在 `app.js` 引入其他的公共方法,将方法挂载到 `app.js` 下。
示例代码:
@@ -166,7 +162,7 @@ import { getUserInfo } from '/utils/getOpenUserInfo';
App({
onLaunch() {},
onShow() {
- this.login(); // 通过this访问
+ this.login(); // 通过 this 访问
},
// 自定义函数
login() {
@@ -183,7 +179,7 @@ const app = getApp();
Page({
onLoad() {
app.getUserInfo();
- app.login(); // log输出 '自定义函数'
+ app.login(); // log 输出 '自定义函数'
},
});
```
@@ -196,5 +192,5 @@ A:不可以,关闭小程序的方法仅支持小程序页面点击右上角
# 相关文档
-- [onShareAppMessage](https://opendocs.alipay.com/mini/framework/page-detail#%E9%A1%B5%E9%9D%A2%E4%BA%8B%E4%BB%B6%E5%A4%84%E7%90%86%E5%87%BD%E6%95%B0)
+- [onShareAppMessage](https://opendocs.alipay.com/mini/framework/page-detail#页事件处理函数)
- [getApp 方法](https://opendocs.alipay.com/mini/framework/get-app)
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/app.json \345\272\224\347\224\250\351\205\215\347\275\256.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/app.json \345\272\224\347\224\250\351\205\215\347\275\256.md"
index 19cf2bcc7..0fc186ce1 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/app.json \345\272\224\347\224\250\351\205\215\347\275\256.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/app.json \345\272\224\347\224\250\351\205\215\347\275\256.md"
@@ -13,44 +13,43 @@
完整配置项如下:
-| **属性** | **类型** | **必填** | **描述** |
-| ------------------- | -------- | -------- | ------------------------------ |
-| entryPagePath | String | 否 | 小程序默认启动首页。 |
-| pages | Array | 是 | 设置页面路径。 |
-| window | Object | 否 | 设置默认页面的窗口表现。 |
-| tabBar | Object | 否 | 设置底部 tabbar 的表现。 |
-| subPackages | Object[] | 否 | 分包结构描述。 |
-| preloadRule | Object | 否 | 分包预加载规则。 |
-| plugins | Object | 否 | 静态插件配置规则。 |
-| useDynamicPlugins | Boolean | 否 | 动态插件配置规则。 |
-| usingComponents | Object | 否 | 设置全局自定义组件声明。 |
-| lazyCodeLoading | String | 否 | 是否开启代码按需执行。 |
-| permission | Object | 否 | 小程序接口权限相关配置。 |
-| behavior | Object | 否 | 修改小程序运行行为的相关设置。 |
-| workers | Array | 否 | 设置 Worker 代码文件列表。 |
+| 属性 | 类型 | 必填 | 描述 |
+| --------------- | -------- | ---- | -------------------------- |
+| entryPagePath | String | 否 | 小程序默认启动首页 |
+| pages | Array | 是 | 设置页面路径 |
+| window | Object | 否 | 设置默认页面的窗口表现 |
+| tabBar | Object | 否 | 设置底部 tab 的表现 |
+| subPackages | Object[] | 否 | 分包结构描述 |
+| preloadRule | Object | 否 | 分包预加载规则 |
+| plugins | Object | 否 | 静态插件配置规则 |
+| useDynamicPlugins | Boolean | 否 | 动态插件配置规则 |
+| usingComponents | Object | 否 | 设置全局自定义组件声明 |
+| lazyCodeLoading | String | 否 | 是否开启代码按需执行 |
+| permission | Object | 否 | 小程序接口权限相关配置 |
+| behavior | Object | 否 | 修改小程序运行行为的设置 |
+| workers | Array | 否 | 设置 Worker 代码文件列表 |
# entryPagePath
-指定小程序的默认启动路径(首页)。如果不填,将默认为 pages 列表的第一项。不支持带页面路径参数。
-
-**注意**:此特性从基础库 [2.7.20](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2),[IDE 3.1.2](https://opendocs.alipay.com/mini/ide/download) 开始支持。若强依赖此特性,建议设置最低基础库版本号为 2.7.20。否则,在低版本的基础库,会因为无法识别正确的首页而导致渲染出 **返回首页** 图标。
+指定小程序的默认启动路径(首页)。如果不填,默认为 pages 列表的第一项。不支持带页面路径参数。
+**注意**:此特性从基础库 [2.7.20](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2),[IDE 3.1.2](https://opendocs.alipay.com/mini/ide/download) 开始支持。若你强依赖此特性,建议设置最低基础库版本号为 2.7.20。在低版本的基础库中,可能无法识别正确的首页,导致渲染出“返回首页”图标。
# pages
-`app.json` 中的 `pages` 为数组属性,数组中每一项都是字符串,用于指定小程序的页面。在小程序中新增或删除页面,都需要对 `pages` 数组进行修改。
-
-`pages` 数组的每一项代表对应页面的路径信息,其中,第一项代表小程序的首页。
+- `app.json` 中的 `pages` 是一个数组属性,每个数组项都是一个字符串,指定了小程序的页面。在小程序中新增或删除页面,都需要更新这个数组。
-页面路径不需要写任何后缀,框架会自动去加载同名的 `.json`、`.js`、`.axml`、`.acss` 文件。举例来说,如果开发目录为:
+- `pages` 数组里的每一项都代表相应页面的路径信息。数组的第一项是小程序的首页。
+
+- 在指定页面路径时,无需添加文件后缀。框架会自动加载相应的 `.json`、`.js`、`.axml` 和 `.acss` 文件。例如,如果你的开发目录结构如下:
```javascript
├── pages
-│ ├──index
+│ ├── index
│ │ ├── index.json
│ │ ├── index.js
│ │ ├── index.axml
│ │ └── index.acss
-│ ├──logs
+│ ├── logs
│ │ ├── logs.json
│ │ ├── logs.js
│ │ └── logs.axml
@@ -59,7 +58,7 @@
└── app.acss
```
-`app.json` 中应当如下配置:
+那么在 `app.json` 文件中应该这样配置:
```json
{
@@ -69,7 +68,7 @@
# usingComponents
-在 app.json 中声明的自定义组件将会认为成全局自定义组件,在小程序各页面或自定义组件中可以直接使用无需额外声明。
+在 `app.json` 中声明的自定义组件,将被视为全局自定义组件。在小程序的任何页面或自定义组件中,都可以直接使用这些全局组件,无需再次声明。
```json
{
@@ -80,8 +79,7 @@
}
```
-**注意**:[IDE3.1.2](https://opendocs.alipay.com/mini/ide/download) 及以上开始支持。该功能声明的组件将要被所有页面和组件依赖,可能会影响性能,且会占用主包大小,建议开启 app.lazyCodeLoading。
-
+**注意**:自 [IDE3.1.2](https://opendocs.alipay.com/mini/ide/download) 版本起支持此功能。声明为全局的组件将被所有页面和组件所依赖,可能会影响性能,并且会占用主包的大小。建议启用 `app.lazyCodeLoading` 以优化性能。
# window
`window` 用于设置小程序的状态栏、导航条、标题、窗口背景色等。示例代码:
@@ -94,46 +92,45 @@
}
```
-| **属性** | **类型** | **必填** | **描述** | **最低版本** |
+| 属性 | 类型 | 必填 | 描述 | 最低版本 |
| --- | --- | --- | --- | --- |
-| allowsBounceVertical | String | 否 | 是否允许向下拉拽。默认 `YES`, 支持 `YES` / `NO` | - |
-| backgroundColor | HexColor | 否 | 窗口的背景色。例:白色 "#FFFFFF"。 | - |
-| backgroundImageColor | HexColor | 否 | 下拉露出显示背景图的底色。例:白色 "#FFFFFF"。**仅安卓下有效,iOS 下页面背景图底色会使用 backgroundColor 的值** | - |
-| backgroundImageUrl | String | 否 | 下拉露出显示背景图的链接。 | - |
-| defaultTitle | String | 否 | 页面默认标题。 | - |
-| enableScrollBar | String | 否 | 仅支持 Android,是否显示 `WebView` 滚动条。默认 `YES`,支持 `YES` / `NO`。 | - |
-| gestureBack | String | 否 | 仅支持 iOS,是否支持手势返回。默认 `YES`,支持 `YES` / `NO`。 | - |
-| onReachBottomDistance | Number | 否 | 页面上拉触底时触发时距离页面底部的距离,单位为 `px`,详情可查看 [页面事件处理函数](https://opendocs.alipay.com/mini/framework/page-detail#%E9%A1%B5%E9%9D%A2%E4%BA%8B%E4%BB%B6%E5%A4%84%E7%90%86%E5%87%BD%E6%95%B0)。 | [1.19.0](https://opendocs.alipay.com/mini/framework/compatibility) ,目前`iOS`在`page.json`下设置无效,只能全局设置。 |
-| pullRefresh | Boolean | 否 | 是否允许下拉刷新,默认 `false`。
**说明:**
1.下拉刷新生效的前提是 allowsBounceVertical 值为 YES。
2.window 全局配置后全局生效,但是如果单个页面配置了该参数,以页面的配置为准。 | - |
-| responsive | Boolean | 否 | `rpx` 单位是否宽度自适应 ,默认 true,当设置为 `false` 时,2 rpx 将恒等于 1 px,不再根据屏幕宽度进行自适应,注意,此时 750 rpx 将不再等于 100% 宽度。 | [1.23.0](https://opendocs.alipay.com/mini/framework/compatibility) |
-| showTitleLoading | String | 否 | 是否进入时显示导航栏的 loading。默认 `NO`,支持 `YES` / `NO`。 | - |
-| transparentTitle | String | 否 | 导航栏透明设置。默认 `none`,支持 `always` 一直透明 / `auto` 滑动自适应 / `none` 不透明。 | - |
-| titlePenetrate | String | 否 | 是否允许导航栏点击穿透。默认 `NO`,支持 `YES` / `NO`。 | - |
-| titleImage | String | 否 | 导航栏图片地址。 | - |
-| titleBarColor | HexColor | 否 | 导航栏背景色。例:白色 "#FFFFFF"。 | - |
-| navigationBarFrontColor | String | 否 | 导航栏前景色。只支持配置 `black` 或者 `white`。 | [支付宝客户端 10.5.30](https://opendocs.alipay.com/mini/framework/compatibility) |
-
+| allowsBounceVertical | String | 否 | 是否允许向下拉拽。默认 `YES`,支持 `YES` / `NO` | - |
+| backgroundColor | HexColor | 否 | 窗口的背景色。例如:白色 "#FFFFFF" | - |
+| backgroundImageColor | HexColor | 否 | 下拉露出显示背景图的底色。例如:白色 "#FFFFFF"。仅安卓下有效,iOS 下页面背景图底色会使用 backgroundColor 的值 | - |
+| backgroundImageUrl | String | 否 | 下拉露出显示背景图的链接 | - |
+| defaultTitle | String | 否 | 页面默认标题 | - |
+| enableScrollBar | String | 否 | 仅支持 Android,是否显示 `WebView` 滚动条。默认 `YES`,支持 `YES` / `NO` | - |
+| gestureBack | String | 否 | 仅支持 iOS,是否支持手势返回。默认 `YES`,支持 `YES` / `NO` | - |
+| onReachBottomDistance | Number | 否 | 页面上拉触底时触发时距离页面底部的距离,单位为 `px`,详情可查看[页面事件处理函数](https://opendocs.alipay.com/mini/framework/page-detail#页面事件处理函数)。目前 `iOS` 在 `page.json` 下设置无效,只能全局设置 | [1.19.0](https://opendocs.alipay.com/mini/framework/compatibility) |
+| pullRefresh | Boolean | 否 | 是否允许下拉刷新,默认 `false`。说明:1. 下拉刷新生效的前提是 allowsBounceVertical 值为 `YES`。2. `window` 全局配置后全局生效,但是如果单个页面配置了该参数,则以页面的配置为准 | - |
+| responsive | Boolean | 否 | `rpx` 单位是否宽度自适应,默认 `true`。当设置为 `false` 时,2 rpx 将恒等于 1 px,不再根据屏幕宽度进行自适应。注意,此时 750 rpx 将不再等于 100% 宽度 | [1.23.0](https://opendocs.alipay.com/mini/framework/compatibility) |
+| showTitleLoading | String | 否 | 是否进入时显示导航栏的 loading。默认 `NO`,支持 `YES` / `NO` | - |
+| transparentTitle | String | 否 | 导航栏透明设置。默认 `none`,支持 `always` 一直透明、`auto` 滑动自适应、`none` 不透明 | - |
+| titlePenetrate | String | 否 | 是否允许导航栏点击穿透。默认 `NO`,支持 `YES` / `NO` | - |
+| titleImage | String | 否 | 导航栏图片地址 | - |
+| titleBarColor | HexColor | 否 | 导航栏背景色。例如:白色 "#FFFFFF" | - |
+| navigationBarFrontColor | String | 否 | 导航栏前景色。只支持配置 `black` 或者 `white` | [支付宝客户端 10.5.30](https://opendocs.alipay.com/mini/framework/compatibility) |
# tabBar
如果开发的小程序是一个多 tab 应用(客户端窗口的底部栏可以切换页面),那么可以通过 `tabBar` 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页面。 `tabBar` 与 `pages`、 `window` 配置同级,配置项如下:
-| **属性** | **类型** | **必填** | **描述** |
-| --------------- | -------- | -------- | --------------- |
-| textColor | HexColor | 否 | 文字颜色。 |
-| selectedColor | HexColor | 否 | 选中文字颜色。 |
-| backgroundColor | HexColor | 否 | 背景色。 |
-| items | Array | 是 | 每个 tab 配置。 |
+| 属性 | 类型 | 必填 | 描述 |
+| --------------- | -------- | ---- | ---------------------------- |
+| textColor | HexColor | 否 | 文字颜色。 |
+| selectedColor | HexColor | 否 | 选中文字颜色。 |
+| backgroundColor | HexColor | 否 | 背景色。 |
+| items | Array | 是 | 每个 tab 的配置。 |
每个 item 配置:
-| **属性** | **类型** | **必填** | **描述** |
-| ---------- | -------- | -------- | ---------------------------- |
-| pagePath | String | 是 | 设置页面路径。 |
-| name | String | 是 | 名称。 |
-| icon | String | 否 | 平常图标路径(非选中状态)。 |
-| activeIcon | String | 否 | 高亮图标路径(选中状态)。 |
+| 属性 | 类型 | 必填 | 描述 |
+| ---------- | ------ | ---- | ---------------------------- |
+| pagePath | String | 是 | 页面路径。 |
+| name | String | 是 | 名称。 |
+| icon | String | 否 | 图标路径(未选中状态)。 |
+| activeIcon | String | 否 | 图标路径(选中状态)。 |
-icon 图标推荐大小为 81px \* 81px,系统会对传入的非推荐尺寸的图片进行非等比拉伸或缩放。带有 `tabBar` 的 `app.json` 示例如下:
+图标建议尺寸为 81px \* 81px,系统会对非建议尺寸的图片进行非等比拉伸或缩放。附有 `tabBar` 的 `app.json` 示例如下:
```json
{
@@ -164,13 +161,13 @@ icon 图标推荐大小为 81px \* 81px,系统会对传入的非推荐尺寸
# networkTimeout
各类网络请求的超时时间,单位均为毫秒。
-| **属性** | **类型** | **必填** | **默认值** | **说明** |
-| --------------- | -------- | -------- | ---------------| --------------- |
-| request | number | 否 | 30000 | [my.request](https://opendocs.alipay.com/mini/api/owycmh) 的超时时间,单位:毫秒。 |
-| connectSocket | number | 否 | 30000 | [my.connectSocket](https://opendocs.alipay.com/mini/api/vx19c3) 的超时时间,单位:毫秒。 |
-| uploadFile | number | 否 | 60000 | [my.uploadFile](https://opendocs.alipay.com/mini/api/kmq4hc) 的超时时间,单位:毫秒。 |
-| downloadFile | number | 否 | 60000 | [my.downloadFile](https://opendocs.alipay.com/mini/api/xr054r) 的超时时间,单位:毫秒。 |
+| 属性 | 类型 | 必填 | 默认值 | 说明 |
+| ------------- | ------ | ---- | ------- | -------------------------------------------------------------------------------------------- |
+| request | number | 否 | 30000 | [my.request](https://opendocs.alipay.com/mini/api/owycmh) 的超时时间,单位:毫秒。 |
+| connectSocket | number | 否 | 30000 | [my.connectSocket](https://opendocs.alipay.com/mini/api/vx19c3) 的超时时间,单位:毫秒。 |
+| uploadFile | number | 否 | 60000 | [my.uploadFile](https://opendocs.alipay.com/mini/api/kmq4hc) 的超时时间,单位:毫秒。 |
+| downloadFile | number | 否 | 60000 | [my.downloadFile](https://opendocs.alipay.com/mini/api/xr054r) 的超时时间,单位:毫秒。 |
# subPackages
@@ -190,7 +187,7 @@ icon 图标推荐大小为 81px \* 81px,系统会对传入的非推荐尺寸
# lazyCodeLoading
-小程序应用的启动过程中,除了下载阶段以外,默认会执行所有代码(包括当前页面未使用到的所有页面、自定义组件),会对启动耗时有一定影响。基础库 2.7.0 及以上 ,支持配置以下 lazyCodeLoading 参数,仅执行当前页面所必须的页面脚本和自定义组件脚本,其他脚本则不会被执行。
+小程序应用的启动过程中,除了下载阶段以外,默认会执行所有代码(包括当前页面未使用到的所有页面、自定义组件),会对启动耗时有一定影响。基础库 2.7.0 及以上支持配置以下 **lazyCodeLoading** 参数,仅执行当前页面所必须的页面脚本和自定义组件脚本,其他脚本则不会被执行。
```javascript
{
@@ -198,35 +195,34 @@ icon 图标推荐大小为 81px \* 81px,系统会对传入的非推荐尺寸
}
```
-**注意:** 由于开启该配置后,当前页面未使用到的代码将不会被执行,可能对某些依赖默认脚本执行先后顺序的逻辑产生影响。
+注意:由于开启该配置后,当前页面未使用到的代码将不会被执行,可能对某些依赖默认脚本执行先后顺序的逻辑产生影响。
# workers
-使用 [Worker](https://opendocs.alipay.com/mini/api/createworker) 处理多线程任务时,设置 Worker 代码文件列表。如:
+使用 [Worker](https://opendocs.alipay.com/mini/api/createworker) 处理多线程任务时,设置 Worker 代码文件列表。例如:
```json
"workers": [
"workers/index.js"
]
```
-
# permission
小程序接口权限相关设置。字段类型为 Object,结构为:
-| **属性** | **类型** | **必填** | **描述** |
-| --- | --- | --- | --- |
-| scope.album | PermissionObject | 否 | 相册(访问)相关权限声明,相关 API:[my.chooseImage](https://opendocs.alipay.com/mini/api/media/image/my.chooseimage)、[my.chooseVideo](https://opendocs.alipay.com/mini/api/media/video/my.choosevideo)(sourceType 包含 album)。 |
-| scope.writePhotosAlbum | PermissionObject | 否 | 相册(保存)相关权限声明,相关 API:[my.saveImage](https://opendocs.alipay.com/mini/api/media/image/my.saveimage)、[my.saveImageToPhotosAlbum](https://opendocs.alipay.com/mini/api/media/image/my.saveImagetophotosalbum)、[my.saveVideoToPhotosAlbum](https://opendocs.alipay.com/mini/api/media/video/my.savevideotophotosalbum)。 |
-| scope.camera | PermissionObject | 否 | 相机相关权限声明,相关 API:[my.chooseImage](https://opendocs.alipay.com/mini/api/media/image/my.chooseimage)、[my.chooseVideo](https://opendocs.alipay.com/mini/api/media/video/my.choosevideo)(sourceType 包含 camera)。 |
-| scope.record | PermissionObject | 否 | 麦克风相关权限声明,相关 API:[my.getRecorderManager](https://opendocs.alipay.com/mini/api/getrecordermanager)。 |
-| scope.userLocation | PermissionObject | 否 | 位置相关权限声明,相关 API:[my.getLocation](https://opendocs.alipay.com/mini/api/mkxuqd)。 |
+| 属性 | 类型 | 必填 | 描述 |
+| -------------- | --------------- | ---- | ------------------------------------------------------------- |
+| scope.album | PermissionObject | 否 | 相册(访问)相关权限声明,相关 API:[my.chooseImage](https://opendocs.alipay.com/mini/api/media/image/my.chooseimage)、[my.chooseVideo](https://opendocs.alipay.com/mini/api/media/video/my.choosevideo)(sourceType 包含 album) |
+| scope.writePhotosAlbum | PermissionObject | 否 | 相册(保存)相关权限声明,相关 API:[my.saveImage](https://opendocs.alipay.com/mini/api/media/image/my.saveimage)、[my.saveImageToPhotosAlbum](https://opendocs.alipay.com/mini/api/media/image/my.saveImagetophotosalbum)、[my.saveVideoToPhotosAlbum](https://opendocs.alipay.com/mini/api/media/video/my.savevideotophotosalbum) |
+| scope.camera | PermissionObject | 否 | 相机相关权限声明,相关 API:[my.chooseImage](https://opendocs.alipay.com/mini/api/media/image/my.chooseimage)、[my.chooseVideo](https://opendocs.alipay.com/mini/api/media/video/my.choosevideo)(sourceType 包含 camera) |
+| scope.record | PermissionObject | 否 | 麦克风相关权限声明,相关 API:[my.getRecorderManager](https://opendocs.alipay.com/mini/api/getrecordermanager) |
+| scope.userLocation | PermissionObject | 否 | 位置相关权限声明,相关 API:[my.getLocation](https://opendocs.alipay.com/mini/api/mkxuqd) |
## PermissionObject 结构
-| **属性** | **类型** | **必填** | **描述** |
-| -------- | -------- | -------- | ------------------------------------ |
-| desc | String | 是 | 小程序获取权限时展示的接口用途说明。 |
+| 属性 | 类型 | 必填 | 描述 |
+| ------ | ------ | ---- | -------------------------------- |
+| desc | String | 是 | 小程序获取权限时展示的接口用途说明。 |
### 使用示例
@@ -253,15 +249,14 @@ icon 图标推荐大小为 81px \* 81px,系统会对传入的非推荐尺寸
```

-
# behavior
用于改变小程序若干运行行为。字段类型为 Object,结构请见下方说明。
-| **属性** | **类型** | **必填** | **描述** |
+| 属性 | 类型 | 必填 | 描述 |
| --- | --- | --- | --- |
-| shareAppMessage | String | 否 | **可选值**:appendQuery。
使用小程序默认分享功能时(即不显式设置 [Page.onShareAppMessage]()),当设置此字段后,会使客户端生成的用于分享的 `scheme` 带上当前用户打开的页面所携带的 query 参数。
基础库 [2.7.10](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 及以上开始支持,同时需使用 [IDE 2.7.0](https://opendocs.alipay.com/mini/ide/download) 及以上版本进行构建。 |
-| decodeQuery | String | 否 | **可选值**:disable。
小程序在解析全局参数、页面参数时默认会对键/值做 `encodeURIComponent`。当设置为 `disable` 后,则不再对键/值做`encodeURIComponent`,解析规则详情可查看 [小程序全局/页面参数设置以及解析细节](https://opendocs.alipay.com/mini/03durs),基础库 [2.7.19](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 及以上开始支持,同时需使用 [IDE 3.0.0](https://opendocs.alipay.com/mini/ide/download) 及以上版本进行构建。 |
+| shareAppMessage | String | 否 | 可选值:appendQuery。
使用小程序默认分享功能时(即不显式设置 [Page.onShareAppMessage](https://opendocs.alipay.com/mini/framework/page-detail#onShareAppMessage(options%3A%20Object))),当设置此字段后,会使客户端生成的用于分享的 `scheme` 带上当前用户打开的页面所携带的 query 参数。
基础库 [2.7.10](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 及以上开始支持,同时需使用 [IDE 2.7.0](https://opendocs.alipay.com/mini/ide/download) 及以上版本进行构建。 |
+| decodeQuery | String | 否 | 可选值:disable。
小程序在解析全局参数、页面参数时默认会对键/值做 `encodeURIComponent`。当设置为 `disable` 后,则不再对键/值做 `encodeURIComponent`,解析规则详情可查看 [小程序全局/页面参数设置以及解析细节](https://opendocs.alipay.com/mini/03durs),基础库 [2.7.19](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 及以上开始支持,同时需使用 [IDE 3.0.0](https://opendocs.alipay.com/mini/ide/download) 及以上版本进行构建。 |
## 使用示例
@@ -269,15 +264,15 @@ icon 图标推荐大小为 81px \* 81px,系统会对传入的非推荐尺寸
{
"behavior": {
"shareAppMessage": "appendQuery", // 通过此配置,可选择默认分享功能是否带上 query 参数。
- "decodeQuery": "disable" // 设置为disable后,基础库不再对全局/页面参数的键/值做 encodeURIComponent
+ "decodeQuery": "disable" // 设置为 disable 后,基础库不再对全局/页面参数的键/值做 encodeURIComponent
}
}
```
# 常见问题
-## Q:A 页面(列表页)设置允许下拉刷新,B 页面(详情页)设置禁止下拉 `allowsBounceVertical: NO`, A 页面跳转 B 页面后再点左上角返回 A 页面,此时 A 页面无法下拉刷新。
+## Q:A 页面(列表页)设置允许下拉刷新,B 页面(详情页)设置禁止下拉 `allowsBounceVertical: NO`,A 页面跳转 B 页面后再点左上角返回 A 页面,此时 A 页面无法下拉刷新。
-A:A 页面设置下拉刷新的同时设置 `allowsBounceVertical: YES`,即可解决该问题。
+A:A 页面设置下拉刷新的同时设置 `allowsBounceVertical: YES`,即可解决该问题。
-**注意**:设置下拉刷新的时候一定要设置允许下拉。
+**注意**:设置下拉刷新时一定要设置允许下拉。
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/getApp \346\226\271\346\263\225.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/getApp \346\226\271\346\263\225.md"
index 40261a183..c81bdaf01 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/getApp \346\226\271\346\263\225.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/getApp \346\226\271\346\263\225.md"
@@ -1,33 +1,33 @@
-小程序提供了全局的 getApp() 方法,可获取当前小程序实例,一般用于在子页面中获取顶层应用。
+小程序提供了全局的 `getApp()` 方法,可获取当前小程序实例,一般用于在子页面中获取顶层应用。
-```JavaScript
+```javascript
// app.js
App({
globalData: 1
});
```
-```JavaScript
+```javascript
// page.js
var app = getApp();
console.log(app.globalData); // 获取 globalData
```
-**注意:**
+**注意**:
- `App()` 函数中不可以调用 `getApp()`,可使用 `this` 获取当前小程序实例。
- 通过 `getApp()` 获取实例后,请勿调用生命周期回调函数。
-- 请区分全局变量及页面局部变量,比如:
+- 请区分全局变量及页面局部变量。比如:
-```JavaScript
+```javascript
// app.js
App({
- //定义全局变量 globalData,在整个App中有效
+ // 定义全局变量 globalData,在整个 App 中有效
globalData: 1
});
```
-```JavaScript
+```javascript
// a.js
// 定义页面局部变量 localValue,只在 a.js 有效
var localValue = 'a';
@@ -37,7 +37,7 @@ var app = getApp();
app.globalData++;
```
-```JavaScript
+```javascript
// b.js
// 定义页面局部变量 localValue,只在 b.js 有效
var localValue = 'b';
@@ -45,8 +45,7 @@ var localValue = 'b';
console.log(getApp().globalData);
```
-`a.js` 和 `b.js` 两个文件中都声明了变量 `localValue`,但并不会互相影响,因为各个文件声明的局部变量和函数只在当前文件下有效。
-
+`a.js` 和 `b.js` 两个文件中都声明了变量 `localValue`,但并不会互相影响。因为各个文件声明的局部变量和函数只在当前文件下有效。
# 相关文档
- [小程序页面介绍](https://opendocs.alipay.com/mini/framework/page)
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\345\260\217\347\250\213\345\272\217 tabBar\343\200\201titleBar \345\244\232\350\257\255\350\250\200\351\205\215\347\275\256.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\345\260\217\347\250\213\345\272\217 tabBar\343\200\201titleBar \345\244\232\350\257\255\350\250\200\351\205\215\347\275\256.md"
index 0808c359c..298d5a4bb 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\345\260\217\347\250\213\345\272\217 tabBar\343\200\201titleBar \345\244\232\350\257\255\350\250\200\351\205\215\347\275\256.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\345\260\217\347\250\213\345\272\217 tabBar\343\200\201titleBar \345\244\232\350\257\255\350\250\200\351\205\215\347\275\256.md"
@@ -5,13 +5,13 @@
多语言 tabBar、titleBar 配置如下:
1. 语言配置统一放到小程序根目录(对应 mini.project.json 中的 miniProgramRoot 配置)下的 locale 目录下。
-2. 每个语言一个目录,如 zh-Hans(简体中文)、zh-HK (繁体中文香港)。
-3. 在每个语言目录下,通过添加 app.json 配置,配置该语言下的 titleBar 与 tabBar。
+2. 每个语言一个目录,例如 `zh-Hans`(简体中文)、`zh-HK`(繁体中文香港)。
+3. 在每个语言目录下,通过添加 `app.json` 配置,来设置该语言下的 `titleBar` 与 `tabBar`。
-**注意:**
+**注意**:
-- 目前仅支持 zh-Hans(简体中文)、zh-Hant(繁体中文台湾)、zh-HK(繁体中文香港)、en(英文)四种语言。
-- IDE 中请使用 **真机调试** 查看配置效果。
+- 目前仅支持 `zh-Hans`(简体中文)、`zh-Hant`(繁体中文台湾)、`zh-HK`(繁体中文香港)、`en`(英文)四种语言。
+- 在 IDE 中,请使用**真机调试**来查看配置效果。
文件目录结构示例如下:
@@ -20,10 +20,9 @@
# tabBar 真机效果

-
# tabBar 示例代码
-locale 目录中的 app.json 配置示例如下,`items` 中只需配置 `name` 属性的值即可。
+`locale` 目录中的 `app.json` 配置示例如下,`items` 中只需配置 `name` 属性的值即可。
```json
// locale/en/app.json
@@ -61,7 +60,7 @@ locale 目录中的 app.json 配置示例如下,`items` 中只需配置 `name`
}
```
-根目录下的 app.json 配置示例如下,`items` 中不配置 `name` 属性。
+根目录下的 `app.json` 配置示例如下,`items` 中不配置 `name` 属性。
```json
// app.json
@@ -88,11 +87,12 @@ locale 目录中的 app.json 配置示例如下,`items` 中只需配置 `name`
}
}
```
-
+```markdown
# 属性
-| **属性** | **类型** | **必填** | **描述** |
-| -------- | -------- | -------- | ------------------------------------ |
-| window | Object | 否 | 设置默认 title。 |
-| tabBar | Object | 否 | 设置多语言下的 tabBarItem 名称。 |
-| pages | Object | 否 | 设置多语言下的每个页面对应的 title。 |
+| 属性 | 类型 | 必填 | 描述 |
+| ------- | ------ | ---- | ------------------------------------ |
+| window | Object | 否 | 设置默认 title |
+| tabBar | Object | 否 | 设置多语言下的 tabBarItem 名称 |
+| pages | Object | 否 | 设置多语言下的每个页面对应的 title |
+```
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\345\260\217\347\250\213\345\272\217\345\272\224\347\224\250\351\205\215\347\275\256\344\273\213\347\273\215.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\345\260\217\347\250\213\345\272\217\345\272\224\347\224\250\351\205\215\347\275\256\344\273\213\347\273\215.md"
index 5fb083e04..e2583011e 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\345\260\217\347\250\213\345\272\217\345\272\224\347\224\250\351\205\215\347\275\256\344\273\213\347\273\215.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\345\260\217\347\250\213\345\272\217\345\272\224\347\224\250\351\205\215\347\275\256\344\273\213\347\273\215.md"
@@ -1,6 +1,6 @@
`App()` 代表顶层应用,管理所有页面和全局数据,以及提供生命周期回调等。`App()` 也是一个构造方法,生成 App 实例,一个小程序就是一个 App 实例。
-每个小程序顶层一般包含三个文件。
+每个小程序顶层一般包含三个文件:
- `app.json`:应用配置。
- `app.js`:应用逻辑。
@@ -38,11 +38,10 @@ App({
},
globalData: {
// 全局数据
- name: 'alipay',
+ name: 'Alipay',
},
});
```
-
# 相关文档
- [app.json 全局配置](https://opendocs.alipay.com/mini/framework/app-json)
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\350\277\201\347\247\273\350\207\263\346\226\260\351\241\271\347\233\256\351\205\215\347\275\256.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\350\277\201\347\247\273\350\207\263\346\226\260\351\241\271\347\233\256\351\205\215\347\275\256.md"
index 9dd5cf61b..8b7fcc840 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\350\277\201\347\247\273\350\207\263\346\226\260\351\241\271\347\233\256\351\205\215\347\275\256.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\350\277\201\347\247\273\350\207\263\346\226\260\351\241\271\347\233\256\351\205\215\347\275\256.md"
@@ -1,33 +1,37 @@
-项目配置(`mini.project.json`)新配置格式(**format2)**开放了诸多可以提升开发者研发效率的的配置,如 ES5 新编译配置、TypeScript/less 转译、路径别名、全局对象访问策略等。开发者可以根据 [项目配置](https://opendocs.alipay.com/mini/03dbc3?pathHash=e876dc50) 开启需要的功能,如当前项目仍处于旧配置格式,可以参照下述文档指南进行迁移。
+项目配置(`mini.project.json`)新配置格式**(format2)** 开放了诸多可以提升开发者研发效率的配置,如 ES5 新编译配置、TypeScript/less 转译、路径别名、全局对象访问策略等。开发者可以根据[项目配置](https://opendocs.alipay.com/mini/03dbc3?pathHash=e876dc50) 开启需要的功能。如果当前项目仍处于旧配置格式,可以参照下述文档指南进行迁移。
# 新增配置能力
-| ** 新配置 ** | ** 说明 ** |
-| --- | --- |
-| compileOptions.typescript | 小程序是否启用 typescript 支持,更多详情可查看 [配置文档](https://opendocs.alipay.com/mini/02zko2) |
-| compileOptions.less | 小程序是否启用 less 支持,更多详情可查看 [配置文档](https://opendocs.alipay.com/mini/02zko2) |
-| compileOptions.treeShaking | 是否在生产构建时进行 Tree-shaking 优化,可查看 [文档](https://developer.mozilla.org/zh-CN/docs/Glossary/Tree_shaking) |
-| compileOptions.resolveAlias | 小程序开发者工具 IDE 3.7.5 开始支持路径别名配置, 更多详情可查看 [配置文档](https://opendocs.alipay.com/mini/03dbc3#resolveAlias) |
-| compileOptions.globalObjectMode | 小程序全局对象(global/globalThis)访问策略, 更多详情可查看 [配置文档](https://opendocs.alipay.com/mini/03dbc3#globalObjectMode) |
-| compileOptions.transpile | 小程序代码转 ES5 配置(新), 更多详情可查看 [配置文档](https://opendocs.alipay.com/mini/03dbc3#transpile) |
-| developOptions.sourcemap | 是否开启生成 sourcemap |
+| 配置项 | 说明 |
+| --------------------- | ------------------------------------------------- |
+| compileOptions.typescript | 小程序是否启用 TypeScript 支持。更多详情可查看[配置文档](https://opendocs.alipay.com/mini/02zko2)。 |
+| compileOptions.less | 小程序是否启用 less 支持。更多详情可查看[配置文档](https://opendocs.alipay.com/mini/02zko2)。 |
+| compileOptions.treeShaking | 是否在生产构建时进行 Tree-shaking 优化。可查看[文档](https://developer.mozilla.org/zh-CN/docs/Glossary/Tree_shaking)。 |
+| compileOptions.resolveAlias | 小程序开发者工具 IDE 3.7.5 开始支持路径别名配置。更多详情可查看[配置文档](https://opendocs.alipay.com/mini/03dbc3#resolveAlias)。 |
+| compileOptions.globalObjectMode | 小程序全局对象(global/globalThis)访问策略。更多详情可查看[配置文档](https://opendocs.alipay.com/mini/03dbc3#globalObjectMode)。 |
+| compileOptions.transpile | 小程序代码转 ES5 配置(新)。更多详情可查看[配置文档](https://opendocs.alipay.com/mini/03dbc3#transpile)。 |
+| developOptions.sourcemap | 是否开启生成 sourcemap。 |
# 自动升级
-IDE 3.8.1 版本开始会帮助开发者自动升级 `mini.project.json` 内容,开发者只需要使用新版 IDE 打开项目,即可自动升级。
+IDE 3.8.1 版本开始会帮助开发者自动升级 `mini.project.json` 内容。开发者只需要使用新版 IDE 打开项目,即可自动升级。
# 手动迁移
-迁移到新配置格式(**format2)**时,有部分配置项已被标记为废弃,强烈建议将这些废弃的配置项迁移至新的、能力更全面的配置项。
-## node_modules 转译行为配置
-以下配置项涉及 node_modules 内转译行为
+迁移到新配置格式(**format2**)时,有部分配置项已被标记为废弃。强烈建议将这些废弃的配置项迁移到新的、能力更全面的配置项中。
-- enableNodeModuleBabelTransform
-- node_modules_es6_whitelist
+## `node_modules` 转译行为配置
+
+以下配置项涉及 `node_modules` 内转译行为:
+
+- `enableNodeModuleBabelTransform`
+- `node_modules_es6_whitelist`
### 迁移案例 1:旧有配置无上述特殊转译行为选项
+
此配置迁移前后均保持了对 `node_modules` 路径不开启任何 ES 语法转译。
#### 旧有配置
+
```json
{
...
@@ -35,10 +39,11 @@ IDE 3.8.1 版本开始会帮助开发者自动升级 `mini.project.json` 内容
```
#### 迁移后配置
+
```json
{
- "format": 2,
- ...,
+ "format": "2",
+ ...
"compileOptions": {
"transpile": {
"script": {
@@ -50,23 +55,22 @@ IDE 3.8.1 版本开始会帮助开发者自动升级 `mini.project.json` 内容
}
}
```
-
-### 迁移案例 2:旧有配置使用 node_modules_es6_whitelist
+### 迁移案例 2:旧有配置使用 `node_modules_es6_whitelist`
此配置迁移前后仅对 `node_modules` 中指定路径、npm 包忽略语法转译。
#### 旧有配置
+
```json
{
- ...,
"node_modules_es6_whitelist": ["foo"]
}
```
#### 迁移后配置
+
```json
{
"format": 2,
- ...,
"compileOptions": {
"transpile": {
"script": {
@@ -79,14 +83,13 @@ IDE 3.8.1 版本开始会帮助开发者自动升级 `mini.project.json` 内容
}
}
```
-
### 迁移案例 3:旧有配置使用 enableNodeModuleBabelTransform
此配置迁移前后对 `node_modules` 全量开启 ES 语法转译。
#### 旧有配置
```json
{
- ...,
+ "...",
"enableNodeModuleBabelTransform": true
}
```
@@ -95,7 +98,7 @@ IDE 3.8.1 版本开始会帮助开发者自动升级 `mini.project.json` 内容
```json
{
"format": 2,
- ...,
+ "...",
"compileOptions": {
"transpile": {
"script": {
@@ -105,22 +108,22 @@ IDE 3.8.1 版本开始会帮助开发者自动升级 `mini.project.json` 内容
}
}
```
-**注意**
当存在较多 node_module 模块时,转译全部 node_modules 内的代码文件可能会大幅降低构建速度。如果您原来的配置开启了全部的 node_module 代码转译,即使您原来的配置为 **案例 3**, 仍建议您按照 [案例 1](https://opendocs.alipay.com/mini/09j22u?pathHash=b6d79b55#%E8%BF%81%E7%A7%BB%E6%A1%88%E4%BE%8B%201%EF%BC%9A%E6%97%A7%E6%9C%89%E9%85%8D%E7%BD%AE%E6%97%A0%E4%B8%8A%E8%BF%B0%E7%89%B9%E6%AE%8A%E8%BD%AC%E8%AF%91%E8%A1%8C%E4%B8%BA%E9%80%89%E9%A1%B9) 的方法进行迁移,再根据编译器的提示来开启指定 node_module 的代码转译。
+**注意**
当存在较多 node_module 模块时,转译全部 `node_modules` 内的代码文件可能会大幅降低构建速度。如果你原先的配置开启了全部的 `node_module` 代码转译,即使你原来的配置为 **案例 3**,仍建议按照 [案例 1](https://opendocs.alipay.com/mini/09j22u?pathHash=b6d79b55#%E8%BF%81%E7%A7%BB%E6%A1%88%E4%BE%8B%201%EF%BC%9A%E6%97%A7%E6%9C%89%E9%85%8D%E7%BD%AE%E6%97%A0%E4%B8%8A%E8%BF%B0%E7%89%B9%E6%AE%8A%E8%BD%AC%E8%AF%91%E8%A1%8C%E4%B8%BA%E9%80%89%E9%A1%B9) 的方法进行迁移。然后,根据编译器的提示来开启指定 `node_module` 的代码转译。
## 基础库 2.0
-由于小程序基础库 1.0 已不再进行功能迭代和问题修复,format2 将默认使用小程序基础库 2.0,如果您还在使用 1.0 基础库,请尽快参照 [基础库 2.x 升级](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 将小程序升级至基础库 2.0。
+由于小程序基础库 1.0 已不再进行功能迭代和问题修复,`format` 2 将默认使用小程序基础库 2.0。如果你还在使用 1.0 基础库,请尽快参照 [基础库 2.x 升级](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 将你的小程序升级至基础库 2.0。
## 等效配置项
-| ** 旧有配置 ** | ** 新配置 ** | ** 说明 ** |
-| --- | --- | --- |
-| include | assetsInclude | 明确语义,用户构建后需要打包至产物中的资产 |
-| exclude | uploadExclude | 明确语义,用户本地代码上传时需要忽略的文件 |
-| debugOptions | pluginResolution | 明确语义,用于插件快捷联调配置 |
-| component2 | compileOptions.component2 | 迁移字段 |
-| enableHMR | developOptions.hotReload | 迁移字段 |
-| enableParallelLoader | developOptions.parallel | 迁移字段 |
-| enableDistFileMinify | developOptions.minify | 迁移字段 |
-| miniprogramRoot | miniprogramRoot | - |
-| pluginRoot | pluginRoot | - |
-| compileType | compileType | - |
-| scripts | scripts | - |
+| 旧有配置 | 新配置 | 说明 |
+| --------------- | ------------------ | ---------------------------------------------- |
+| include | assetsInclude | 明确语义,用户构建后需要打包至产物中的资产 |
+| exclude | uploadExclude | 明确语义,用户本地代码上传时需要忽略的文件 |
+| debugOptions | pluginResolution | 明确语义,用于插件快捷联调配置 |
+| component2 | compileOptions.component2 | 迁移字段 |
+| enableHMR | developOptions.hotReload | 迁移字段 |
+| enableParallelLoader | developOptions.parallel | 迁移字段 |
+| enableDistFileMinify | developOptions.minify | 迁移字段 |
+| miniprogramRoot | miniprogramRoot | - |
+| pluginRoot | pluginRoot | - |
+| compileType | compileType | - |
+| scripts | scripts | - |
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\351\241\271\347\233\256\351\205\215\347\275\256.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\351\241\271\347\233\256\351\205\215\347\275\256.md"
index 9df0951aa..89fdb90a5 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\351\241\271\347\233\256\351\205\215\347\275\256.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\351\241\271\347\233\256\351\205\215\347\275\256.md"
@@ -1,46 +1,45 @@
# 简介
-[openvideo-项目配置](https://gw.alipayobjects.com/mdn/rms_aefee5/afts/file/A*8c7BRqv_eyMAAAAAAAAAAAAAARQnAQ)
开发者可以在项目根目录中创建 mini.project.json ,并通过它来实现项目的编译、开发等相关功能。
+[openvideo-项目配置](https://gw.alipayobjects.com/mdn/rms_aefee5/afts/file/A*8c7BRqv_eyMAAAAAAAAAAAAAARQnAQ)
+开发者可以在项目根目录中创建 `mini.project.json`,并通过它来实现项目的编译、开发等相关功能。
## 使用说明
-- 小程序开发者工具 IDE 3.0.1 以上版本。
+- 小程序开发者工具 IDE 3.0.1 及以上版本。
- 命令行工具 CLI 1.4.0 及以上版本。
# 完整属性
-完整的 mini.project.json format2 有以下属性。
-
-| **属性** | **类型** | **默认值** | **描述** |
-| --- | --- | --- | --- |
-| format | Number | 2 | 固定值 |
-| compileType | "mini" | "plugin" | "mini" | 编译类型,用于区分小程序应用 / 小程序插件。 |
-| miniprogramRoot | Path String | "./" | 指定小程序源码的相对路径 (app.json文件所在目录)。
- 当 compileType 为 miniprogram 时,为应用目录。
- 当 compileType 为 plugin 时,仅用于小程序插件的预览宿主应用目录。
**说明:** 开发者无法单独预览小程序插件,为支持该功能支付宝在小程序插件项目中内置了预览宿主应用。
|
-| pluginRoot | Path String | - | 指定插件项目的相对路径 (plugin.json文件所在目录)。
**说明:** 仅当 compileType 为 plugin 时有效,用于声明插件目录,以及 plugin.json 的实际查询路径。更多详情可查看 [插件开发](https://opendocs.alipay.com/mini/plugin/plugin-development)。 |
-| compileOptions | Object | - | 编译相关的配置,更多详情可查看下方表格说明。 |
-| uploadExclude | String[] | - | 用户本地代码上传时需要忽略的文件。
字段接受一个字符串数组。支持 glob 语法。 底层使用 minimatch 3.0.4 版本进行匹配。 |
-| assetsInclude | String[] | - | 用户构建后需要打包至产物中的资产。
字段接受一个字符串数组。支持 glob 语法。底层使用 minimatch 3.0.4 版本进行匹配。 |
-| developOptions | Object | - | 本地开发的相关配置 |
-| pluginResolution | Object | - | 插件联调选项 |
-| scripts | Object | - | 小程序预构建脚本相关的配置 |
-
+完整的 `mini.project.json` format2 有以下属性。
+
+| 属性 | 类型 | 默认值 | 描述 |
+| ----------------- | --------------------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| format | Number | 2 | 固定值 |
+| compileType | "mini" | "plugin" | "mini" | 编译类型,用于区分小程序应用 / 小程序插件。 |
+| miniprogramRoot | Path String | "./" | 指定小程序源码的相对路径(app.json 文件所在目录)。
- 当 compileType 为 miniprogram 时,为应用目录。
- 当 compileType 为 plugin 时,仅用于小程序插件的预览宿主应用目录。
说明:开发者无法单独预览小程序插件,为支持该功能支付宝在小程序插件项目中内置了预览宿主应用。 |
+| pluginRoot | Path String | - | 指定插件项目的相对路径(plugin.json 文件所在目录)。
说明:仅当 compileType 为 plugin 时有效,用于声明插件目录,以及 plugin.json 的实际查询路径。更多详情可查看[插件开发](https://opendocs.alipay.com/mini/plugin/plugin-development)。 |
+| compileOptions | Object | - | 编译相关的配置,更多详情可查看下方表格说明。 |
+| uploadExclude | String[] | - | 用户本地代码上传时需要忽略的文件。
字段接受一个字符串数组。支持 glob 语法。底层使用 minimatch 3.0.4 版本进行匹配。 |
+| assetsInclude | String[] | - | 用户构建后需要打包至产物中的资产。
字段接受一个字符串数组。支持 glob 语法。底层使用 minimatch 3.0.4 版本进行匹配。 |
+| developOptions | Object | - | 本地开发的相关配置 |
+| pluginResolution | Object | - | 插件联调选项 |
+| scripts | Object | - | 小程序预构建脚本相关的配置 |
## compileOptions
-| **属性** | **类型** | **默认值** | **描述** |
-| --- | --- | --- | --- |
-| component2 | Boolean | false | 自定义组件是否开启新的生命周期运行模型,更多详情可查看 [生命周期](https://opendocs.alipay.com/mini/framework/component-lifecycle)。
**说明:** 如果在 app.json 中开启了 plugins 或 useDynamicPlugins 则会强制开启 component2 运行模式。 |
-| typescript | Boolean | false | 小程序是否启用 typescript 支持,更多详情可查看 [TypeScript 和 Less 编译](https://opendocs.alipay.com/mini/02zko2)。 |
-| less | Boolean | false | 小程序是否启用 less 支持,更多详情可查看 [TypeScript 和 Less 编译](https://opendocs.alipay.com/mini/02zko2)。 |
-| treeShaking | Boolean | false | 是否在生产构建时进行 tree shaking 优化 [什么是 tree shaking](https://developer.mozilla.org/zh-CN/docs/Glossary/Tree_shaking) |
-| resolveAlias | Object | - | IDE 3.7.5 开始支持路径别名配置, 更多详情可查看 [resolveAlias](https://opendocs.alipay.com/mini/03dbc3#resolveAlias)|
-| globalObjectMode | String | - | 小程序全局对象(global/globalThis)访问策略, 更多详情可查看 [globalObjectMode](https://opendocs.alipay.com/mini/03dbc3#globalObjectMode)|
-| transpile | Object | - | 小程序代码转 ES5 配置(新), 更多详情可查看 [transpile](https://opendocs.alipay.com/mini/03dbc3#transpile)|
-
+| 属性 | 类型 | 默认值 | 描述 |
+| --------------- | ------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| component2 | Boolean | false | 自定义组件是否开启新的生命周期运行模型,更多详情可查看[生命周期](https://opendocs.alipay.com/mini/framework/component-lifecycle)。
说明:如果在 app.json 中开启了 plugins 或 useDynamicPlugins 则会强制开启 component2 运行模式。 |
+| typescript | Boolean | false | 小程序是否启用 TypeScript 支持,更多详情可查看[TypeScript 和 Less 编译](https://opendocs.alipay.com/mini/02zko2)。 |
+| less | Boolean | false | 小程序是否启用 Less 支持,更多详情可查看[TypeScript 和 Less 编译](https://opendocs.alipay.com/mini/02zko2)。 |
+| treeShaking | Boolean | false | 是否在生产构建时进行 tree shaking 优化,了解详情可查看[什么是 tree shaking](https://developer.mozilla.org/zh-CN/docs/Glossary/Tree_shaking)。 |
+| resolveAlias | Object | - | IDE 3.7.5 开始支持路径别名配置,更多详情可查看[resolveAlias](https://opendocs.alipay.com/mini/03dbc3#resolveAlias)。 |
+| globalObjectMode| String | - | 小程序全局对象(global/globalThis)访问策略,更多详情可查看[globalObjectMode](https://opendocs.alipay.com/mini/03dbc3#globalObjectMode)。 |
+| transpile | Object | - | 小程序代码转 ES5 配置(新),更多详情可查看[transpile](https://opendocs.alipay.com/mini/03dbc3#transpile)。 |
### resolveAlias
-使用 resolveAlias 配置项可以自定义源文件路径的映射规则。resolveAlias 的键表示代码中的文件路径的匹配规则,值表示映射到的真实路径。
+使用 `resolveAlias` 配置项可以自定义源文件路径的映射规则。`resolveAlias` 的键表示代码中的文件路径的匹配规则,值表示映射到的真实路径。
#### 示例
-小程序项目路径为 `/Workspace/todoApp`
+小程序项目路径为 `/Workspace/todoApp`。
它的 `mini.project.json` 的内容如下:
@@ -58,27 +57,26 @@
}
```
-小程序项目内的 js 文件中引用 resolveAlias 中指定了映射规则的路径时会达到以下效果:
+小程序项目内的 js 文件中引用 `resolveAlias` 中指定了映射规则的路径时会达到以下效果:
```javascript
-import "a/utils" /* 映射到 /Workspace/todoApp/a/utils */
-import "b/utils" /* 映射到 /Workspace/b/utils */
-import "c/utils" /* 映射到 /Workspace/todoApp/c/utils */
+import "a/utils" // 映射到 /Workspace/todoApp/a/utils
+import "b/utils" // 映射到 /Workspace/b/utils
+import "c/utils" // 映射到 /Workspace/todoApp/c/utils
```
-**注意** `b/utils` 是对项目外的文件的引用,构建将会失败,在这里仅供示例参考。
+**注意**:"b/utils" 是对项目外的文件的引用,构建将会失败,在这里仅供示例参考。
#### 映射规则限制
-1. resolveAlias 配置的目标路径都相对于 mini.project.json 所在的目录。
-2. resolveAlias 只进行目录级别的别名,因此 resolveAlias 的键值都必须以 /* 为结尾。
-3. resolveAlias 只对路径进行字符串前缀匹配,不能配置更复杂的规则。
-4. resolveAlias 的键不能以 `/` 为前缀,因为 `/` 开头的路径在小程序中始终相对于 miniprogramRoot/pluginRoot,具有比 alias 更高的优先级。
-5. resolveAlias 的值不能以 `/` 为前缀。
+1. `resolveAlias` 配置的目标路径都相对于 `mini.project.json` 所在的目录。
+2. `resolveAlias` 只进行目录级别的别名,因此 `resolveAlias` 的键值都必须以 `/*` 为结尾。
+3. `resolveAlias` 只对路径进行字符串前缀匹配,不能配置更复杂的规则。
+4. `resolveAlias` 的键不能以 `/` 为前缀,因为 `/` 开头的路径在小程序中始终相对于 `miniprogramRoot/pluginRoot`,具有比 alias 更高的优先级。
+5. `resolveAlias` 的值不能以 `/` 为前缀。
6. 如果存在两个规则,其中一个规则是另一个规则的前缀,那么匹配时**最具体的键**将生效。
-例如, resolveAlias 配置中同时存在 `hello/world/* => ./a/*` 和 `hello/* => ./b/*` 两条规则,那么 `hello/world/a` 会指向 `./a/a`,`hello/b` 会指向 `./b/b`
-
+例如,`resolveAlias` 配置中同时存在 `hello/world/* => ./a/*` 和 `hello/* => ./b/*` 两条规则,那么 `hello/world/a` 会指向 `./a/a`,`hello/b` 会指向 `./b/b`。
#### 生效范围
Javascript / Typescript 文件中的:
@@ -97,74 +95,76 @@ AXML 文件中的:
- ``
- ``
-**注意**
--所有其他地方所写的路径,如 app.json 等各类 .json 文件中的路径原则上都不会遵循 resolveAlias 的配置。
--resolveAlias 不会对 node_modules 中的文件生效。
-
+**注意:**
+- 所有其他地方所写的路径,如 app.json 等各类 .json 文件中的路径,原则上都不会遵循 `resolveAlias` 的配置。
+- `resolveAlias` 不会对 `node_modules` 中的文件生效。
### globalObjectMode
-小程序全局对象的访问策略,通过该配置可以控制小程序中访问全局对象 global 以及 globalThis 的表现。
+小程序全局对象的访问策略,通过该配置可以控制小程序中访问全局对象 `global` 以及 `globalThis` 的表现。
#### 使用要求
-- 小程序开发者工具 IDE 3.8.1 以上版本
-- 命令行工具 CLI 2.0.0 及以上版本
+- 小程序开发者工具 IDE 3.8.1 及以上版本。
+- 命令行工具 CLI 2.0.0 及以上版本。
#### 可选值
-| 值 | 含义 |
-| --- | --- |
-| legacy | 禁止访问全局对象 |
-| enable | (推荐)可访问到真实的小程序 JavaScript 全局对象 global 与 globalThis |
-| fake | 可访问到一个全局挂载的虚拟空对象 |
+
+| 值 | 含义 |
+| -------- | ---------------------------------------------- |
+| `legacy` | 禁止访问全局对象。 |
+| `enable` | (推荐)可访问到真实的小程序 JavaScript 全局对象 `global` 与 `globalThis`。 |
+| `fake` | 可访问到一个全局挂载的虚拟空对象。 |
#### 示例
-##### enable (可访问 global/globalThis)
+
+##### `enable` (可访问 `global`/`globalThis`)
```js
-console.log(global.Math === Math) // true
+console.log(global.Math === Math); // true
global.foo = 'foo';
-console.log(typeof global.foo) // string
-console.log(global.foo) // foo
-console.log(typeof foo) // string
-console.log(foo) // foo
+console.log(typeof global.foo); // string
+console.log(global.foo); // foo
+console.log(typeof foo); // string
+console.log(foo); // foo
```
-##### fake (global/globalThis 指向虚拟对象)
+##### `fake` (`global`/`globalThis` 指向虚拟对象)
```js
-console.log(global.Math === Math) // false
+console.log(global.Math === Math); // false
global.foo = 'foo';
-console.log(typeof global.foo) // string
-console.log(global.foo) // foo
-console.log(typeof foo) // undefined
-console.log(foo) // VM97:1 Uncaught ReferenceError: foo is not defined
+console.log(typeof global.foo); // string
+console.log(global.foo); // foo
+console.log(typeof foo); // undefined
+console.log(foo); // Uncaught ReferenceError: foo is not defined
```
-
### transpile
-| **属性** | **类型** | **默认值** | **描述** |
-| --- | --- | --- | --- |
-| scripts | Object | - | 小程序代码转 ES5 配置 |
+| 属性 | 类型 | 默认值 | 描述 |
+| ---- | ------ | ------ | ------------------- |
+| scripts | Object | - | 小程序代码转 ES5 配置 |
#### 使用要求
+
- 小程序开发者工具 IDE 3.8.1 以上版本
- 命令行工具 CLI 2.0.0 及以上版本
#### scripts
+
开启 ES2023 的语法支持,并可以通过配置项指定不需要进行编译的文件或文件夹。
#### 配置
-| **属性** | **类型** | **默认值** | **描述** |
-| --- | --- | --- | --- |
-| ignore | String[] | [] | 通过 glob 规则跳过某些文件/目录的转译 |
+| 属性 | 类型 | 默认值 | 描述 |
+| ---- | -------- | ------ | -------------------------------- |
+| ignore | String[] | [] | 通过 glob 规则跳过某些文件/目录的转译 |
#### ignore 规则
-转译时,小程序编译器将相对于项目目录(当前项目 mini.project.json 配置文件所在目录) 对 ignore 数组中配置的规则进行 glob 匹配,命中任意 glob 规则的文件都不会进行转译。
-如果需要表示不要忽略某些文件,可以添加含有 ! 前缀的反向 glob 规则以包含这些文件的转译,例如
+转译时,小程序编译器将相对于项目目录(当前项目 `mini.project.json` 配置文件所在目录)对 `ignore` 数组中配置的规则进行 glob 匹配,命中任意 glob 规则的文件都不会进行转译。如果需要表示不要忽略某些文件,可以添加含有 `!` 前缀的反向 glob 规则以包含这些文件的转译,例如:
+
```json
{
"transpile": {
- "script": {
+ "scripts": {
"ignore": [
"node_modules/**",
"!node_modules/lodash-es/**"
@@ -174,10 +174,10 @@ console.log(foo) // VM97:1 Uncaught ReferenceError: foo is not defined
}
```
-以上配置表示忽略当前目录下的 node_modules/ 下的所有文件,但不忽略 node_modules/lodash-es/ 下面的文件
-
+以上配置表示忽略当前目录下的 `node_modules/` 下的所有文件,但不忽略 `node_modules/lodash-es/` 下面的文件。
#### 常用示例
-1. 不编译项目源码以及 node_modules,适用于小程序源码编译到 es5 了的预编译框架
+
+1. 不编译项目源码以及 `node_modules`,适用于小程序源码编译到 ES5 了的预编译框架
```json
{
"format": 2,
@@ -207,7 +207,7 @@ console.log(foo) // VM97:1 Uncaught ReferenceError: foo is not defined
}
}
```
-3. 编译项目源码以及部分 node_modules
+3. 编译项目源码以及部分 `node_modules`
```json
{
"format": 2,
@@ -223,7 +223,7 @@ console.log(foo) // VM97:1 Uncaught ReferenceError: foo is not defined
}
}
```
-4. 编译项目源码以及 node_modules:全都不忽略
+4. 编译项目源码以及 `node_modules`:全部编译,不忽略
```json
{
"format": 2,
@@ -232,13 +232,10 @@ console.log(foo) // VM97:1 Uncaught ReferenceError: foo is not defined
}
}
```
-
-
-## uploadExclude/assetsInclude
以下为小程序构建产物包的默认打包资源。
### assetsInclude 打包白名单
-小程序的构建产物包默认只会包含必要的业务产物代码和资源文件,未识别的资源类型不会出现在包内,以减小包体积。 默认打包的资源文件见下:
+小程序的构建产物包默认只会包含必要的业务产物代码和资源文件,未识别的资源类型不会出现在包内,以减小包体积。默认打包的资源文件见下:
- 图片
- .png
@@ -257,27 +254,28 @@ console.log(foo) // VM97:1 Uncaught ReferenceError: foo is not defined
- .mp3
- .mp4
-如小程序需要引入自定义的资源文件,可配置 assetsInclude 白名单, 以下配置将会把所有 .aaa 以及 .bbb 后缀的文件也打进产物包内。
+如果小程序需要引入自定义的资源文件,可配置 `assetsInclude` 白名单。以下配置会将所有 `.aaa` 及 `.bbb` 后缀的文件也打进产物包内。
```json
-"assetsInclude" : [
+"assetsInclude": [
"**/*.aaa",
- "**/*.bbb",
+ "**/*.bbb"
]
```
-
### uploadExclude 打包黑名单
-小程序上传时,会将本地源码打包传到云端进行构建,除了上方资源文件列表外,源码包还会包含以下内容:
-
-- 小程序源码文件
- - .acss
- - .axml
- - .js
- - .json
- - .sjs
-- 依赖包
- - node_modules目录
-
-如果源码包经过 zip 压缩后,包大小仍然超过 IDE 的阈值(当前为20M),上传时会报 **包大小超限** 的错误。可以根据需要,对云端构建不需要的文件配置 uploadExclude 黑名单,如代码经过了 src > dist 的预编译以及 miniprogramRoot 目录之外的 devDependencies 依赖。以下配置表示源码包内将不会包含项目根目录下 src 和 node_modules 目录中的文件。
+
+小程序上传时,会将本地源码打包传到云端进行构建。除了上方资源文件列表外,源码包还会包括以下内容:
+
+- 小程序源码文件:
+ - `.acss`
+ - `.axml`
+ - `.js`
+ - `.json`
+ - `.sjs`
+- 依赖包:
+ - `node_modules` 目录
+
+如果源码包经过 zip 压缩后,包大小超过了 IDE 的阈值(当前是 20M),上传时会报告 **包大小超限** 的错误。你可以根据需求配置 `uploadExclude` 黑名单,排除云端构建不需要的文件。例如,代码经过了 `src > dist` 的预编译,以及位于 `miniprogramRoot` 目录之外的 `devDependencies` 依赖。以下配置表示源码包内将不包括项目根目录下的 `src` 和 `node_modules` 目录中的文件。
+
```json
"uploadExclude": [
"src/**",
@@ -286,36 +284,37 @@ console.log(foo) // VM97:1 Uncaught ReferenceError: foo is not defined
```
## developOptions
-developOptions 字段接受一个对象,其属性值见下。
-| **属性** | **类型** | **默认值** | **描述** |
-| --- | --- | --- | --- |
-| hotReload | Boolean | false | 是否开启产物热更新。配置后开启模拟器热更新。
支持的范围:
- AXML
- ACSS
- JS 文件中的 method
|
-| parallel | Boolean | true | 是否开启多进程构建。小程序默认使用多进程编译,如果资源占用过大,可以通过 parallel: false 关闭多进程。 |
-| sourcemap | Boolean | true | IDE 3.8.1 开始支持,是否开启生成 sourcemap。本地开发时默认开启 sourcemap ,如果资源占用过大,可以通过 sourcemap: false 关闭 sourcemap。 |
-| minify | Boolean | true | IDE 3.8.1 开始支持,是否开启代码压缩。如果构建耗时过长,或者资源占用过大导致构建失败,可以通过 minify: false 关闭代码压缩。 |
-| skipTranspile | Boolean | false | IDE 3.8.8 开始支持,是否跳过 ES5 转译, 以加快开发时构建速度。 |
-| lazyCompile | Boolean | false | IDE 3.8.8 开始支持,是否按需编译页面, 以加快开发时构建速度。必须在 app.json 中同时开启 lazyCodeLoading: true |
-| ~disableParallel~ | Boolean | false | (已废弃,请使用 parallel)是否禁止多进程构建。 |
-| ~disableSourcemap~ | Boolean | false | (已废弃,请使用 sourcemap)是否禁止生成 sourcemap |
+`developOptions` 字段接受一个对象,其属性值见下表。
+
+| 属性 | 类型 | 默认值 | 描述 |
+| --------------- | ------- | ------ | ---- |
+| `hotReload` | Boolean | false | 是否开启产物热更新。配置此选项后,可以在模拟器中开启热更新。支持热更新的文件类型包括:
- AXML
- ACSS
- JS 文件中的 method |
+| `parallel` | Boolean | true | 是否开启多进程构建。小程序默认采用多进程进行编译。如果资源占用过大,可以通过设置 `parallel: false` 来关闭多进程。 |
+| `sourcemap` | Boolean | true | 从 IDE 3.8.1 版本开始支持。是否开启生成 sourcemap。在本地开发时,默认开启 sourcemap。如果资源占用过大,可以通过设置 `sourcemap: false` 来关闭 sourcemap。 |
+| `minify` | Boolean | true | 从 IDE 3.8.1 版本开始支持。是否开启代码压缩。如果构建耗时过长,或资源占用过大导致构建失败,可以通过设置 `minify: false` 来关闭代码压缩。 |
+| `skipTranspile` | Boolean | false | 从 IDE 3.8.8 版本开始支持。是否跳过 ES5 转译,以加快开发时构建速度。 |
+| `lazyCompile` | Boolean | false | 从 IDE 3.8.8 版本开始支持。是否按需编译页面,以加快开发时构建速度。该选项必须在 `app.json` 中同时开启 `lazyCodeLoading: true`。 |
+| `disableParallel`(已废弃,请使用 `parallel`)| Boolean | false | 是否禁止多进程构建。 |
+| `disableSourcemap`(已废弃,请使用 `sourcemap`)| Boolean | false | 是否禁止生成 sourcemap。 |
+## pluginResolution
+`pluginResolution` 字段接受一个对象,其属性值见下表。
-## pluginResolution
-pluginResolution 字段接受一个对象,其属性值见下。
+| 属性 | 类型 | 默认值 | 描述 |
+| --------- | ------------------------ | ----- | ----------------------------- |
+| enable | Boolean | false | 是否启用调试配置 |
+| plugins | Record | {} | 指定插件联调的静态插件版本 |
+| dynamicPlugins | Record | {} | 指定插件联调的动态插件版本 |
-| **属性** | **类型** | **默认值** | **描述** |
-| --- | --- | --- | --- |
-| enable | Boolean | false | 是否启用调试配置 |
-| plugins | Record | {} | 指定插件联调的静态插件版本 |
-| dynamicPlugins | Record | {} | 指定插件联调的动态插件版本 |
+当需要进行[插件快捷联调](https://opendocs.alipay.com/mini/plugin/01phjs)时,可以将 `enable` 设置为 `true` 并在 `plugins` 和 `dynamicPlugins` 中配置对应的插件版本信息键值对,`key` 为插件 `appId`,`value` 为插件版本信息,属性见下表。**说明**:开启快捷联调,仅在 IDE 模拟器、真机预览、真机调试等生成的线下版本中生效。
-当需要进行 [插件快捷联调](https://opendocs.alipay.com/mini/plugin/01phjs) 时,可以将 enable 设置为 true 并在 plugins 和 dynamicPlugins 中配置对应的插件版本信息键值对,key 为插件 appId,value 为插件版本信息,属性见下。
**说明:**开启快捷联调,仅在 IDE 模拟器或真机预览、真机调试等生成的线下版本中生效。
+| 属性 | 类型 | 必填 | 描述 |
+| --------- | ------ | ----- | ------------- |
+| version | String | 是 | 插件联调版本信息 |
-| **属性** | **类型** | **必填** | **描述** |
-| --- | --- | --- | --- |
-| version | String | 是 | 插件联调版本信息 |
+以下是一个常见的联调示例,表示静态插件 `2020111122223333` 指定特定联调版本 `dev:a.b.c.d`。
-一个常见的联调示例见下,表示静态插件 2020111122223333 指定特定联调版本 dev:a.b.c.d。
```json
{
"pluginResolution": {
@@ -328,27 +327,23 @@ pluginResolution 字段接受一个对象,其属性值见下。
}
}
```
-
## scripts
-针对预处理的场景, 提供了 precompile 的配置入口,允许用户在编译前/预览前/上传前先执行预处理逻辑。该逻辑会在 IDE 以及伙伴、雨燕链路中生效。
scripts 字段接受一个对象,其属性值见下。
-
-| **属性** | **类型** | **执行时机** |
-| --- | --- | --- |
-| watch | String | IDE 模拟器编译时执行,进程持续存在。 |
-| beforeCompile | String | IDE 模拟器编译时执行,执行后退出 beforeCompile 进程。 |
-| beforePreview | String | 真机预览/真机调试前执行 |
-| beforeUpload | String | IDE 上传前执行 |
+针对预处理的场景,提供了 precompile 的配置入口,允许用户在编译前/预览前/上传前先执行预处理逻辑。该逻辑会在 IDE 以及伙伴、雨燕链路中生效。`scripts` 字段接受一个对象,其属性值见下表。
+| 属性 | 类型 | 执行时机 |
+| ------------- | ------ | ----------------------------------------- |
+| watch | String | IDE 模拟器编译时执行,进程持续存在。 |
+| beforeCompile | String | IDE 模拟器编译时执行,执行后退出进程。 |
+| beforePreview | String | 真机预览/真机调试前执行 |
+| beforeUpload | String | IDE 上传前执行 |
### 触发时机
- IDE 模拟器编译时:
- - watch 脚本优先级高于 beforeCompile,两者只会执行其一。
- - watch 模式下,预构建脚本与 IDE 构建 server 同时运行。
- - beforeCompile 模式下,IDE 构建 server 会等待脚本执行完才启动。
-- 真机预览/真机调试前将执行 beforePreview 钩子。
-- IDE 上传前将执行 beforeUpload 钩子。
-
+ - `watch` 脚本优先级高于 `beforeCompile`,两者只会执行其一。
+ - `watch` 模式下,预构建脚本与 IDE 构建 server 同时运行。
+ - `beforeCompile` 模式下,IDE 构建 server 会等待脚本执行完才启动。
+- 真机预览/真机调试前将执行 `beforePreview` 钩子。
+- IDE 上传前将执行 `beforeUpload` 钩子。
-## 迁移至新项目配置
-迁移文档请参考 [迁移至新项目配置](https://opendocs.alipay.com/mini/09j22u)
+迁移文档请参考[迁移至新项目配置](https://opendocs.alipay.com/mini/09j22u)。
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\351\241\271\347\233\256\351\205\215\347\275\256\357\274\210\346\227\247\347\211\210\357\274\211.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\351\241\271\347\233\256\351\205\215\347\275\256\357\274\210\346\227\247\347\211\210\357\274\211.md"
index 81c06b99b..9cbf48fd6 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\351\241\271\347\233\256\351\205\215\347\275\256\357\274\210\346\227\247\347\211\210\357\274\211.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\205\250\345\261\200\351\205\215\347\275\256/\351\241\271\347\233\256\351\205\215\347\275\256\357\274\210\346\227\247\347\211\210\357\274\211.md"
@@ -1,30 +1,28 @@
# 简介
-在项目根目录 mini.project.json 中配置项目编译、打包策略。推荐使用新版 [项目配置](https://opendocs.alipay.com/mini/03dbc3)。
-
+在项目根目录 `mini.project.json` 中配置项目编译、打包策略。推荐使用新版的 [项目配置](https://opendocs.alipay.com/mini/03dbc3)。
# 配置项
-| **字段名** | **类型** | **说明** |
-| --- | --- | --- |
-| miniprogramRoot | String | 小程序源码目录,相对路径。该路径下应该有 app.json 文件。 |
-| pluginRoot | String | 插件源码目录,相对路径。 |
-| compileType | String | 编译类型。
可选值: **默认值**:mini |
-| component2 | Boolean | 是否启用 component2 编译,详情可查看 [生命周期](https://opendocs.alipay.com/mini/framework/component-lifecycle),IDE 详情面板有对应配置项。
**默认值**:false |
-| nonLoadingIndicator | Boolean | 初始化小程序时,是否隐藏默认 loading 动画。
**默认值**:true |
-| enableParallelLoader | Boolean | 启用多进程编译,首次无缓存时效果较明显,IDE 详情面板有对应配置项。
**默认值**:false |
-| enableDistFileMinify | Boolean | 真机预览/真机调试阶段,是否压缩最终产物,IDE 详情面板有对应配置项。
**默认值**:false |
-| scripts | Object | 自定义预处理脚本。详情可查看 [预处理脚本](https://opendocs.alipay.com/mini/ide/01s3hm#%E9%A2%84%E5%A4%84%E7%90%86%E8%84%9A%E6%9C%AC)。
**默认值**:null |
-| include | Array | 打包时需要包含的文件/文件夹,遵循 Glob 语法,详情可查看 include 打包白名单。 |
-| exclude | Array | 打包时要忽略的文件/文件夹,遵循 Glob 语法,详情可查看 exinclude 打包白名单。 |
-| ~enableNodeModuleBabelTransform~ | Boolean | (已废弃,请参考最新的 [转 ES5 配置](https://opendocs.alipay.com/mini/03dbc3#transpile)) appx 2.0 特性,对 node_modules 中的模块做 babel 编译。
**默认值**:false |
-| enableAppxNg | Boolean | 启用 appx2.0 编译,升级详情可查看 [基础库 2.x 升级](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2)。
**默认值**:false |
-| debugOptions | Object | 调试/联调的额外配置,生产构建时不生效。详情可查看 [debugOptions](https://opendocs.alipay.com/mini/ide/01s3hm#debugOptions)。
**默认值**:null |
+| 字段名 | 类型 | 说明 |
+| --------------- | -------- | --------- |
+| miniprogramRoot | String | 小程序源码目录,相对路径。该路径下应该有 app.json 文件。 |
+| pluginRoot | String | 插件源码目录,相对路径。 |
+| compileType | String | 编译类型。可选值:mini(小程序)、plugin(插件)。默认值:mini |
+| component2 | Boolean | 是否启用 component2 编译,详情可查看[生命周期](https://opendocs.alipay.com/mini/framework/component-lifecycle)。IDE 详情面板有对应配置项。默认值:false |
+| nonLoadingIndicator | Boolean | 初始化小程序时,是否隐藏默认 loading 动画。默认值:true |
+| enableParallelLoader | Boolean | 启用多进程编译,首次无缓存时效果较明显,IDE 详情面板有对应配置项。默认值:false |
+| enableDistFileMinify | Boolean | 真机预览/真机调试阶段,是否压缩最终产物,IDE 详情面板有对应配置项。默认值:false |
+| scripts | Object | 自定义预处理脚本。详情可查看[预处理脚本](https://opendocs.alipay.com/mini/ide/01s3hm#%E9%A2%84%E5%A4%84%E7%90%86%E8%84%9A%E6%9C%AC)。默认值:null |
+| include | Array | 打包时需要包含的文件/文件夹,遵循 Glob 语法,详情可查看 include 打包白名单。 |
+| exclude | Array | 打包时要忽略的文件/文件夹,遵循 Glob 语法,详情可查看 exclude 打包白名单。 |
+| enableAppxNg | Boolean | 启用 appx2.0 编译,升级详情可查看[基础库 2.x 升级](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2)。默认值:false |
+| debugOptions | Object | 调试/联调的额外配置,生产构建时不生效。详情可查看[debugOptions](https://opendocs.alipay.com/mini/ide/01s3hm#debugOptions)。默认值:null |
## 预处理脚本
-通过预构建,用户可以在 **编译前**/**预览前**/**上传前** 执行自定义命令。此功能可以用来处理 ts/less 编译、其它框架转小程序等场景。
+通过预构建,用户可以在编译前/预览前/上传前执行自定义命令。此功能可以用来处理 ts/less 编译、其他框架转小程序等场景。
-预处理脚本写在 mini.project.json 的 scripts 字段下。
+预处理脚本写在 `mini.project.json` 的 `scripts` 字段下。
### 配置示例
@@ -42,56 +40,54 @@
### 触发时机
- IDE 模拟器编译时:
- - watch 脚本优先级高 于 beforeCompile,两者只会执行其一。
- - watch 模式下,预构建脚本与 IDE 构建 server 同时运行。
- - beforeCompile 模式下,IDE 构建 server 会等待脚本执行完才启动。
-- 真机预览/真机调试前将执行 beforePreview 钩子。
-- IDE 上传前将执行 beforeUpload 钩子。
-
+ - `watch` 脚本优先级高于 `beforeCompile`,两者只会执行其一。
+ - `watch` 模式下,预构建脚本与 IDE 构建 server 同时运行。
+ - `beforeCompile` 模式下,IDE 构建 server 会等待脚本执行完才启动。
+- 真机预览/真机调试前将执行 `beforePreview` 钩子。
+- IDE 上传前将执行 `beforeUpload` 钩子。
## include 打包白名单
-小程序的构建产物包默认只会包含必要的业务产物代码和资源文件,未识别的资源类型不会出现在包内,以减小包体积。 默认打包的资源文件如下:
+小程序的构建产物包默认只会包含必要的业务产物代码和资源文件,未识别的资源类型不会出现在包内,以减小包体积。默认打包的资源文件如下:
- 图片
- - .png
- - .jpg
- - .jpeg
- - .gif
- - .svg
- - .webp
+ - `.png`
+ - `.jpg`
+ - `.jpeg`
+ - `.gif`
+ - `.svg`
+ - `.webp`
- 字体
- - .eot
- - .woff
- - .ttf
- - .woff2
- - .otf
+ - `.eot`
+ - `.woff`
+ - `.ttf`
+ - `.woff2`
+ - `.otf`
- 多媒体
- - .mp3
- - .mp4
+ - `.mp3`
+ - `.mp4`
-如小程序需要引入自定义的资源文件,可配置 include 白名单, 以下配置将会把所有 .aaa 以及 .bbb 后缀的文件也打进产物包内。
+如果小程序需要引入自定义的资源文件,可以配置 `include` 白名单。以下配置会把所有 `.aaa` 以及 `.bbb` 后缀的文件也打进产物包内。
```json
-"include" : [
+"include": [
"**/*.aaa",
- "**/*.bbb",
+ "**/*.bbb"
]
```
-
## exclude 打包黑名单
-小程序上传时,会将本地源码打包传到云端进行构建,除了上方资源文件列表外,源码包还会包含以下内容:
+小程序上传时,会将本地源码打包传到云端进行构建。除了资源文件列表外,源码包还会包含以下内容:
- 小程序源码文件
- - .acss
- - .axml
- - .js
- - .json
- - .sjs
+ - `.acss`
+ - `.axml`
+ - `.js`
+ - `.json`
+ - `.sjs`
- 依赖包
- - node_modules 目录
+ - `node_modules` 目录
-如果源码包经过 zip 压缩后,包大小仍然超过 IDE 的阈值(当前为 20M),上传时会报 **包大小超限** 的错误。可以根据需要,对云端构建不需要的文件配置 exclude 黑名单,如代码经过了 src > dist 的预编译以及 miniprogramRoot 目录之外的 devDependencies 依赖。以下配置表示源码包内将不会包含项目根目录下 src 和 node_modules 目录中的文件。
+如果经过 zip 压缩后的源码包大小仍超过 IDE 阈值(当前为 20M),上传时将报告“包大小超限”错误。可以通过配置 exclude 黑名单,排除云端构建不需要的文件。如下配置表示源码包内不会包含项目根目录下的 `src` 和 `node_modules` 目录中的文件。
```json
"exclude": [
@@ -102,26 +98,26 @@
## debugOptions
-调试/联调的额外配置,生产构建时不生效。
+这是调试或联调时的额外配置项,正式构建时不生效。
-- enable:Boolean 是否启用此项配置。
-- plugins:Object 插件联调配置,指定某些插件走线下版本(四位版本号),方便联调。
-- dynamicPlugins:Object 动态插件联调配置(格式同 plugins)。
+- `enable`:Boolean,指示是否启用此项配置。
+- `plugins`:Object,用于插件联调配置,可指定插件使用线下版本(四位版本号),以便调试。
+- `dynamicPlugins`:Object,用于动态插件联调配置(格式与 `plugins` 相同)。
### 配置样例
```json
- "debugOptions": {
- "enable": true,
- "plugins": {
- "2021001126652765": {
- "version": "dev:0.2.2009071414.41"
- }
- },
- "dynamicPlugins": {
- "2021001126652765": {
- "version": "inspect:0.2.2009181119.27"
- }
+"debugOptions": {
+ "enable": true,
+ "plugins": {
+ "2021001126652765": {
+ "version": "dev:0.2.2009071414.41"
+ }
+ },
+ "dynamicPlugins": {
+ "2021001126652765": {
+ "version": "inspect:0.2.2009181119.27"
}
}
+}
```
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\234\272\346\231\257\345\200\274.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\234\272\346\231\257\345\200\274.md"
index ed583333a..e363cb5b2 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\345\234\272\346\231\257\345\200\274.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\345\234\272\346\231\257\345\200\274.md"
@@ -1,34 +1,36 @@
# 简介
**版本需求**:
-1. 基础库 1.10.0 开始支持,低版本需做兼容处理。
-2. 基础库 2.8.17 开始新增渠道场景值。完整场景值定义见 [场景值列表](https://opendocs.alipay.com/mini/08otyv?pathHash=5e710835)。
+1. 基础库 `1.10.0` 开始支持,低版本需做兼容处理。
+2. 基础库 `2.8.17` 开始新增渠道场景值。完整场景值定义见[场景值列表](https://opendocs.alipay.com/mini/08otyv?pathHash=5e710835)。
场景值用于描述用户进入小程序的路径。
-由于 Android 系统限制,目前还无法获取到按 Home 键退出到桌面,然后从桌面再次进小程序的场景值,对于这种情况,会保留上一次的场景值。
+由于 Android 系统限制,目前还无法获取按 Home 键退出到桌面然后从桌面再次进入小程序的场景值。对于这种情况,会保留上一次的场景值。
# 获取场景值
开发者可以在 `app.js` 的 `onLaunch()` 和 `onShow()` 方法传入的 `options.scene` 中获取场景值。
# 场景值列表
-完整场景值定义见 [场景值列表](https://opendocs.alipay.com/mini/08otyv?pathHash=5e710835)。
+
+完整场景值定义见[场景值列表](https://opendocs.alipay.com/mini/08otyv?pathHash=5e710835)。
# 示例代码
```javascript
App({
onLaunch(options) {
- console.log('App onLaunch Scene:', options.scene); //options.scene 是 String 类型的
+ console.log('App onLaunch Scene:', options.scene); // options.scene 是 String 类型的
},
onShow(options) {
console.log('App onShow Scene:', options.scene);
},
});
```
+
# 常见问题
## Q:如何获取跳转小程序链接?
-A:需要开发者自行拼接,详情可查看 [小程序相互跳转 FAQ](https://opendocs.alipay.com/mini/0090ty)。
+A:需要开发者自行拼接,详情可查看[小程序相互跳转 FAQ](https://opendocs.alipay.com/mini/0090ty)。
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\347\232\204 JavaScript \345\274\225\346\223\216.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\347\232\204 JavaScript \345\274\225\346\223\216.md"
index d3290efdb..1c1dbd6ba 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\347\232\204 JavaScript \345\274\225\346\223\216.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\347\232\204 JavaScript \345\274\225\346\223\216.md"
@@ -4,111 +4,112 @@
在不同操作系统上,小程序的 JavaScript 引擎是不同的。在 iOS 平台上,脚本运行在操作系统提供的 JavaScriptCore 引擎上;而在 Android 平台上,脚本则运行在支付宝提供的 V8 引擎上。
-支付宝小程序通过对开发者上传的代码进行 [babel](https://babeljs.io/) 转换,使 JavaScript 引擎支持绝大多数 ES6 的新特性。但是对于 ES6 扩展的内置对象,小程序并未在 JavaScript 引擎上提供 polyfill,因此会导致在不同平台的 JavaScript 引擎中,对不同的 ES6 扩展的内置对象支持存在差异。
+支付宝小程序通过对开发者上传的代码进行 [Babel](https://babeljs.io/) 转换,使 JavaScript 引擎支持绝大多数 ES6 的新特性。但是,对于 ES6 扩展的内置对象,小程序并未在 JavaScript 引擎上提供 polyfill,因此在不同平台的 JavaScript 引擎中,对不同的 ES6 扩展的内置对象支持存在差异。
-开发者需要避免使用 JavaScript 引擎不支持的内置对象。 如果必须使用,可自己提供内置对象的 polyfill(Polyfill :用于实现浏览器或其它 JavaScript 引擎不支持的原生 API 的代码 )。
+开发者需要避免使用 JavaScript 引擎不支持的内置对象。如果必须使用,可以自己提供内置对象的 polyfill(Polyfill:用于实现浏览器或其它 JavaScript 引擎不支持的原生 API 的代码)。
-**注意**:小程序引擎中禁止访问 globalThis、global ,因此无法直接使用 [babel-polyfill](https://babeljs.io/docs/en/babel-polyfill)。
+**注意**:小程序引擎中禁止访问 `globalThis`、`global`,因此无法直接使用 [Babel-polyfill](https://babeljs.io/docs/en/babel-polyfill)。
# 客户端引擎的支持情况
-
## 各操作系统对 ES6 扩展内置对象支持情况
-下表是各个操作系统对 ES6 扩展的内置对象的支持情况:
+下表是各操作系统对 ES6 扩展的内置对象的支持情况:
-| **Object** | **iOS 8** | **iOS 9** | **iOS 10 及以上** | **Android** |
-| --- | --- | --- | --- | --- |
-| Object.is | **不支持** | 支持 | 支持 | 支持 |
-| Object.assign | **不支持** | 支持 | 支持 | 支持 |
+| Object | iOS 8 | iOS 9 | iOS 10 及以上 | Android |
+| ------ | ----- | ----- | ------------ | ------- |
+| Object.is | 不支持 | 支持 | 支持 | 支持 |
+| Object.assign | 不支持 | 支持 | 支持 | 支持 |
| Object.keys | 支持 | 支持 | 支持 | 支持 |
| Object.getOwnPropertyDescriptor | 支持 | 支持 | 支持 | 支持 |
| Object.getOwnPropertyNames | 支持 | 支持 | 支持 | 支持 |
-| Object.getOwnPropertySymbols | **不支持** | 支持 | 支持 | 支持 |
-
-| **String** | **iOS 8** | **iOS 9** | **iOS 10 及以上** | **Android** |
-| --- | --- | --- | --- | --- |
-| String.prototype.codePointAt | **不支持** | 支持 | 支持 | 支持 |
-| String.prototype.normalize | **不支持** | **不支持** | 支持 | 支持 |
-| String.prototype.includes | **不支持** | 支持 | 支持 | 支持 |
-| String.prototype.startsWith | **不支持** | 支持 | 支持 | 支持 |
-| String.prototype.endsWith | **不支持** | 支持 | 支持 | 支持 |
-| String.prototype.repeat | **不支持** | 支持 | 支持 | 支持 |
-| String.fromCodePoint | **不支持** | 支持 | 支持 | 支持 |
-
-| **Array** | **iOS 8** | **iOS 9** | **iOS 10 及以上** | **Android** |
-| --- | --- | --- | --- | --- |
-| Array.prototype.copyWithin | **不支持** | 支持 | 支持 | 支持 |
+| Object.getOwnPropertySymbols | 不支持 | 支持 | 支持 | 支持 |
+
+| String | iOS 8 | iOS 9 | iOS 10 及以上 | Android |
+| ------ | ----- | ----- | ------------ | ------- |
+| String.prototype.codePointAt | 不支持 | 支持 | 支持 | 支持 |
+| String.prototype.normalize | 不支持 | 不支持 | 支持 | 支持 |
+| String.prototype.includes | 不支持 | 支持 | 支持 | 支持 |
+| String.prototype.startsWith | 不支持 | 支持 | 支持 | 支持 |
+| String.prototype.endsWith | 不支持 | 支持 | 支持 | 支持 |
+| String.prototype.repeat | 不支持 | 支持 | 支持 | 支持 |
+| String.fromCodePoint | 不支持 | 支持 | 支持 | 支持 |
+
+| Array | iOS 8 | iOS 9 | iOS 10 及以上 | Android |
+| ----- | ------ | ----- | ------------- | ------- |
+| Array.prototype.copyWithin | 不支持 | 支持 | 支持 | 支持 |
| Array.prototype.find | 支持 | 支持 | 支持 | 支持 |
| Array.prototype.findIndex | 支持 | 支持 | 支持 | 支持 |
| Array.prototype.fill | 支持 | 支持 | 支持 | 支持 |
| Array.prototype.entries | 支持 | 支持 | 支持 | 支持 |
| Array.prototype.keys | 支持 | 支持 | 支持 | 支持 |
-| Array.prototype.values | **不支持** | 支持 | 支持 | **不支持** |
-| Array.prototype.includes | **不支持** | 支持 | 支持 | 支持 |
-| Array.from | **不支持** | 支持 | 支持 | 支持 |
-| Array.of | **不支持** | 支持 | 支持 | 支持 |
-
-| **Number** | **iOS 8** | **iOS 9** | **iOS 10 及以上** | **Android** |
-| --- | --- | --- | --- | --- |
-| Number.isFinite | **不支持** | 支持 | 支持 | 支持 |
-| Number.isNaN | **不支持** | 支持 | 支持 | 支持 |
-| Number.parseInt | **不支持** | 支持 | 支持 | 支持 |
-| Number.parseFloat | **不支持** | 支持 | 支持 | 支持 |
-| Number.isInteger | **不支持** | 支持 | 支持 | 支持 |
-| Number.EPSILON | **不支持** | 支持 | 支持 | 支持 |
-| Number.isSafeInteger | **不支持** | 支持 | 支持 | 支持 |
-
-| **Math** | **iOS 8** | **iOS 9** | **iOS 10 及以上** | **Android** |
-| ----------- | ---------- | --------- | ----------------- | ----------- |
-| Math.trunc | 支持 | 支持 | 支持 | 支持 |
-| Math.sign | **不支持** | 支持 | 支持 | 支持 |
-| Math.cbrt | 支持 | 支持 | 支持 | 支持 |
-| Math.clz32 | 支持 | 支持 | 支持 | 支持 |
-| Math.imul | 支持 | 支持 | 支持 | 支持 |
-| Math.fround | 支持 | 支持 | 支持 | 支持 |
-| Math.hypot | 支持 | 支持 | 支持 | 支持 |
-| Math.expm1 | 支持 | 支持 | 支持 | 支持 |
-| Math.log1p | 支持 | 支持 | 支持 | 支持 |
-| Math.log10 | 支持 | 支持 | 支持 | 支持 |
-| Math.log2 | 支持 | 支持 | 支持 | 支持 |
-| Math.sinh | 支持 | 支持 | 支持 | 支持 |
-| Math.cosh | 支持 | 支持 | 支持 | 支持 |
-| Math.tanh | 支持 | 支持 | 支持 | 支持 |
-| Math.asinh | 支持 | 支持 | 支持 | 支持 |
-| Math.acosh | 支持 | 支持 | 支持 | 支持 |
-| Math.atanh | 支持 | 支持 | 支持 | 支持 |
-
-| **内置对象** | **iOS 8** | **iOS 9** | **iOS 10 及以上** | **Android** |
-| ------------ | ---------- | ---------- | ----------------- | ----------- |
-| Set | 支持 | 支持 | 支持 | 支持 |
-| Map | 支持 | 支持 | 支持 | 支持 |
-| WeakMap | 支持 | 支持 | 支持 | 支持 |
-| WeakSet | **不支持** | 支持 | 支持 | 支持 |
-| Symbol | **不支持** | 支持 | 支持 | 支持 |
-| Proxy | **不支持** | **不支持** | 支持 | 支持 |
-| Reflect | **不支持** | **不支持** | 支持 | 支持 |
-| Promise | 支持 | 支持 | 支持 | 支持 |
-
+| Array.prototype.values | 不支持 | 支持 | 支持 | 不支持 |
+| Array.prototype.includes | 不支持 | 支持 | 支持 | 支持 |
+| Array.from | 不支持 | 支持 | 支持 | 支持 |
+| Array.of | 不支持 | 支持 | 支持 | 支持 |
+
+| Number | iOS 8 | iOS 9 | iOS 10 及以上 | Android |
+| ------ | ------ | ----- | ------------- | ------- |
+| Number.isFinite | 不支持 | 支持 | 支持 | 支持 |
+| Number.isNaN | 不支持 | 支持 | 支持 | 支持 |
+| Number.parseInt | 不支持 | 支持 | 支持 | 支持 |
+| Number.parseFloat | 不支持 | 支持 | 支持 | 支持 |
+| Number.isInteger | 不支持 | 支持 | 支持 | 支持 |
+| Number.EPSILON | 不支持 | 支持 | 支持 | 支持 |
+| Number.isSafeInteger | 不支持 | 支持 | 支持 | 支持 |
+
+| Math | iOS 8 | iOS 9 | iOS 10 及以上 | Android |
+| ---- | ------ | ----- | ------------- | ------- |
+| Math.trunc | 支持 | 支持 | 支持 | 支持 |
+| Math.sign | 不支持 | 支持 | 支持 | 支持 |
+| Math.cbrt | 支持 | 支持 | 支持 | 支持 |
+| Math.clz32 | 支持 | 支持 | 支持 | 支持 |
+| Math.imul | 支持 | 支持 | 支持 | 支持 |
+| Math.fround | 支持 | 支持 | 支持 | 支持 |
+| Math.hypot | 支持 | 支持 | 支持 | 支持 |
+| Math.expm1 | 支持 | 支持 | 支持 | 支持 |
+| Math.log1p | 支持 | 支持 | 支持 | 支持 |
+| Math.log10 | 支持 | 支持 | 支持 | 支持 |
+| Math.log2 | 支持 | 支持 | 支持 | 支持 |
+| Math.sinh | 支持 | 支持 | 支持 | 支持 |
+| Math.cosh | 支持 | 支持 | 支持 | 支持 |
+| Math.tanh | 支持 | 支持 | 支持 | 支持 |
+| Math.asinh | 支持 | 支持 | 支持 | 支持 |
+| Math.acosh | 支持 | 支持 | 支持 | 支持 |
+| Math.atanh | 支持 | 支持 | 支持 | 支持 |
+
+| 内置对象 | iOS 8 | iOS 9 | iOS 10 及以上| Android |
+| ---------- | -------- | ------- | -------------- | ------- |
+| Set | 支持 | 支持 | 支持 | 支持 |
+| Map | 支持 | 支持 | 支持 | 支持 |
+| WeakMap | 支持 | 支持 | 支持 | 支持 |
+| WeakSet | 不支持 | 支持 | 支持 | 支持 |
+| Symbol | 不支持 | 支持 | 支持 | 支持 |
+| Proxy | 不支持 | 不支持 | 支持 | 支持 |
+| Reflect | 不支持 | 不支持 | 支持 | 支持 |
+| Promise | 支持 | 支持 | 支持 | 支持 |
## 各操作系统对 Date 的支持情况
-通过 new Date(...) 解析日期字符串时,iOS 系统不支持使用短线连接的日期形式,即:
+通过 `new Date(...)` 解析日期字符串时,iOS 系统不支持使用短线连接的日期形式,即:
+
+| 执行代码 | iOS | Android |
+| ----------------------------------------------- | ----- | ------- |
+| `new Date("yyyy-MM-dd HH:mm:ss").getTime()` | 不支持 | 支持 |
+| `new Date("yyyy/MM/dd HH:mm:ss").getTime()` | 支持 | 支持 |
-| **执行代码** | **iOS** | **Android** |
-| ----------------------------------------- | ---------- | ----------- |
-| new Date("yyyy-MM-dd HH:mm:ss").getTime() | **不支持** | 支持 |
-| new Date("yyyy/MM/dd HH:mm:ss").getTime() | 支持 | 支持 |
# 对动态执行脚本的限制
-出于安全考虑,小程序限制了部分 ES 的语法和 API :
+出于安全考虑,小程序限制了部分 ES 的语法和 API:
+
+- 不支持 `eval` 使用。
+- `setTimeout` 和 `setInterval` 函数仅支持函数做回调参数,不可动态执行代码。
+- 不支持使用 `new Function` 创建函数。
-- 不支持 eval 使用。
-- setTimeout 和 setInterval 函数仅支持函数做回调参数,不可动态执行代码。
-- 不支持使用 new Function 创建函数。
# 模块名保留字
-小程序的逻辑层支持 ES2015 模块化语法,但是将浏览器部分内置对象名(如 window、document)作保留字使用,以应对未来的不时之需,这些保留字不可用做模块名。保留字有:globalThis、global、AlipayJSBridge、fetch、self、window、document、location、XMLHttpRequest。更多详情可查看 [框架概述](https://opendocs.alipay.com/mini/framework/overview) 中对模块名保留字的介绍。
+小程序的逻辑层支持 ES2015 模块化语法,但是将浏览器部分内置对象名(如 `window`、`document`)作保留字使用,以应对未来的不时之需,这些保留字不可用做模块名。保留字有:`globalThis`、`global`、`AlipayJSBridge`、`fetch`、`self`、`window`、`document`、`location`、`XMLHttpRequest`。更多详情可查看 [框架概述](https://opendocs.alipay.com/mini/framework/overview) 中对模块名保留字的介绍。
+
# 相关文档
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\350\277\220\350\241\214\346\234\272\345\210\266.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\350\277\220\350\241\214\346\234\272\345\210\266.md"
index fdb771a04..e379d6286 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\350\277\220\350\241\214\346\234\272\345\210\266.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\350\277\220\350\241\214\346\234\272\345\210\266.md"
@@ -1,56 +1,56 @@
# 下载
-小程序无需安装,用户第一次使用小程序时,支付宝客户端会从服务器下载小程序的资源,下载后的小程序资源会缓存在支付宝的客户端一段时间。当用户再次打开已经缓存资源的小程序时,会跳过下载过程,能够更快地打开小程序。
+小程序无需安装,用户第一次使用小程序时,支付宝客户端会从服务器下载小程序的资源。下载后的小程序资源会缓存在支付宝客户端一段时间。当用户再次打开已经缓存资源的小程序时,会跳过下载过程,能够更快地打开小程序。
# 热启动和冷启动
-- **冷启动**:当用户打开未启动过,或者是已经销毁的小程序时,称为冷启动。此时小程序会执行初始化,初始化完成后,会触发 `onLaunch` 回调函数。
-- **热启动**:当用户打开已经关闭但仍处于后台运行的小程序时,称为热启动。在这种情况下,小程序并不会被销毁后重启,而仅是从后台切换到前台,此时,`onShow` 函数会触发,`onLaunch` 回调函数不会被触发。
+- **冷启动**:当用户打开未启动过,或者是已经销毁的小程序时,称为冷启动。这时,小程序会执行初始化,初始化完成后,会触发 `onLaunch` 回调函数。
+- **热启动**:当用户打开已经关闭但仍处于后台运行的小程序时,称为热启动。在这种情况下,小程序不会被销毁后重启,而是从后台切换到前台。此时,`onShow` 函数会被触发,而 `onLaunch` 回调函数不会。
-# 前台 / 后台运行
+# 前台/后台运行
-- **前台运行:** 当用户首次打开小程序时候,小程序会处于前台运行状态。
-- **后台运行:** 用户点击右上角关闭按钮关闭小程序,或者按下设备 Home 键离开支付宝客户端时,小程序并不会直接销毁,而是进入后台运行状态。
-- **从后台运行切换为前台运行:** 当未被系统销毁的小程序再度被打开或者激活时,会从后台运行切换为前台运行。
+- **前台运行**:当用户首次打开小程序时,小程序会处于前台运行状态。
+- **后台运行**:用户点击右上角关闭按钮关闭小程序,或者按下设备Home键离开支付宝客户端时,小程序并不会直接销毁,而是进入后台运行状态。
+- **从后台切换到前台运行**:当未被系统销毁的小程序再度被打开或激活时,会从后台运行切换到前台运行。
-可在 [app.js](https://opendocs.alipay.com/mini/framework/app-detail) 中注册前台 / 后台切换的回调函数。当小程序从后台进入前台显示时会触发 `onShow`,当小程序从前台到后台时会触发 `onHide`。
+可在 [app.js](https://opendocs.alipay.com/mini/framework/app-detail) 中注册前台/后台切换的回调函数。当小程序从后台进入前台显示时,会触发 `onShow`;当小程序从前台转到后台时,会触发 `onHide`。
# 缓存
-开启本地缓存数据,进行存储、获取和删除等控制。 单个小程序的缓存总上限为 10 MB。 同步方法会阻塞当前任务,直到同步方法处理返回。异步方法不会阻塞当前任务。
-| **操作** | **同步** | **异步** | **描述** |
-| --------| ------- | --------| --------|
-| 存储 | [my.setStorageSync](https://opendocs.alipay.com/mini/api/cog0du) | [my.setStorage](https://opendocs.alipay.com/mini/api/eocm6v) | 数据存储在本地缓存中指定的 key 中的接口,会覆盖掉原来该 key 对应的数据。 |
-| 读取 | [my.getStorageSync](https://opendocs.alipay.com/mini/api/ox0wna) | [my.getStorage](https://opendocs.alipay.com/mini/api/azfobl) | 获取缓存数据的接口。 |
-| 清除 | [my.clearStorageSync](https://opendocs.alipay.com/mini/api/ulv85u) | [my.clearStorage](https://opendocs.alipay.com/mini/api/storage) | 清除本地数据缓存的接口。 |
-| 删除 | [my.removeStorageSync](https://opendocs.alipay.com/mini/api/ytfrk4) | [my.removeStorage](https://opendocs.alipay.com/mini/api/of9hze) | 删除缓存数据的接口。 |
-| 获取相关信息 | [my.getStorageInfoSync](https://opendocs.alipay.com/mini/api/uw5rdl) | [my.getStorageInfo](https://opendocs.alipay.com/mini/api/zvmanq) | 获取当前 storage 的相关信息的接口。 |
+开启本地缓存数据后,可以进行存储、获取和删除等操作。单个小程序的缓存总上限为 10MB。同步方法在执行时会阻塞当前任务,直到同步方法处理完成返回。异步方法不会阻塞当前任务。
-# 销毁
+| **操作** | **同步接口** | **异步接口** | **描述** |
+| -------- | ------------ | ------------ | -------- |
+| 存储 | [my.setStorageSync](https://opendocs.alipay.com/mini/api/cog0du) | [my.setStorage](https://opendocs.alipay.com/mini/api/eocm6v) | 数据存储在本地缓存中指定的key中,会覆盖原有的数据。|
+| 读取 | [my.getStorageSync](https://opendocs.alipay.com/mini/api/ox0wna) | [my.getStorage](https://opendocs.alipay.com/mini/api/azfobl) | 获取本地缓存数据。|
+| 清除 | [my.clearStorageSync](https://opendocs.alipay.com/mini/api/ulv85u) | [my.clearStorage](https://opendocs.alipay.com/mini/api/storage) | 清除本地所有缓存数据。|
+| 删除 | [my.removeStorageSync](https://opendocs.alipay.com/mini/api/ytfrk4) | [my.removeStorage](https://opendocs.alipay.com/mini/api/of9hze) | 删除指定key的缓存数据。|
+| 获取信息 | [my.getStorageInfoSync](https://opendocs.alipay.com/mini/api/uw5rdl) | [my.getStorageInfo](https://opendocs.alipay.com/mini/api/zvmanq) | 获取本地缓存的相关信息。|
-用户点击右上角关闭按钮关闭小程序时,小程序仅是进入后台运行,不会被销毁。只有当小程序进入后台运行状态一定时间,或者占用系统资源过高时,才会被真正销毁。
+# 销毁
+用户点击右上角关闭按钮关闭小程序时,小程序仅是进入后台运行,并不会被销毁。只有当小程序在后台运行一段时间或占用系统资源过高时,才会被系统销毁。
# 常见问题
## Q:小程序如何使用 cookie?
-A:小程序中不建议使用 cookie,小程序针对服务端回设的 cookie 不会禁用掉,会设置到小程序进程中,下次小程序进行请求,会自动将已有的 cookie 带入到服务端请求中。前端获取不到 cookie,也不会对 cookie 做任何操作。小程序建议使用 [缓存](https://opendocs.alipay.com/mini/framework/operating-mechanism#%E7%BC%93%E5%AD%98)。
+A:小程序中不建议使用 cookie。小程序针对服务端回设的 cookie 不会禁用,而是会设置到小程序进程中。下次请求时,小程序会自动将已有的 cookie 带入到服务端。前端无法获取 cookie,也不会对 cookie 进行任何操作。小程序建议使用[缓存](https://opendocs.alipay.com/mini/framework/operating-mechanism#%E7%BC%93%E5%AD%98)。
## Q:使用了缓存 API 后,小程序的缓存什么时候会被清掉?
-A:使用了缓存 API 必须使用清除 API,否则缓存不会被清除掉。
+A:使用了缓存 API 后,必须使用清除 API,否则缓存不会被清除。
-## Q:小程序启动报错 Error: EACCES: permission denied, mkdir /Users/xiaoqiang/Tuhu/Gitlab/Ali\_ App/Ali_App/dist/.tea
+## Q:小程序启动报错 Error: EACCES: permission denied, mkdir /Users/xiaoqiang/Tuhu/Gitlab/Ali_App/Ali_App/dist/.tea
-A:权限问题,用超级用户来执行。在 npm install 指令前加 sudo 变为: sudo npm install。
+A:这是权限问题。请以超级用户身份执行命令。将 `npm install` 指令前加上 `sudo`,即 `sudo npm install`。
## Q:打开小程序报错“系统异常,暂时无法启动,请稍后再试”
-A:支付宝客户端版本过低,不支持某些 API 或者组件,会报这样的错误。建议做 [兼容](https://opendocs.alipay.com/mini/framework/compatibility) 处理。
+A:可能是支付宝客户端版本过低,不支持某些 API 或组件。建议执行[兼容](https://opendocs.alipay.com/mini/framework/compatibility)处理。
## Q:小程序中存入的缓存数据为什么多了一对双引号?
-A:告知在调用存入 API 时使用了 JSON.stringify 导致。
+A:这是因为在调用存入 API 时使用了 `JSON.stringify`。正确使用即可避免这个问题。
# 相关文档
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/Router.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/Router.md"
index 102724e7f..d3e996caf 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/Router.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/Router.md"
@@ -1,81 +1,94 @@
-页面路由器对象,有 switchTab、 reLaunch 、redirectTo、 navigateTo、 navigateBack 五个方法。可以通过 this.pageRouter 或 this.router 获得当前页面或自定义组件的路由器对象。
与同名的全局方法 [my.switchTab](https://opendocs.alipay.com/mini/api/ui-tabbar)、[my.reLaunch](https://opendocs.alipay.com/mini/api/hmn54z)、[my.redirectTo](https://opendocs.alipay.com/mini/api/fh18ky)、[my.navigateTo](https://opendocs.alipay.com/mini/api/zwi8gx)、[my.navigateBack](https://opendocs.alipay.com/mini/api/kc5zbx) 功能相同,唯一区别在于页面路由器中的方法调用时,相对路径是相对于 this 指代的页面或自定义组件。通常情况下,更推荐使用 this.pageRouter 和 this.router 进行路由跳转。
基础库 [2.7.22](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始支持,若版本较低,建议做 [兼容](https://opendocs.alipay.com/mini/framework/compatibility) 处理。
+页面路由器对象有 `switchTab`、`reLaunch`、`redirectTo`、`navigateTo`、`navigateBack` 五个方法。可以通过 `this.pageRouter` 或 `this.router` 获得当前页面或自定义组件的路由器对象。
+
+与同名的全局方法 [my.switchTab](https://opendocs.alipay.com/mini/api/ui-tabbar)、[my.reLaunch](https://opendocs.alipay.com/mini/api/hmn54z)、[my.redirectTo](https://opendocs.alipay.com/mini/api/fh18ky)、[my.navigateTo](https://opendocs.alipay.com/mini/api/zwi8gx)、[my.navigateBack](https://opendocs.alipay.com/mini/api/kc5zbx) 功能相同,唯一区别在于页面路由器中的方法调用时,相对路径是相对于 this 指代的页面或自定义组件。通常情况下,更推荐使用 this.pageRouter 和 this.router 进行路由跳转。
+
+基础库 [2.7.22](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始支持,若版本较低,建议做[兼容](https://opendocs.alipay.com/mini/framework/compatibility)处理。
# 页面的 Router
-在页面中调用时,this.pageRouter 和 this.router 获得的是同一个页面路由器对象(即 this.pageRouter === this.router),将相对于 this 指代的页面进行路由跳转。
+
+在页面中调用时,`this.pageRouter` 和 `this.router` 获得的是同一个页面路由器对象(即 `this.pageRouter === this.router`),将相对于 `this` 指代的页面进行路由跳转。
# 自定义组件的 Router
-在自定义组件中调用时,this.router 将相对于 this 指代的自定义组件自身定义时的路径进行路由跳转。
this.pageRouter 将相对于 this 指代的自定义组件所在页面的路径进行路由跳转。自定义组件的 this.pageRouter 和自定义组件所在页面的 this.pageRouter 获得的是同一个页面路由器对象。
+
+在自定义组件中调用时,`this.router` 将相对于 `this` 指代的自定义组件自身定义时的路径进行路由跳转。`this.pageRouter` 将相对于 `this` 指代的自定义组件所在页面的路径进行路由跳转。自定义组件的 `this.pageRouter` 和自定义组件所在页面的 `this.pageRouter` 获得的是同一个页面路由器对象。
# 路由的相对路径
-| **this** | **this.router** | **this.pageRouter** |
-| --- | --- | --- |
-| **页面** | 相对于 this 指代的页面的路径 | 相对于 this 指代的页面的路径 |
-| **自定义组件** | 相对于 this 指代的自定义组件自身定义时的路径 | 相对于 this 指代的自定义组件所在页面的路径 |
+| this | this.router | this.pageRouter |
+|---------------------|-------------------------------------|---------------------------------------------|
+| 页面 | 相对于 this 指代的页面的路径 | 相对于 this 指代的页面的路径 |
+| 自定义组件 | 相对于 this 指代的自定义组件自身定义时的路径 | 相对于 this 指代的自定义组件所在页面的路径 |
## 使用说明
-- 由于插件和宿主的权限管控,由插件(插件自定义组件或插件页面)发起的路由跳转,无论是使用页面路由器对象 Router 上的路由方法还是全局对象 my 上的路由方法,均不支持跳转到宿主小程序页面或另一个插件页面。
-- 由于插件和宿主的权限管控,当插件自定义组件被用在宿主小程序或另一个插件中时,该插件自定义组件的 this.pageRouter 为 null。
-- 如果在页面 A 通过 redirectTo、reLaunch、navigateBack 方法跳转到页面 B,页面 A 会被销毁,在销毁后的页面 A 调用 this.pageRouter 或 this.router 的路由方法不会生效。
+- 由于插件和宿主的权限管控,由插件(插件自定义组件或插件页面)发起的路由跳转,无论是使用页面路由器对象 `Router` 上的路由方法还是全局对象 `my` 上的路由方法,均不支持跳转到宿主小程序页面或另一个插件页面。
+- 由于插件和宿主的权限管控,当插件自定义组件被用在宿主小程序或另一个插件中时,该插件自定义组件的 `this.pageRouter` 为 `null`。
+- 如果在页面 A 通过 `redirectTo`、`reLaunch`、`navigateBack` 方法跳转到页面 B,页面 A 会被销毁,在销毁后的页面 A 调用 `this.pageRouter` 或 `this.router` 的路由方法不会生效。
# 示例代码
-项目目录结构如下所示。

假设当前页面(栈顶页面)路径为 pages2/index/index,分别在页面 page/index/index 和 自定义组件 components/com/com 中调用路由方法 my.navigateTo、this.pageRouter.navigateTo、this.router.navigateTo 进行路由跳转,跳转结果如下:
+
+项目目录结构如下所示:
+
+
+
+假设当前页面(栈顶页面)路径为 `pages2/index/index`,分别在页面 `page/index/index` 和自定义组件 `components/com/com` 中调用路由方法 `my.navigateTo`、`this.pageRouter.navigateTo`、`this.router.navigateTo` 进行路由跳转,跳转结果如下:
+
```javascript
// 自定义组件 components/com/com.json
{
"component": true
}
-
// components/com/com.js
-Components({
- myNavigateTo(){
- // 相对于栈顶页面的路径 pages2/index/index 进行路由跳转
- // 将会跳转到 pages2/test/test 页面
- my.navigateTo({
- url: '../test/test'
- });
- },
- pageRouterNavigateTo(){
- // 相对于自定义组件所在页面的路径 pages/index/index 进行路由跳转
- // 将会跳转到 pages/test/test 页面
- this.pageRouter.navigateTo({
- url: '../test/test'
- });
- },
- routerNavigateTo(){
- // 相对于 this 指代的自定义组件自身定义时的路径 components/com/com 进行路由跳转
- // 将会跳转到 components/test/test 页面
- this.router.navigateTo({
- url: '../test/test'
- });
- },
+Component({
+ methods: {
+ myNavigateTo() {
+ // 相对于栈顶页面的路径 pages2/index/index 进行路由跳转
+ // 将会跳转到 pages2/test/test 页面
+ my.navigateTo({
+ url: '../test/test'
+ });
+ },
+ pageRouterNavigateTo() {
+ // 相对于自定义组件所在页面的路径 pages/index/index 进行路由跳转
+ // 将会跳转到 pages/test/test 页面
+ this.pageRouter.navigateTo({
+ url: '../test/test'
+ });
+ },
+ routerNavigateTo() {
+ // 相对于 this 指代的自定义组件自身定义时的路径 components/com/com 进行路由跳转
+ // 将会跳转到 components/test/test 页面
+ this.router.navigateTo({
+ url: '../test/test'
+ });
+ }
+ }
})
```
+
```javascript
-// pages/index/index.json
+// 页面 pages/index/index.json
{
"usingComponents": {
- "com": "../../components/com/com",
+ "com": "../../components/com/com"
}
}
-
-// pages/index/index.axml
+// 页面 pages/index/index.axml
-
-//页面 pages/index/index.js
+
+// 页面 pages/index/index.js
Page({
- myNavigateTo(){
+ myNavigateTo() {
// 相对于栈顶页面的路径 pages2/index/index 进行路由跳转
// 将会跳转到 pages2/test/test 页面
my.navigateTo({
url: '../test/test'
});
},
- pageRouterNavigateTo(){
+ pageRouterNavigateTo() {
// true
console.log(this.router === this.pageRouter);
@@ -85,12 +98,12 @@ Page({
url: '../test/test'
});
},
- routerNavigateTo(){
+ routerNavigateTo() {
// 相对于 this 指代的页面路径 pages/index/index 进行路由跳转
// 将会跳转到 pages/test/test 页面
this.router.navigateTo({
url: '../test/test'
});
- },
+ }
})
```
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/Sitemap \351\205\215\347\275\256.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/Sitemap \351\205\215\347\275\256.md"
index 2c8681d11..54af8b6f9 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/Sitemap \351\205\215\347\275\256.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/Sitemap \351\205\215\347\275\256.md"
@@ -1,52 +1,53 @@
# 简介
-小程序服务搜索功能目前已开放,开发者可以通过 sitemap.json 配置,或者 [小程序服务收录](https://opendocs.alipay.com/b/03al9f) 功能来配置其小程序页面是否允许小程序算法识别。当页面被小程序算法识别后,系统自动生成小程序服务,并在 [搜索](https://opendocs.alipay.com/b/03al66) 等场景上曝光,当用户的搜索关键词命中服务名称时,小程序服务可能展示在搜索结果中。
+小程序服务搜索功能目前已开放,开发者可以通过 `sitemap.json` 配置,或者[小程序服务收录](https://opendocs.alipay.com/b/03al9f)功能来配置其小程序页面是否允许小程序算法识别。当页面被小程序算法识别后,系统自动生成小程序服务,并在[搜索](https://opendocs.alipay.com/b/03al66)等场景上曝光,当用户的搜索关键词命中服务名称时,小程序服务可能展示在搜索结果中。
## 使用场景
-目前该能力适用在小程序服务同步。当开启后算法识别到小程序服务时,会在 **服务管理** > **服务同步** 中展示服务信息,商家可在列表页补齐信息提交审核,审核通过的小程序服务可在搜索侧展示。
+目前该能力适用于小程序服务同步。当开启后,算法识别到小程序服务时,会在**服务管理** > **服务同步**中展示服务信息,商家可在列表页补齐信息提交审核,审核通过的小程序服务可在搜索侧展示。
-
+
# sitemap 配置
-小程序根目录下的 `sitemap.json` 文件用于配置小程序及其页面是否允许被支付宝索引,文件内容为一个 JSON 对象,小程序服务收录开关打开时,如果没有 `sitemap.json` 则默认为所有页面都允许被索引。
+小程序根目录下的 `sitemap.json` 文件用于配置小程序及其页面是否允许被支付宝索引。文件内容为一个 JSON 对象,当小程序服务收录开关打开,如果没有 `sitemap.json`,则默认为所有页面都允许被索引。
## 配置原则
-- 配置之间如有冲突,视作不被索引。冲突示例见下文 **配置示例**。
-- 匹配页面后面的参数不影响索引结果,示例:`path/to/page?a =1` 等于 `path/to/page`。
+- 配置之间如果有冲突,则视作不被索引。以下文**配置示例**为参考。
+- 匹配到的页面后续参数不影响索引结果,例如 `path/to/page?a=1` 等于 `path/to/page`。
- `*` 代表所有页面。
## 配置示例
-以下分别为不同情况下 `sitemap.json` 的配置,请根据需要进行配置。
+根据不同需求,以下为 `sitemap.json` 的配置示例,请选择适合的配置方式。
-| **索引** | **配置示例** |
-| --- | --- |
-| - action 不配置默认允许被索引。
- path/to/page:被索引。
- path/to/page?a=1 :被索引。
- 其他页面都不会被索引。
| `{"rules":[{ "page": "path/to/page" }] }` |
-| - path/to/page :不被索引。
- 其他页面被索引。
| `{ "rules":[{ "action": "disallow", "page": "path/to/page" }] }` |
-| 所有页面都被索引。 | `{ "rules":[{ "page": "*" }] }` |
-| 所有页面都不被索引。 | `{ "rules":[{ "action": "disallow", "page": "*" }] }` |
-| - path/to/page:因为冲突不被索引。
- 其他页面因为冲突也不会被索引。
| `{ "rules":[{ "action": "allow", "page": "path/to/page" }, { "action": "disallow", "page": "path/to/page" }] }` |
-| - path/to/page:被索引。
- path/to/page2:不被索引。
- 其他页面因为冲突不会被索引。
| `{ "rules":[{ "action": "allow", "page": "path/to/page" }, { "action": "disallow", "page": "path/to/page2" }] }` |
+| 索引情况 | 配置示例 |
+| -------- | -------- |
+| 全部页面默认允许被索引,特别指定 `path/to/page` 允许被索引,包括带参数。 | `{ "rules": [{ "page": "path/to/page" }] }` |
+| 除了特别指定的 `path/to/page` 不被索引,其他页面全部允许被索引。 | `{ "rules": [{ "action": "disallow", "page": "path/to/page" }] }` |
+| 所有页面都允许被索引。 | `{ "rules": [{ "page": "*" }] }` |
+| 所有页面都不允许被索引。 | `{ "rules": [{ "action": "disallow", "page": "*" }] }` |
+| 由于配置冲突,`path/to/page` 不被索引,其他页面也因冲突不被索引。 | `{ "rules": [{ "action": "allow", "page": "path/to/page" }, { "action": "disallow", "page": "path/to/page" }] }` |
+| `path/to/page` 允许被索引,`path/to/page2` 不允许,其他页面因冲突不被索引。 | `{ "rules": [{ "action": "allow", "page": "path/to/page" }, { "action": "disallow", "page": "path/to/page2" }] }` |
## 属性
-| **属性** | **类型** | **必填** | **描述** |
-| --- | --- | --- | --- |
-| rules | Object[] | 是 | 索引规则列表。 |
-| action | String | 否 | 命中该规则的页面是否能被索引。
**默认值**:disallow。
**可选值**:disallow、allow。 |
-| page | String | 是 | 页面路径。
**说明**:`*` 表示所有页面,不能作为通配符使用。 |
-
+| 属性 | 类型 | 是否必填 | 描述 |
+| ------ | -------- | -------- | --------------------------------------- |
+| rules | Object[] | 是 | 索引规则列表。 |
+| action | String | 否 | 命中规则页面是否能被索引,默认值`allow`。可选值:`disallow`、`allow`。 |
+| page | String | 是 | 页面路径。`*` 代表所有页面,不可作为通配符使用。 |
# IDE 调试
## 使用限制
- IDE 版本 1.16 及以上。
-- sitemap 的索引提示是默认开启的,如需要关闭 sitemap 的索引提示,可在小程序项目配置文件 mini.project.json 的 setting 中配置字段 checkSiteMap 为 false。
-- sitemap 文件内容最大为 5120 个 UTF8 字符。
+- sitemap 的索引提示默认开启。如需关闭 sitemap 的索引提示,请在小程序项目配置文件 `mini.project.json` 的 `setting` 中配置字段 `checkSiteMap` 为 `false`。
+- sitemap 文件内容最大限制为 5120 个 UTF8 字符。
## 使用步骤
-当在小程序项目中设置了 sitemap 的配置文件(默认为 sitemap.json)时,点击索引页面时便可在 IDE 控制台上显示当前页面是否被索引的调试信息。 
+当在小程序项目中设置了 sitemap 的配置文件(默认为 `sitemap.json`)时,点击索引页面后,IDE 控制台会显示当前页面是否被索引的调试信息。
+
+
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/getCurrentPages \346\226\271\346\263\225.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/getCurrentPages \346\226\271\346\263\225.md"
index cba0b821e..7ac6ea15c 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/getCurrentPages \346\226\271\346\263\225.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/getCurrentPages \346\226\271\346\263\225.md"
@@ -1,26 +1,25 @@
-`getCurrentPages()` 获取当前页面栈的实例,将页面栈的数据以数组的形式返回。第一个元素为首页,最后一个元素为当前页面。
+`getCurrentPages()` 获取当前页面栈的实例,并将页面栈的信息以数组方式返回。数组的第一个元素代表首页,最后一个元素代表当前页面。
-小程序以栈的形式维护当前的所有页面。路由切换与页面栈的关系如下:
+小程序通过页面栈的形式来维护当前所有页面。路由切换时,页面栈会有以下变化:
-| **路由方式** | **页面栈表现** |
-| ------------ | ----------------------------------- |
-| 初始化 | 新页面入栈。 |
-| 打开新页面 | 新页面入栈。 |
-| 页面重定向 | 当前页面出栈,新页面入栈。 |
-| 页面返回 | 当前页面出栈。 |
-| Tab 切换 | 页面全部出栈,只留下新的 Tab 页面。 |
+| 路由方式 | 页面栈表现 |
+| -------- | -------------------------------- |
+| 初始化 | 新页面入栈。 |
+| 打开新页面 | 新页面入栈。 |
+| 页面重定向 | 当前页面出栈,新页面入栈。 |
+| 页面返回 | 当前页面出栈。 |
+| Tab 切换 | 所有页面出栈,只留下新的 Tab 页面。 |
-**注意:** 不要尝试修改页面栈,会导致路由以及页面状态错误。
+**注意:** 不要试图修改页面栈,否则可能导致路由和页面状态出现问题。
# 入参
-| **属性** | **类型** | **描述** |
-| --- | --- | --- |
-| getAllPages | Boolean | 获取到当前页面栈的所有实例。
如果是在宿主内调用,获取到的插件页面实例只是一个代理,只能获取到基本的 `route` 信息,无法调用页面内的方法,反之亦然。
**默认值**:false。
**版本要求**:基础库 [2.7.7](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 及以上。 |
-
+| 属性 | 类型 | 描述 |
+| ------------ | ------- | ------------------------------------------------------------ |
+| getAllPages | Boolean | 是否获取当前页面栈的所有实例。
如果是在宿主内调用,获取插件页面实例时只能得到 `route` 等基础信息,不可调用页面内方法,插件内调用亦是如此。
**默认值**:`false`。
**版本要求**:基础库 [2.7.7](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 及以上版本可用。 |
# 示例代码
-可以用于检测当前页面栈是否具有 5 层页面深度:
+你可以使用下面的示例代码来检测当前页面栈是否具有 5 层页面深度:
```javascript
if (getCurrentPages().length === 5) {
@@ -34,43 +33,42 @@ if (getCurrentPages().length === 5) {
}
```
-假设当前页面栈:宿主小程序 A,插件 B,宿主小程序 C。默认地,宿主小程序和插件之间无法访问到各自的页面:
+假定当前页面栈的情况是:宿主小程序 A,插件 B,宿主小程序 C。默认情况下,宿主小程序和插件之间不能相互访问对方的页面:
```json
// 宿主小程序内调用
-// 返回结果: [宿主A,null,宿主C]
+// 返回结果:[宿主 A,null,宿主 C]
getCurrentPages()[1] === null; // true
// 插件内调用
-// 返回结果: [null,插件B,null]
+// 返回结果:[null,插件 B,null]
getCurrentPages()[0] === null; // true
```
-通过指定 `getAllPages`,可以获得代理实例,取得 `route` 信息:
+通过指定 `getAllPages` 参数,你可以获取代理实例并获取 `route` 信息:
```javascript
// 宿主小程序内调用
-// 返回结果: [宿主A,插件B_Proxy,宿主C]
+// 返回结果:[宿主 A,插件 B_Proxy,宿主 C]
getCurrentPages({
getAllPages: true,
-})[1].route; // 插件B页面的路径
+})[1].route; // 插件 B 页面的路径
// 插件内调用
-// 返回结果: [宿主A_Proxy,插件B,宿主C_Proxy]
+// 返回结果:[宿主 A_Proxy,插件 B,宿主 C_Proxy]
getCurrentPages({
getAllPages: true,
-})[0].route; // 宿主小程序A页面的路径
+})[0].route; // 宿主小程序 A 页面的路径
```
-
# 常见问题
-## Q:getCurrentPages 方法如何获取页面路径?
+## Q:`getCurrentPages` 方法如何获取页面路径?
-A:`getCurrentPages()[N].route`,可以获取到页面路径(N 为页面数组栈中页面对象所在序号,最大值为当前页)。
+A:通过 `getCurrentPages()[N].route` 可以获取到页面路径(`N` 为页面数组栈中页面对象所在序号,最大值为当前页)。
-## Q:getCurrentPages 方法可以获取到参数吗?
+## Q:`getCurrentPages` 方法可以获取到参数吗?
-A:不可以,只能获取页面栈,无法获取参数。
+A:不可以,它只能获取页面栈,无法获取参数。
# 相关文档
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242\344\273\213\347\273\215.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242\344\273\213\347\273\215.md"
index 014206102..ea06952c0 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242\344\273\213\347\273\215.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242\344\273\213\347\273\215.md"
@@ -1,66 +1,67 @@
-**Page** 代表应用的一个页面,负责页面展示和交互。每个页面对应一个子目录,一般有多少个页面,就有多少个子目录。它也是一个构造函数,用来生成页面实例。每个小程序页面一般包含四个文件。
+**Page** 代表应用的一个页面,负责页面展示和交互。每个页面对应一个子目录,一般有多少个页面,就有多少个子目录。它也是一个构造函数,用来生成页面实例。每个小程序页面一般包含四个文件:
-- [pageName].js:页面逻辑。
-- [pageName].axml:页面结构。
-- [pageName].json:页面配置。
-- [pageName].acss:页面样式(可选)。
+- `[pageName].js`:页面逻辑。
+- `[pageName].axml`:页面结构。
+- `[pageName].json`:页面配置。
+- `[pageName].acss`:页面样式(可选)。
-页面初始化时,提供数据。
+页面初始化时,提供数据:
```javascript
Page({
data: {
title: 'Alipay',
- array: [{ user: 'li' }, { user: 'zhao' }],
- },
+ array: [{ user: 'li' }, { user: 'zhao' }]
+ }
});
```
-根据以上提供的数据,渲染页面内容。
+根据以上提供的数据,渲染页面内容:
```html
-{{title}} {{array[0].user}}
+{{title}}
+{{array[0].user}}
```
-定义交互行为时,需要指定响应函数。
+定义交互行为时,需要指定响应函数:
```html
click me
```
-以上代码指定用户点击按钮时,调用 handleTap 方法。
+以上代码指定用户点击按钮时,调用 `handleTap` 方法:
```javascript
Page({
handleTap() {
console.log('yo! view tap!');
- },
+ }
});
```
-页面重新渲染,需要在页面脚本里面调用 this.setData 方法。
+页面重新渲染,需要在页面脚本里面调用 `this.setData` 方法:
```html
-{{text}}
+{{text}}
+
```
-以上代码指定用户点击按钮时,调用 changeText 方法。
+以上代码指定用户点击按钮时,调用 `changeText` 方法:
```javascript
Page({
data: {
- text: 'init data',
+ text: 'init data'
},
changeText() {
this.setData({
- text: 'changed data',
+ text: 'changed data'
});
- },
+ }
});
```
-上面代码中,changeText 方法里面调用 this.setData 方法,会导致页面重新渲染。
-
+上面代码中,`changeText` 方法里面调用 `this.setData` 方法,会导致页面重新渲染。
# 相关文档
- [页面配置](https://opendocs.alipay.com/mini/framework/page-json)
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\345\270\270\350\247\201\351\227\256\351\242\230.md"
index d1bab6c22..0206f3202 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\345\270\270\350\247\201\351\227\256\351\242\230.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\345\270\270\350\247\201\351\227\256\351\242\230.md"
@@ -1,70 +1,67 @@
-小程序跳转相关问题,可查看 [小程序相互跳转 FAQ](https://opendocs.alipay.com/mini/0090ty)。
-
### Q:打开小程序白屏,如何处理?
-A:有多个原因会导致白屏的发生,请排查:
+A:有多个原因会导致白屏,请依次排查以下内容:
-1. 请检查手机是否正常使用。
-2. 请检查访问的是否是线上版本。
-3. 可能是启动缓存问题,建议在 **支付宝客户端 > 我的小程序 > 最近使用**,删除对应小程序,再打开小程序测试。
-4. 可能是兼容问题,建议升级支付宝客户端,再打开小程序测试。
-5. 如果按照以上方法排查后仍存在白屏的问题,请收集整理好问题,在文档页面右侧 **咨询** 中点击 **开始咨询** 寻求技术支持帮助。
+1. 检查手机是否正常使用。
+2. 确认所访问的小程序是线上版本。
+3. 若可能是启动缓存问题,可在**支付宝客户端 > 我的小程序 > 最近使用**中删除该小程序后重试。
+4. 如果怀疑为兼容性问题,请尝试升级支付宝客户端后再次打开小程序。
+5. 若按照以上方法处理后白屏问题仍旧存在,请收集并整理问题详情,并通过文档页面右侧**咨询**中的**开始咨询**寻求技术支持。
-### Q:onError 函数在程序运行异常时无法正常触发?
+### Q:onError 函数在程序运行异常时无法触发?
-A:建议把 onError 函数写在 app.js 中,以真机测试效果为准。
+A:建议将 onError 函数定义在 app.js 中,并以真机测试结果为准。
### Q:小程序 onShareAppMessage 函数如何分享 https 链接?
-A:将 https 链接编码后,放在 path 的 query 参数里传递。
+A:可将 https 链接进行编码,然后将其作为 path 的 query 参数进行传递。
-### Q:进入小程序提示系统错误,如何解决?
+### Q:进入小程序时提示系统错误,该如何解决?
-A:js 异常会导致报错,建议检查相关配置,如请求涉及的 URL 是否都已添加在白名单。
+A:JavaScript 异常可能导致报错。请检查相关配置,例如涉及的请求 URL 是否已添加到白名单中。
### Q:小程序如何使用 cookie?
-A:小程序中不建议使用 cookie,小程序针对服务端回设的 cookie 不会禁用掉,会设置到小程序进程中,下次小程序进行请求,会自动将已有的 cookie 带入到服务端请求中。前端获取不到 cookie,也不会对 cookie 做任何操作。小程序建议使用 [缓存](https://opendocs.alipay.com/mini/framework/operating-mechanism#%E7%BC%93%E5%AD%98)。
-
-### Q:小程序可以监听右上角的关闭按钮吗?点击右上角关闭按钮会执行什么函数呢?点击关闭按钮为什么没触发 onHide()?
+A:虽然不推荐在小程序中使用 cookie,但对服务端回设的 cookie 小程序并不会将其禁用。这些 cookie 会被设置到小程序进程中,在小程序发起后续请求时,这些 cookie 将自动附加到服务端请求中。由于前端无法获取 cookie 且不会对其进行任何操作,因此建议使用[缓存](https://opendocs.alipay.com/mini/framework/operating-mechanism#%E7%BC%93%E5%AD%98)作为替代方案。
-A:不可以监听关闭按钮,点击关闭按钮,不会执行函数。
+### Q:小程序可否监听右上角的关闭按钮?点击关闭按钮会触发什么函数?为何点击关闭按钮没有触发 onHide()?
-### Q:setData 了,小程序页面数据为什么没刷新?
+A:无法监听到关闭按钮的点击事件。点击关闭按钮时不会触发任何函数。
-A:请检查是否有 `this` 对象值,或者代码执行逻辑是否有问题。
+### Q:为什么在 setData 之后,小程序页面数据没有刷新?
-### Q:跳转页面为空页面,如何解决?
+A:请仔细检查该 this 对象是否有正确的值,以及代码执行逻辑是否存在问题。
-A:请排查是否未添加域名白名单导致的服务请求失败未加载到数据,导致页面没有数据。
+### Q:跳转页面出现空白,该怎么解决?
+A:请检查是否因未将服务请求的域名添加到白名单中,导致请求失败未能加载数据,进而使页面无任何数据显示。
### Q:生活号跳转到小程序,小程序如何接收到传递的参数?
-A:需要在小程序 app.js 文件`app()` 里的 `onLaunch(options)` 使用 `options.query` 获取。
+A:需要在小程序 `app.js` 文件中的 `app()` 里的 `onLaunch(options)` 使用 `options.query` 获取。
-### Q:扫描小程序码 A 后再扫描小程序码 B,为什么在 onLaunch 获取不到码 B 携带的参数?
+### Q:扫描小程序码 A 后再扫描小程序码 B,为什么在 `onLaunch` 获取不到码 B 携带的参数?
A:在 `onShow()` 函数中获取。
-### Q:第一次扫码进入小程序,切入后台。第二次扫码进入后,为什么在 onLaunch 函数中获取不到参数?
+### Q:第一次扫码进入小程序,切入后台。第二次扫码进入后,为什么在 `onLaunch` 函数中获取不到参数?
A:建议在 `onLaunch()` 和 `onShow()` 函数中都尝试获取参数。
### Q:小程序如何获取跳转链接中附带的参数?
-A:使用小程序生命周期 `onLaunch()` 监听小程序初始化,监听器中获取 query 值。
+A:使用小程序生命周期 `onLaunch()` 监听小程序初始化,监听器中获取 `query` 值。
### Q:在小程序页面中如何引入 js?
A:使用 `import {Ajax} from '/util'` 或者 `import {Ajax} from './util'` 方式可以引入 js。
-### Q:onShow 中可以调用授权函数吗?
+### Q:`onShow` 中可以调用授权函数吗?
-A:支付宝小程序中禁止小程序首屏引导用户授权。不建议将用户授权放在生命周期中执行。
+A:支付宝小程序中禁止小程序首屏引导用户授权。不建议将用户授权放在生命周期函数中执行。
### Q:如何去掉小程序框架自带的 log?
-A:在 app.js 中的 `onLaunch()`、`onShow()` 及页面的 js 文件中 onLoad 等小程序初始和页面初始化方法中去掉日志打印的代码。
+A:在 `app.js` 中的 `onLaunch()`、`onShow()` 及页面的 js 文件中 `onLoad` 等小程序初始化和页面初始化方法中去除日志打印的代码。
### Q:如何让一个功能不用点击就会自动触发?
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\346\240\267\345\274\217.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\346\240\267\345\274\217.md"
index c6d3065e7..862938a6a 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\346\240\267\345\274\217.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\346\240\267\345\274\217.md"
@@ -1,6 +1,6 @@
-在 `/pages` 目录中的 .acss 文件用于定义页面样式。
+在 `/pages` 目录中的 `.acss` 文件用于定义页面样式。
-每个页面中的根元素为 `page`,需要设置页面高度或背景色时,可按如下方式:
+每个页面中的根元素为 `page`,需要设置页面高度或背景色时,可按如下方式:
```css
page {
@@ -10,7 +10,7 @@ page {
# 页面样式隔离
-默认情况下,页面的样式将对外产生影响。从基础库版本 [2.7.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始,可以在页面的 .json 文件中配置 `styleIsolation`,避免页面的样式影响到外部。例如:
+默认情况下,页面的样式将对外产生影响。从基础库版本 [2.7.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始,可以在页面的 `.json` 文件中配置 `styleIsolation`,避免页面的样式影响到外部。例如:
```json
{
@@ -20,7 +20,7 @@ page {
该选项支持以下取值:
-- `apply-shared` 表示 app.acss 样式以及其他(设置了 `shared` 的其他页面和自定义组件)的样式将影响到当前页面,但当前页面 acss 中指定的样式不会影响外部。
-- `shared`(默认)表示 app.acss 样式以及其他(设置了 `shared` 的其他页面和自定义组件)的样式将影响到当前页面,当前页面 acss 中指定的样式也会影响到外部。
+- `apply-shared` 表示 `app.acss` 样式以及其他(设置了 `shared` 的其他页面和自定义组件)的样式将影响到当前页面,但当前页面 `.acss` 中指定的样式不会影响外部。
+- `shared`(默认值)表示 `app.acss` 样式以及其他(设置了 `shared` 的其他页面和自定义组件)的样式将影响到当前页面,当前页面 `.acss` 中指定的样式也会影响到外部。
-有关 **acss** 更详细的文档请参见 [ACSS 语法参考](https://opendocs.alipay.com/mini/framework/acss) 。
+有关 **ACSS** 更详细的文档请参见 [ACSS 语法参考](https://opendocs.alipay.com/mini/framework/acss)。
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\347\273\223\346\236\204.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\347\273\223\346\236\204.md"
index 678a6f39d..53cb05dc6 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\347\273\223\346\236\204.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\347\273\223\346\236\204.md"
@@ -1 +1 @@
-在 `/pages` 目录中的 .axml 文件用于定义当前这个页面的结构,文件内容遵循 AXML 语法。 AXML 和 HTML 非常相似,但是也有很多不一样的地方,更详细的文档可查看 [AXML](https://opendocs.alipay.com/mini/framework/axml)。
+在 `/pages` 目录中的 .axml 文件用于定义当前这个页面的结构,文件内容遵循 AXML 语法。AXML 与 HTML 非常相似,但也有很多不同之处。更详细的文档可以查看 [AXML](https://opendocs.alipay.com/mini/framework/axml)。
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\350\277\220\350\241\214\346\234\272\345\210\266.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\350\277\220\350\241\214\346\234\272\345\210\266.md"
index 6dffa5915..3b55fc81c 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\350\277\220\350\241\214\346\234\272\345\210\266.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\350\277\220\350\241\214\346\234\272\345\210\266.md"
@@ -1,6 +1,6 @@
-# Page(object: Object)
+# Page(object:Object)
-在 `/pages` 目录的 .js 文件中,定义 `Page()`,用于注册一个小程序页面,接收一个 object 作为属性,用来指定页面的初始数据、生命周期回调、事件处理等。
+在 `/pages` 目录的 .js 文件中,定义 `Page()` 用于注册一个小程序页面,接收一个 object 作为属性来指定页面的初始数据、生命周期回调、事件处理等。
以下为一个基本的页面代码:
@@ -8,7 +8,7 @@
// pages/index/index.js
Page({
data: {
- title: 'Alipay',
+ title: 'Alipay'
},
onLoad(query) {
// 页面加载
@@ -41,12 +41,12 @@ Page({
events: {
onBack() {
console.log('onBack');
- },
+ }
},
// 自定义事件处理函数
viewTap() {
this.setData({
- text: 'Set data for update.',
+ text: 'Set data for update.'
});
},
// 自定义事件处理函数
@@ -56,49 +56,47 @@ Page({
},
// 自定义数据对象
customData: {
- name: 'alipay',
- },
+ name: 'alipay'
+ }
});
```
-
# 页面生命周期
-对于一个 page 实例来说,生命周期包含 onLoad、onShow、onReady、onHide、onUnload。分别在页面的启动过程的不同阶段,以及后续操作响应时触发,具体可以查看页面状态流转。
+对于一个页面(page)实例来说,生命周期包含以下几个阶段:`onLoad`、`onShow`、`onReady`、`onHide` 和 `onUnload`。它们分别在页面的启动过程的不同阶段以及后续操作响应时触发。具体流程和状态的变化可以参考页面状态流转的描述。
## 页面状态流转
-
+
-- New:新创建的页面实例,未进行业务启动初始化。
-- Inited:已完成业务启动过程 onLoad/onShow 初始化,已收集得到首屏需要的 data 数据,准备进行渲染。
-- Readied:已完成首屏渲染。
-- Hidden:监听到 **离开页面的行为** 而触发 onHide 进入离开状态。
-- Unloaded:监听到 **销毁页面的行为** 而触发 onUnload 进入已销毁状态(该状态下所有 setData 操作无效)。
+- `New`:新创建的页面实例,未进行业务启动初始化。
+- `Inited`:已完成业务启动过程;`onLoad`、`onShow` 初始化,已收集得到首屏所需的 data 数据,准备开始渲染。
+- `Readied`:已完成首屏渲染工作。
+- `Hidden`:监听到离开页面的行为,而触发 `onHide` 进入离开状态。
+- `Unloaded`:监听到销毁页面的行为,而触发 `onUnload`,进入已销毁状态(该状态下所有 `setData` 操作无效)。
-**说明:** onLoad、onReady、onUnload 只会被执行一次,而 onHide、onShow 则会执行多次。
+**说明:** `onLoad`、`onReady`、`onUnload` 只会被执行一次,而 `onHide`、`onShow` 会被执行多次。
# object 属性说明
-| **属性** | **类型** | **描述** | **最低版本** |
-| --- | --- | --- | --- |
-| data | Object/Function | 初始数据或返回初始化数据的函数。 | - |
-| observers | Object | 数据变化观测器,用于监听 data 的变化,可查看 [数据变化观测器](https://opendocs.alipay.com/mini/04y1n6)。 | [2.8.1](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| events | Object | 事件处理函数对象。 | [1.13.7](https://opendocs.alipay.com/mini/framework/lib) |
-| onLoad | Function(query: Object) | 页面加载时触发。 | - |
-| onShow | Function | 页面显示时触发。 | - |
-| onReady | Function | 页面初次渲染完成时触发。 | - |
-| onHide | Function | 页面隐藏时触发。 | - |
-| onUnload | Function | 页面卸载时触发。 | - |
-| onShareAppMessage | Function(options: Object) | 点击右上角分享时触发。 | - |
-| onTitleClick | Function | 点击标题触发。 | - |
-| onOptionMenuClick | Function | 点击导航栏额外图标触发。 | [1.3.0](https://opendocs.alipay.com/mini/framework/lib) |
-| onPullDownRefresh | Function({from: `manual`/`code`}) | 页面下拉时触发。 | - |
-| onTabItemTap | Function | 点击 `tabItem` 时触发。 | [1.11.0](https://opendocs.alipay.com/mini/framework/lib) |
-| onPageScroll | Function({scrollHeight,scrollTop}) | 页面滚动时触发。 | - |
-| onReachBottom | Function | 上拉触底时触发。 | - |
-| options | Object | 一些选项(介绍相关功能时会涉及到具体的配置项,这里暂不列举)。 | [2.8.1](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| 其它 | Any | 可以添加任意的函数或属性到 `object` 中,在页面的函数中可以用 `this` 来访问。 | - |
-
+| 属性 | 类型 | 描述 | 最低版本 |
+|-------------------|----------------|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------|
+| data | Object/Function | 初始数据,或返回初始化数据的函数。 | - |
+| observers | Object | 数据变化观测器,用于监听 `data` 的变化,详情参见[数据变化观测器](https://opendocs.alipay.com/mini/04y1n6)。 | [2.8.1](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| events | Object | 事件处理函数对象。 | [1.13.7](https://opendocs.alipay.com/mini/framework/lib) |
+| onLoad | Function | 页面加载时触发。 | - |
+| onShow | Function | 页面显示时触发。 | - |
+| onReady | Function | 页面初次渲染完成时触发。 | - |
+| onHide | Function | 页面隐藏时触发。 | - |
+| onUnload | Function | 页面卸载时触发。 | - |
+| onShareAppMessage | Function | 点击右上角分享时触发。 | - |
+| onTitleClick | Function | 点击标题触发。 | - |
+| onOptionMenuClick | Function | 点击导航栏额外图标触发。 | [1.3.0](https://opendocs.alipay.com/mini/framework/lib) |
+| onPullDownRefresh | Function | 页面下拉时触发。 | - |
+| onTabItemTap | Function | 点击 `tabItem` 时触发。 | [1.11.0](https://opendocs.alipay.com/mini/framework/lib) |
+| onPageScroll | Function | 页面滚动时触发。 | - |
+| onReachBottom | Function | 上拉触底时触发。 | - |
+| options | Object | 页面相关选项,具体配置项会在相关功能介绍时提及。 | [2.8.1](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| 其它 | Any | 可以添加任意函数或属性到 `object` 中,页面的函数中可以用 `this` 访问。 | - |
# 页面数据对象 data
通过设置 `data` 指定页面的初始数据。
@@ -120,22 +118,21 @@ Page({
});
```
-> 在这种使用方式下,对 `data` 的原地修改会被保留下来,当页面推出再次进入该页面时,`data` 是被修改后的值。
-
+> 在这种使用方式下,对 `data` 的原地修改会被保留,当页面退出再次进入该页面时,`data` 是修改后的值。
## 函数类型
```javascript
Page({
data() {
return {
- arr: [],
+ arr: []
};
},
doIt() {
this.setData({
- arr: [1, 2, 3],
+ arr: [1, 2, 3]
});
- },
+ }
});
```
@@ -144,26 +141,25 @@ Page({
```javascript
Page({
data: {
- arr: [],
+ arr: []
},
doIt() {
this.data.arr.push(1); // 不要这么写!
this.setData({
- arr: this.data.arr,
+ arr: this.data.arr
});
- },
+ }
});
```
-
# 生命周期函数
## onLoad(query: Object)
-页面初始化时触发。一个页面只会调用一次。 query 来源于 [my.navigateTo](https://opendocs.alipay.com/mini/api/zwi8gx) 和 [my.redirectTo](https://opendocs.alipay.com/mini/api/fh18ky) 等接口 URL 字段的参数部份(例如:path?`key1=value1&key2=value2`)。基础库会将该部份字符串内容解析为 Object,解析规则可查看 [小程序全局 / 页面参数设置以及解析细节](https://opendocs.alipay.com/mini/03durs)。
+页面初始化时触发。一个页面只会调用一次。`query` 来源于 [`my.navigateTo`](https://opendocs.alipay.com/mini/api/zwi8gx) 和 [`my.redirectTo`](https://opendocs.alipay.com/mini/api/fh18ky) 等接口 URL 字段的参数部分(例如:`path?key1=value1&key2=value2`)。基础库会将该部分字符串内容解析为 `Object`,解析规则可查看[小程序全局/页面参数设置以及解析细节](https://opendocs.alipay.com/mini/03durs)。
-| **属性** | **类型** | **描述** |
-| -------- | -------- | -------------------------- |
-| query | Object | 打开当前页面路径中的参数。 |
+| 属性 | 类型 | 描述 |
+| ----- | ------ | ------------------------ |
+| query | Object | 打开当前页面路径中的参数 |
## onShow()
@@ -171,16 +167,15 @@ Page({
## onReady()
-页面初次渲染完成时触发。 一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。 对界面的设置,如 `my.setNavigationBar` 请在 `onReady` 之后设置。
+页面初次渲染完成时触发。一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。对界面的设置,比如 `my.setNavigationBar`,请在 `onReady` 之后设置。
## onHide()
-页面隐藏/切入后台时触发。 如 `my.navigateTo` 到其它页面或底部 tab 切换等。
+页面隐藏/切入后台时触发。比如通过 `my.navigateTo` 到其他页面或底部 tab 切换等。
## onUnload()
-页面卸载时触发。 如 `my.redirectTo` 或 `my.navigateBack` 到其它页面等。
-
+页面卸载时触发。比如通过 `my.redirectTo` 或 `my.navigateBack` 到其他页面等。
# 页面事件处理函数
## onShareAppMessage(options: Object)
@@ -189,16 +184,16 @@ Page({
开发者可通过传入参数自定义小程序分享内容(例如:标题、描述、图片),用户通过点击或者复制分享的内容可以快速打开小程序,进入指定页面。目前支持的分享渠道有:支付宝朋友动态、支付宝好友、钉钉、新浪微博、微信、QQ。
-- 每个 Page 页面的右上角菜单中默认有 **分享** 按钮;`onShareAppMessage` 函数只自定义分享的内容,不影响分享功能。
-- 用户点击分享按钮的时候会调用。
-- 此事件需要返回一个对象(Object)类型,用于自定义分享内容。
-- 分享图片中的二维码的有效期为 60 天,若需要长期有效的二维码,请登录 [开放平台控制台](https://open.alipay.com/dev/workspace) > **我的应用** > 进入小程序应用详情页 > **小程序码** 中生成。
-- 小程序在 1.1.0+ 版本中开始支持 open-type 为 share 的按钮触发分享。
-- 从基础库 [1.24.13](https://opendocs.alipay.com/mini/framework/compatibility)、[2.6.7](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 版本开始支持 `async` 写法,可通过 `my.canIUse('page.onShareAppMessage.async')` 检测是否支持。
+- 每个 Page 页面的右上角菜单中默认有 **分享** 按钮;`onShareAppMessage` 函数只是自定义分享的内容,不影响分享功能。
+- 用户点击分享按钮时会调用此函数。
+- 此事件需要返回一个对象(Object)类型,以自定义分享内容。
+- 分享图片中的二维码的有效期为 60 天。若需要长期有效的二维码,请登录 [开放平台控制台](https://open.alipay.com/dev/workspace) > **我的应用** > 进入小程序应用详情页 > **小程序码** 中进行生成。
+- 小程序在 1.1.0+ 版本中开始支持 `open-type` 为 `share` 的按钮触发分享。
+- 从基础库 [1.24.13](https://opendocs.alipay.com/mini/framework/compatibility)、[2.6.7](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 版本开始支持 `async` 写法。可通过 `my.canIUse('page.onShareAppMessage.async')` 检测是否支持。
### 应用场景
-用户点击右上角的选项按钮可以分享小程序,用户点击分享后出现若干分享的选项。
+用户点击右上角的选项按钮可以分享小程序。用户点击分享后,出现若干分享选项。

@@ -215,14 +210,13 @@ Page({
按钮触发分享方式效果:

-
### 示例代码
右上角触发分享示例代码:
```html
- 点击右上角开始自定义分享
+ 点击右上角开始自定义分享
```
@@ -232,23 +226,24 @@ Page({
onShareAppMessage() {
return {
title: '分享 View 组件',
- desc: 'View 组件很通用',
+ description: 'View 组件很通用',
path: 'page/component/view/view',
- };
- },
-});
+ }
+ }
+})
+
// 从基础库 1.24.13、2.6.7 版本开始支持 async 写法
Page({
onShareAppMessage() {
return new Promise((resolve, reject) => {
resolve({
title: 'async',
- desc: 'View 组件很通用',
- path: 'page/component/view/view',
- });
- });
- },
-});
+ description: 'View 组件很通用',
+ path: 'page/component/view/view'
+ })
+ })
+ }
+})
```
按钮触发分享方式示例代码:
@@ -269,7 +264,7 @@ Page({
setShareButtonSwitch() {
this.setData({
canIUseShareButton: my.canIUse('button.open-type.share'),
- });
+ })
},
onLoad() {
this.setShareButtonSwitch();
@@ -277,20 +272,19 @@ Page({
onShareAppMessage() {
return {
title: '小程序示例',
- desc: '小程序官方示例Demo,展示已支持的接口能力及组件。',
+ description: '小程序官方示例Demo,展示已支持的接口能力及组件。',
path: 'page/component/component-pages/view/view?param=123',
- };
- },
-});
+ }
+ }
+})
```
-
#### 入参
入参是 `Object` 类型,参数如下:
-| **参数** | **类型** | **描述** | **最低版本** |
-| --- | --- | --- | --- |
-| from | String | 触发来源。
- button:页面分享按钮触发。
- menu:右上角分享按钮触。
- code:执行 [my.showSharePanel](https://opendocs.alipay.com/mini/api/omg2ye) 触发。
| [1.10.0](https://opendocs.alipay.com/mini/framework/lib) |
+| 参数 | 类型 | 描述 | 最低版本 |
+| ---- | ------ | ---- | -------- |
+| from | String | 触发来源。- button:页面分享按钮触发。
- menu:右上角分享按钮触发。
- code:执行 [my.showSharePanel](https://opendocs.alipay.com/mini/api/omg2ye) 触发。
| [1.10.0](https://opendocs.alipay.com/mini/framework/lib) |
| target | Object | 如果 from 值为 button,则 target 为触发这次分享的 button,否则为 undefined。 | **1.10.0** |
| webViewUrl | String | 页面中包含 web-view 组件时,返回当前 web-view 的 URL。 | [1.6.0](https://opendocs.alipay.com/mini/framework/lib) |
@@ -298,25 +292,25 @@ Page({
`onShareAppMessage` 执行后必须返回一个分享对象,用于自定义分享内容。
-| **属性** | **类型** | **必填** | **描述** | **最低版本** |
-| --- | --- | --- | --- | --- |
-| title | String | 是 | 自定义分享标题。 | - |
-| desc | String | 否 | 自定义分享描述:由于分享到微博只支持最大长度 140 个字,因此建议长度不要超过该限制。 | - |
-| path | String | 是 | 自定义分享页面的路径,path 中的自定义参数可在小程序生命周期的 onLoad 方法中获取(参数传递遵循 http get 的传参规则)。 | - |
-| content | String | 否 | 自定义吱口令文案,最多 28 个字符。 | [1.7.0](https://opendocs.alipay.com/mini/framework/lib) |
-| imageUrl | String | 否 | 自定义分享小图 icon 元素,支持:网络图片路径;apFilePath 路径;相对路径。不支持:base64。 | [1.4.0](https://opendocs.alipay.com/mini/framework/lib) |
-| bgImgUrl | String | 否 | 自定义分享预览大图,建议尺寸 750x825,支持:网络图片路径;apFilePath 路径(客户端 10.1.58 版本开始支持);相对路径(客户端 10.1.58 版本开始支持)。不支持:base64。 | [1.9.0](https://opendocs.alipay.com/mini/framework/lib) |
-| scImgUrl | String | 否 | 自定义社交图片链接,作为分享到支付宝好友时的主体图片。建议尺寸 376x330。
客户端 10.2.50 开始支持。
可通过 `my.canIUse('page.onShareAppMessage.return.scImgUrl')` 进行检测。
支持:网络图片路径;不支持:base64、apFilePath。 | [2.7.13](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| searchTip | String | 否 | 生成分享截图的搜索引导,设置该参数后,会在分享图片中增加上支付宝搜“设置关键字”的内容,设置关键字不能超过 5 个字。 | - |
-| success | Function | 否 | 分享成功后回调。 | **1.4.0** |
-| fail | Function | 否 | 分享失败后回调。 | **1.4.0** |
+| 属性 | 类型 | 必填 | 描述 | 最低版本 |
+| -------- | ------ | ---- | ---- | -------- |
+| title | String | 是 | 自定义分享标题。 | - |
+| desc | String | 否 | 自定义分享描述:由于分享到微博只支持最大长度 140 个字,因此建议长度不要超过该限制。 | - |
+| path | String | 是 | 自定义分享页面的路径,path 中的自定义参数可在小程序生命周期的 onLoad 方法中获取(参数传递遵循 http get 的传参规则)。 | - |
+| content | String | 否 | 自定义吱口令文案,最多 28 个字符。 | [1.7.0](https://opendocs.alipay.com/mini/framework/lib) |
+| imageUrl | String | 否 | 自定义分享小图 icon 元素,支持:网络图片路径;apFilePath 路径;相对路径。不支持:base64。 | [1.4.0](https://opendocs.alipay.com/mini/framework/lib) |
+| bgImgUrl | String | 否 | 自定义分享预览大图,建议尺寸 750x825,支持:网络图片路径;apFilePath 路径(客户端 10.1.58 版本开始支持);相对路径(客户端 10.1.58 版本开始支持)。不支持:base64。 | [1.9.0](https://opendocs.alipay.com/mini/framework/lib) |
+| scImgUrl | String | 否 | 自定义社交图片链接,作为分享到支付宝好友时的主体图片。建议尺寸 376x330。客户端 10.2.50 版本开始支持。可通过 `my.canIUse('page.onShareAppMessage.return.scImgUrl')` 进行检测。支持:网络图片路径;不支持:base64、apFilePath。 | [2.7.13](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| searchTip | String | 否 | 生成分享截图的搜索引导,设置该参数后,会在分享图片中增加上支付宝搜“设置关键字”的内容,设置关键字不能超过 5 个字。 | - |
+| success | Function | 否 | 分享成功后回调。 | **1.4.0** |
+| fail | Function | 否 | 分享失败后回调。 | **1.4.0** |
**success 回调函数**
-| **属性** | **类型** | **描述** |
-| ----------- | -------- | ------------------ |
-| channelName | String | 分享所选择的渠道。 |
-| shareResult | Boolean | 分享是否成功。 |
+| 属性 | 类型 | 描述 |
+| ----------- | ------ | ---------------- |
+| channelName | String | 分享所选择的渠道。 |
+| shareResult | Boolean| 分享是否成功。 |
## onTitleClick()
@@ -325,59 +319,59 @@ Page({
## onOptionMenuClick()
点击导航栏额外图标触发。
+## onPullDownRefresh({from: `manual` | `code`})
-## onPullDownRefresh({from: `manual`|`code`})
-
-下拉刷新时触发。需要先在 [app.json](https://opendocs.alipay.com/mini/framework/app-json#window) 的 `window` 选项中开启 `pullRefresh` 。当处理完数据刷新后,`my.stopPullDownRefresh` 可以停止当前页面的下拉刷新。
+下拉刷新事件触发时调用,需在 [`app.json`](https://opendocs.alipay.com/mini/framework/app-json#window) 的 `window` 选项中先开启 `pullRefresh` 功能。在完成数据刷新后,可调用 `my.stopPullDownRefresh` 来停止当前页面的下拉刷新动作。
-from 的值是 `code` 表示 startPullDownRefresh 触发的事件;值是 `manual` 表示用户下拉触发的下拉事件。
+`from` 的值若为 `code`,表示此次刷新事件是通过 `startPullDownRefresh` 函数触发;若为 `manual`,则代表用户手动下拉触发的事件。
## onTabItemTap(object: Object)
-点击 `tabItem` 时触发。
+当用户点击 `tabItem` 标签项时触发。
-| **属性** | **类型** | **描述** |
-| -------- | -------- | ---------------------------------- |
-| from | String | 点击来源。 |
-| pagePath | String | 被点击 tabItem 的页面路径。 |
-| text | String | 被点击 tabItem 的按钮文字。 |
-| index | Number | 被点击 tabItem 的序号,从 0 开始。 |
+| 属性 | 类型 | 描述 |
+| -------- | ------ |------------------------------ |
+| from | String | 点击来源。 |
+| pagePath | String | 点击的 `tabItem` 对应的页面路径。 |
+| text | String | 点击的 `tabItem` 显示的文字。 |
+| index | Number | 点击的 `tabItem` 的序号,起始为 0。 |
## onPageScroll(object: Object)
-页面滚动时触发。
+页面滚动时的事件触发。
-| **属性** | **类型** | **描述** |
-| ------------ | -------- | -------------- |
-| scrollTop | Number | 页面滚动距离。 |
-| scrollHeight | Number | 页面内容高度。 |
+| 属性 | 类型 | 描述 |
+| ----------- | ------ |-------------- |
+| scrollTop | Number | 页面垂直滚动的像素距离。 |
+| scrollHeight| Number | 页面内容的总高度。 |
## onReachBottom()
-上拉触底时触发。 onReachBottom()是在上拉触底时才会触发,如果页面已经在页面底部继续上拉是不会再次触发。可以配合 [my.pageScrollTo](https://opendocs.alipay.com/mini/api/scroll) 向上滚动一点位置或者在底部增加数据等方式让页面不是处在底部位置达到可以连续上拉触发 onReachBottom()的效果。
+当用户上拉达到页面底部时触发。`onReachBottom()` 事件只在上拉触床时才会触发,如果页面已到底部再次上拉不会再次触发此事件。可以通过结合 [`my.pageScrollTo`](https://opendocs.alipay.com/mini/api/scroll) 函数向上滚动页面,或在底部添加更多数据,从而使页面不处于底部状态,达到连续触发 `onReachBottom()` 事件的效果。
+根据《优秀技术文档的写作标准》,文档修改后的内容如下:
## events
-为了使代码更加简洁,提供了新的事件处理对象 events。 已有的页面处理事件函数跟直接在 page 实例上暴露的事件函数等价。
+为了使代码更加简洁,提供了新的事件处理对象 `events`。已有的页面处理事件函数与直接在 Page 实例上暴露的事件函数等价。
**注意:**
-- `events` 从基础库 `1.13.7` 版本 开始支持。
+- `events` 从基础库 `1.13.7` 版本开始支持。
- 请正确区分页面事件函数与 `events` 内同名事件函数的基础库版本要求。
-以下是 events 支持的事件函数列表:
+以下是 `events` 支持的事件函数列表:
-| **事件** | **类型** | **描述** | **最低版本** |
-| --- | --- | --- | --- |
-| onBack | Function | 导航栏左侧返回按钮(以及 Android 系统返回键)被点击时触发 | [1.13.7](https://opendocs.alipay.com/mini/framework/lib) |
-| onKeyboardHeight | Function | 键盘高度变化时触发。 | [1.13.7](https://opendocs.alipay.com/mini/framework/lib) |
-| onOptionMenuClick | Function | 点击导航栏额外图标触发。 | [1.13.7](https://opendocs.alipay.com/mini/framework/lib) |
-| onPullDownRefresh | Function({from: `manual`/`code`}) | 页面下拉时触发。 | [1.13.7](https://opendocs.alipay.com/mini/framework/lib) |
-| onTitleClick | Function | 点击标题触发。 | [1.13.7](https://opendocs.alipay.com/mini/framework/lib) |
-| onTabItemTap | Function | 点击非当前 `tabItem` 后触发。 | [1.13.7](https://opendocs.alipay.com/mini/framework/lib) |
-| beforeTabItemTap | Function | 点击非当前 `tabItem` 前触发。 | [1.13.7](https://opendocs.alipay.com/mini/framework/lib) |
-| onResize | Function({size: {windowWidth: number, windowHeight: number}}) | window 尺寸改变时触发。 | [1.16.0](https://opendocs.alipay.com/mini/framework/lib) |
-| onSelectedTabItemTap | Function({pagePath, text,index}) | 点击当前 `tabItem` 后触发。 | [2.7.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| **事件** | **类型** | **描述** | **最低版本** |
+| ------------------ | ---------- | ------------------------------------------ | ---------------------------------------------- |
+| onBack | Function | 导航栏左侧返回按钮(以及 Android 系统返回键)被点击时触发 | [`1.13.7`](https://opendocs.alipay.com/mini/framework/lib) |
+| onKeyboardHeight | Function | 键盘高度变化时触发 | [`1.13.7`](https://opendocs.alipay.com/mini/framework/lib) |
+| onOptionMenuClick | Function | 点击导航栏额外图标触发 | [`1.13.7`](https://opendocs.alipay.com/mini/framework/lib) |
+| onPullDownRefresh | Function | 页面下拉时触发 | [`1.13.7`](https://opendocs.alipay.com/mini/framework/lib) |
+| onTitleClick | Function | 点击标题触发 | [`1.13.7`](https://opendocs.alipay.com/mini/framework/lib) |
+| onTabItemTap | Function | 点击非当前 `tabItem` 后触发 | [`1.13.7`](https://opendocs.alipay.com/mini/framework/lib) |
+| beforeTabItemTap | Function | 点击非当前 `tabItem` 前触发 | [`1.13.7`](https://opendocs.alipay.com/mini/framework/lib) |
+| onResize | Function | 窗口尺寸改变时触发 | [`1.16.0`](https://opendocs.alipay.com/mini/framework/lib) |
+| onSelectedTabItemTap | Function | 点击当前 `tabItem` 后触发 | [`2.7.2`](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
示例代码:
@@ -386,67 +380,67 @@ from 的值是 `code` 表示 startPullDownRefresh 触发的事件;值是 `manu
my.canIUse('page.events.onBack');
Page({
data: {
- text: 'This is page data.',
+ text: 'This is page data.'
},
onLoad() {
// 页面加载时触发
},
events: {
onBack() {
- // 导航栏左侧返回按钮(以及 Android 系统返回键)被点击时触发
+ // 导航栏左侧返回按钮和 Android 系统返回键被点击时触发
},
onKeyboardHeight(e) {
// 键盘高度变化时触发
console.log('键盘高度:', e.height);
},
onOptionMenuClick() {
- // 点击右上角菜单按钮触发
+ // 点击导航栏右上角菜单按钮触发
},
onPullDownRefresh(e) {
- // 页面下拉时触发。e.from的值是“code”表示startPullDownRefresh触发的事件;值是“manual”表示用户下拉触发的下拉事件
- console.log('触发下拉刷新的类型', e.from);
+ // 页面下拉时触发。e.from 的值为 “code” 表示 startPullDownRefresh 触发的事件;值为 “manual” 表示用户下拉触发的下拉事件
+ console.log('触发下拉刷新的类型:', e.from);
my.stopPullDownRefresh();
},
onTitleClick() {
// 点击标题触发
},
onTabItemTap(e) {
- // 点击非当前tabItem后触发
- // e.from是点击且切换tabItem后触发,值是“user”表示用户点击触发的事件;值是“api”表示switchTab触发的事件
- console.log('触发tab变化的类型', e.from);
- console.log('点击的tab对应页面的路径', e.pagePath);
- console.log('点击的tab的文字', e.text);
- console.log('点击的tab的索引', e.index);
+ // 点击非当前 tabItem 后触发
+ // e.from 是点击且切换 tabItem 后触发,值为 “user” 表示用户点击触发的事件;值为 “api” 表示 switchTab 触发的事件
+ console.log('触发 tab 变化的类型:', e.from);
+ console.log('点击的 tab 对应页面的路径:', e.pagePath);
+ console.log('点击的 tab 的文字:', e.text);
+ console.log('点击的 tab 的索引:', e.index);
},
beforeTabItemTap() {
- // 点击但切换tabItem前触发
+ // 点击但切换 tabItem 前触发
},
onSelectedTabItemTap(e) {
- // 点击当前tabItem后触发
- console.log('点击的tab对应页面的路径', e.pagePath);
- console.log('点击的tab的文字', e.text);
- console.log('点击的tab的索引', e.index);
+ // 点击当前 tabItem 后触发
+ console.log('点击的 tab 对应页面的路径:', e.pagePath);
+ console.log('点击的 tab 的文字:', e.text);
+ console.log('点击的 tab 的索引:', e.index);
},
onResize(e) {
- // window尺寸改变时触发
- var { windowWidth, windowHeight } = e.size;
- console.log('改变后window的宽度', windowWidth);
- console.log('改变后window的高度', windowHeight);
- },
- },
+ // 窗口尺寸改变时触发
+ var windowWidth = e.size.windowWidth;
+ var windowHeight = e.size.windowHeight;
+ console.log('改变后 window 的宽度:', windowWidth);
+ console.log('改变后 window 的高度:', windowHeight);
+ }
+ }
});
```
+# `Page.prototype.setData(data: Object, callback: Function)`
-# Page.prototype.setData(data: Object, callback: Function)
+`setData` 会将数据从逻辑层发送到视图层,并同步改变 `this.data` 的值。采用 `key: value` 形式,`key` 以数据路径给出,如 `array[2].message`、`a.b.c.d`,无需在 `this.data` 中预先定义。
-`setData` 会将数据从逻辑层发送到视图层,同时改变对应的 `this.data` 的值。 `Object` 以 `key: value` 的形式表示,将 `this.data` 中的 `key` 对应的值改变成 `value`。其中 `key` 可以非常灵活,以数据路径的形式给出,如 `array[2].message`、`a.b.c.d`,可以不需要在 `this.data` 中预先定义。
+使用时须知:
-使用过程中,需要注意以下几点:
-
-- 直接修改 `this.data` 无效,无法改变页面的状态,还会造成数据不一致。
-- 仅支持设置可 JSON 化的数据。
-- 请尽量避免一次设置过多的数据和频繁多次调用 setData(),两种情况都会影响性能。
-- 请不要把 data 中任何一项的 value 设为 undefined ,否则这一项将不被设置并可能遗留一些潜在问题。
+- 直接改变 `this.data` 是无效的,会导致数据不一致。
+- 仅支持可 JSON 化的数据。
+- 避免设置过多数据和频繁调用 `setData()`,二者均影响性能。
+- 避免将 `data` 中任何项的 `value` 设为 `undefined`,否则该项不被设置且可能有潜在问题。
示例代码:
@@ -474,7 +468,7 @@ Page({
name: 'taobao',
},
changeTitle() {
- // 错误!不要直接去修改 data 里的数据
+ // 错误!不要直接修改 data 里的数据。
// this.data.text = 'changed data'
// 正确
this.setData({
@@ -482,7 +476,7 @@ Page({
});
},
changeArray() {
- // 可以直接使用数据路径来修改数据
+ // 可以直接使用数据路径修改数据。
this.setData({
'array[0].text': 'b',
});
@@ -503,8 +497,8 @@ Page({
name: 'alipay',
},
() => {
- // 接受传递回调函数
- console.log(this); // this 当前页面实例
+ // 回调函数,在渲染更新完成后执行。
+ console.log(this); // this 指当前页面实例。
this.setData({ name: this.data.name + ', ' + 'welcome!' });
}
);
@@ -514,25 +508,24 @@ Page({
**参数说明**
-| **事件** | **类型** | **描述** | **最低版本** |
-| --- | --- | --- | --- |
-| data | Object | 待改变的数据 | - |
-| callback | Function | 回调函数,在页面渲染更新完成之后执行。 | 使用 [my.canIUse('page.setData.callback')](https://opendocs.alipay.com/mini/api/can-i-use) 做兼容性处理,可查看 [1.7.0](https://opendocs.alipay.com/mini/framework/lib)。 |
-
+| **参数** | **类型** | **描述** | **最低版本** |
+| -------- | ----------- | ------------------------------ | --------------------------- |
+| data | `Object` | 待修改的数据 | - |
+| callback | `Function` | 页面渲染更新完成后的回调函数。 | [my.canIUse('page.setData.callback')](https://opendocs.alipay.com/mini/api/can-i-use) 可用于兼容性处理。详见 [1.7.0](https://opendocs.alipay.com/mini/framework/lib)。 |
# Page.prototype.$spliceData(data: Object, callback: Function)
-**说明:**`$spliceData` 自 1.7.2 之后才支持,可以使用 **my.canIUse('page.$spliceData')** 做兼容性处理,可查看 [兼容](https://opendocs.alipay.com/mini/framework/compatibility)。
+**说明**:`$spliceData` 自 1.7.2 起支持,可以使用 `my.canIUse('page.$spliceData')` 做兼容性处理,可查看[兼容](https://opendocs.alipay.com/mini/framework/compatibility)。
-`spliceData` 同样用于将数据从逻辑层发送到视图层,但是相比于 `setData`,在处理长列表的时候,其具有更高的性能。
+`spliceData` 用于将数据从逻辑层发送到视图层,相比于 `setData`,在处理长列表时具有更高性能。
-`Object` 以 `key: value` 的形式表示,将 `this.data` 中的 `key` 对应的值改变成 `value`。其中 `key` 可以非常灵活,以数据路径的形式给出,如 `array[2].message`、`a.b.c.d`,可以不需要在 `this.data` 中预先定义。`value` 为一个数组(格式:[start, deleteCount, ...items]), 数组的第一个元素为操作的起始位置,第二个元素为删除的元素的个数,剩余的元素均为插入的数据。对应 `es5` 中数组的 `splice` 方法。
+`Object` 以 `key: value` 形式给出,`key` 代表 `this.data` 中将被改变的值的数据路径,例如 `array[2].message`、`a.b.c.d`。`key` 可灵活定义,不需在 `this.data` 中预设。`value` 是一个数组(格式:[start, deleteCount, ...items]),第一个元素为操作开始位置,第二个元素为需删除元素个数,余下元素为插入数据,对应 `es5` 中数组的 `splice` 方法。
## 示例代码
```html
-
+
{{item}}
@@ -562,24 +555,24 @@ Page({
3
4
```
+参数说明
-## 参数说明
-
-| **事件** | **类型** | **描述** |
-| -------- | -------- | -------------------------------------- |
-| data | Object | 待改变的数据。 |
-| callback | Function | 回调函数,在页面渲染更新完成之后执行。 |
-
+| 事件 | 类型 | 描述 |
+| -------- | -------- | ---------------------------------------- |
+| data | Object | 待改变的数据 |
+| callback | Function | 回调函数,在页面渲染更新完成之后执行 |
# Page.prototype.$batchedUpdates(callback: Function)
批量更新数据。
-**说明**:`$batchedUpdates` 自 1.14.0 之后才支持,可以使用 **my.canIUse('page.$batchedUpdates')** 做兼容性处理,可查看 [兼容](https://opendocs.alipay.com/mini/framework/compatibility)。
+**说明**:
+
+`$batchedUpdates` 从 1.14.0 版本开始支持。可以使用 `my.canIUse('page.$batchedUpdates')` 进行兼容性处理,具体可查看[兼容](https://opendocs.alipay.com/mini/framework/compatibility)说明。
## 参数说明
-| **事件** | **类型** | **描述** |
-| -------- | -------- | -------------------------------------- |
+| 事件 | 类型 | 描述 |
+| -------- | -------- | --------------------------------------- |
| callback | Function | 在此回调函数中的数据操作会被批量更新。 |
## 示例代码
@@ -611,9 +604,8 @@ Page({
```
-- 本示例中每次点击按钮,页面的 `counter` 会加 2。
-- 将 `setData` 放在 this.$batchedUpdates 中,这样尽管有多次 `setData`,但是却只有一次数据的传输。
-
+- 本示例中,每次点击按钮,页面的 `counter` 会增加 2。
+- 将 `setData` 放在 `this.$batchedUpdates` 中,这样虽然有多次 `setData`,但实际只有一次数据传输。
# Page.prototype.createSelectorQuery
创建 [SelectorQuery 对象实例](https://opendocs.alipay.com/mini/api/pc8s51),查找定义在页面 .axml 中的节点。支持基础库 [2.7.4](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 及以上版本。可用性判断:
@@ -624,9 +616,9 @@ my.canIUse('page.createSelectorQuery');
与 [my.createSelectorQuery](https://opendocs.alipay.com/mini/api/selector-query) 的区别是:
-| **用法** | **select() 和 selectAll() 选择器语法** | **选择范围** |
-| --- | --- | --- |
-| my.createSelectorQuery | CSS 语法 | 所有渲染层上的节点。 |
+| **用法** | **select() 和 selectAll() 选择器语法** | **选择范围** |
+|----------|------------------------------------|----------------------|
+| my.createSelectorQuery | CSS 语法 | 所有渲染层上的节点。 |
| this.createSelectorQuery | 严格选择器语法,可查看 [selector 语法](https://opendocs.alipay.com/mini/01og7z#selector%20%E8%AF%AD%E6%B3%95)。 | 仅所指页面或自定义组件的 .axml 中定义的节点。 |
# Page.prototype.createIntersectionObserver
@@ -639,30 +631,30 @@ my.canIUse('page.createIntersectionObserver');
与 [my.createIntersectionObserver](https://opendocs.alipay.com/mini/api/intersectionobserver) 的区别是:
-| **用法** | **relativeTo() 和 observe() 选择器语法** | **检测范围** |
-| --- | --- | --- |
-| my.createIntersectionObserver | CSS 语法 | 所有渲染层上的节点。 |
+| **用法** | **relativeTo() 和 observe() 选择器语法** | **检测范围** |
+|------------------------------|--------------------------------------|----------------------|
+| my.createIntersectionObserver | CSS 语法 | 所有渲染层上的节点。 |
| this.createIntersectionObserver | 严格选择器语法,可查看 [selector 语法](https://opendocs.alipay.com/mini/01og7z#selector%20%E8%AF%AD%E6%B3%95)。 | 仅所指页面或自定义组件的 .axml 中定义的节点。 |
# Page.prototype.createMediaQueryObserver
-创建 [MediaQueryObserver 对象实例](https://opendocs.alipay.com/mini/05bb9n),用于监听页面 media query 状态的变化。支持基础库 [2.8.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 及以上版本。可用性判断:
+
+创建 [MediaQueryObserver 对象实例](https://opendocs.alipay.com/mini/05bb9n),用于监听页面媒体查询(media query)状态的变化。支持基础库 [2.8.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 及以上版本。可用性判断:
```javascript
my.canIUse('page.createMediaQueryObserver');
```
-
# Page.prototype.getOpenerEventChannel
-基础库 [2.7.7](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持。如果一个页面由另一个页面通过 [my.navigateTo](https://opendocs.alipay.com/mini/api/zwi8gx) 打开,这两个页面间将建立一条通信通道:
+基础库 [2.7.7](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持。如果一个页面是由另一个页面通过 [my.navigateTo](https://opendocs.alipay.com/mini/api/zwi8gx) 打开,这两个页面间将建立一条通信通道:
-- 被打开的页面可以通过 this.getOpenerEventChannel() 方法来获得一个 [EventChannel](https://opendocs.alipay.com/mini/api/eventchannel) 对象。
-- my.navigateTo 的 `success` 回调中也包含一个 EventChannel 对象。
+- 被打开的页面可以通过 `this.getOpenerEventChannel()` 方法来获取一个 [EventChannel](https://opendocs.alipay.com/mini/api/eventchannel) 对象。
+- `my.navigateTo` 的 `success` 回调中也会包含一个 EventChannel 对象。
-这两个 EventChannel 对象间可以使用 `emit` 和 `on` 方法相互发送、监听事件。
+这两个 EventChannel 对象可以使用 `emit` 和 `on` 方法来相互发送、监听事件。
# Page.prototype.getTabBar
-获取自定义 tabBar 实例,参照 [自定义 tabBar](https://opendocs.alipay.com/mini/03jry7)。基础库 **2.7.20** 起支持。
+获取自定义 tabBar 实例,参照[自定义 tabBar](https://opendocs.alipay.com/mini/03jry7)。基础库 **2.7.20** 起支持。
```javascript
Page({
@@ -678,7 +670,7 @@ Page({
# Page.prototype.route
-Page 路径,对应 app.json 中配置的路径值,类型为 String。这是一个只读属性。
+Page 路径对应 app.json 中配置的路径值,类型为 String。这是一个只读属性。
```javascript
Page({
@@ -688,12 +680,11 @@ Page({
},
});
```
-
# Page.prototype.router
-页面路由器对象,有 switchTab、 reLaunch 、redirectTo、 navigateTo、 navigateBack 五个方法。可以通过 this.pageRouter 或 this.router 获得当前页面的路由器对象。基础库 **2.7.22** 起支持。
+页面路由器对象有 `switchTab`、 `reLaunch` 、 `redirectTo`、 `navigateTo`、 `navigateBack` 五个方法。可以通过 `this.pageRouter` 或 `this.router` 获得当前页面的路由器对象。基础库 **2.7.22** 起支持。
-| **属性** | **类型** | **说明** |
-| --- | --- | --- |
-| router | Object | 相对于 this 指代的页面的 [Router](https://opendocs.alipay.com/mini/03uzdq) 对象 |
-| pageRouter | Object | 相对于 this 指代的页面的 [Router](https://opendocs.alipay.com/mini/03uzdq) 对象 |
+| 属性 | 类型 | 说明 |
+| ------------ | ------ | ----------------------------------------- |
+| `router` | Object | 相对于 `this` 指代的页面的 [`Router`](https://opendocs.alipay.com/mini/03uzdq) 对象 |
+| `pageRouter` | Object | 相对于 `this` 指代的页面的 [`Router`](https://opendocs.alipay.com/mini/03uzdq) 对象 |
diff --git "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\351\205\215\347\275\256.md" "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\351\205\215\347\275\256.md"
index 9237d90a2..6a5f19924 100644
--- "a/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\351\205\215\347\275\256.md"
+++ "b/mini/framework/\345\260\217\347\250\213\345\272\217\351\241\265\351\235\242/\351\241\265\351\235\242\351\205\215\347\275\256.md"
@@ -1,21 +1,23 @@
-小程序页面文件夹中的 `.json` 文件用于配置当前页面的窗口表现,在页面配置中设置的项会 **覆盖** [window](https://opendocs.alipay.com/mini/framework/app-json#window) 中对应的配置项。
+小程序页面文件夹中的 `.json` 文件用于配置当前页面的窗口表现,在页面配置中设置的项会**覆盖**[window](https://opendocs.alipay.com/mini/framework/app-json#window)中对应的配置项。
-页面配置支持 **window** 中所有的配置项,同时支持如下额外配置项:
+页面配置支持**window**中所有的配置项,同时支持如下额外配置项:
-- 支持 `optionMenu` 配置导航图标,点击后触发 `onOptionMenuClick`(**注意**:该配置即将废弃。)。
+- 支持 `optionMenu` 配置导航图标,点击后触发 `onOptionMenuClick`(**注意**:该配置即将废弃)。
- 支持 `titlePenetrate`,设置导航栏点击穿透。
- 支持 `barButtonTheme`,设置导航栏图标主题。
额外配置项的详情如下:
-| **属性名** | **类型** | **必填** | **描述** | **最低版本** |
-| --- | --- | --- | --- | --- |
-| optionMenu | Object | 否 | 设置导航栏额外图标,目前支持设置属性 icon,值为图标 url(以 https/http 开头)或 base64 字符串,大小建议 30\*30 px。 | [基础库 1.3.0](https://opendocs.alipay.com/mini/framework/compatibility) |
-| titlePenetrate | String | 否 | 设置导航栏点击穿透,取值 `("YES","NO")`。 | [支付宝客户端 10.1.52](https://opendocs.alipay.com/mini/framework/compatibility) |
-| barButtonTheme | String | 否 | 设置导航栏图标主题,仅支持真机预览。`"default"` 为蓝色图标,`"light"` 为白色图标。 | [支付宝客户端 10.1.52](https://opendocs.alipay.com/mini/framework/compatibility) |
-| styleIsolation | String | 否 | 设置样式隔离表现。该选项支持以下值:
- `apply-shared` 表示 app.acss 样式以及其它(设置了 `shared` 的页面和其它自定义组件)的样式将影响到自定义组件,但自定义组件 acss 中指定的样式不会影响外部。
- `shared`(默认)表示 app.acss 样式以及其它(设置了 `shared` 的页面和其它自定义组件)的样式将影响到页面,自定义组件 acss 中指定的样式也会影响到外部。
| [基础库 2.7.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| 属性名 | 类型 | 必填 | 描述 | 最低版本 |
+| ------------- | -------- | ---- | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
+| optionMenu | Object | 否 | 设置导航栏额外图标,目前支持设置属性 icon,值为图标 url(以 https/http 开头)或 base64 字符串,大小建议 30\*30 px。 | [基础库 1.3.0](https://opendocs.alipay.com/mini/framework/compatibility) |
+| titlePenetrate | String | 否 | 设置导航栏点击穿透,取值为 `"YES"` 或 `"NO"`。 | [支付宝客户端 10.1.52](https://opendocs.alipay.com/mini/framework/compatibility) |
+| barButtonTheme | String | 否 | 设置导航栏图标主题,仅支持真机预览。`"default"` 为蓝色图标,`"light"` 为白色图标。 | [支付宝客户端 10.1.52](https://opendocs.alipay.com/mini/framework/compatibility) |
+| styleIsolation | String | 否 | 设置样式隔离表现。该选项支持以下值: | [基础库 2.7.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| | | | `- apply-shared` 表示 app.acss 样式以及其它(设置了 `shared` 的页面和其他自定义组件)的样式将影响到自定义组件,但自定义组件 acss 中指定的样式不会影响外部。 | |
+| | | | `- shared`(默认)表示 app.acss 样式以及其他(设置了 `shared` 的页面和其他自定义组件)的样式将影响到页面,自定义组件 acss 中指定的样式也会影响到外部。 | |
-其它支持的配置项的详细文档可查看 [window](https://opendocs.alipay.com/mini/framework/app-json#window)。
+其他支持的配置项的详细文档可查看[window](https://opendocs.alipay.com/mini/framework/app-json#window)。
以下为一个基本示例:
@@ -32,7 +34,6 @@
"barButtonTheme": "light"
}
```
-
# 常见问题
## Q:支付宝小程序页面的导航栏支持自定义吗?
@@ -42,7 +43,7 @@ A:目前导航栏仅支持如下设置:
- 隐藏标题栏上的返回首页图标,可查看 [my.hideBackHome](https://opendocs.alipay.com/mini/api/ui-navigate)。
- 隐藏当前页面的导航条的加载动画,可查看 [my.hideNavigationBarLoading](https://opendocs.alipay.com/mini/api/ncgsga)。
- 设置导航栏样式,可查看 [my.setNavigationBar](https://opendocs.alipay.com/mini/api/xwq8e6)。
-- 显示当前页面显示导航条的加载动画,可查看 [my.showNavigationBarLoading](https://opendocs.alipay.com/mini/api/lydg2a)。
+- 显示当前页面的导航条加载动画,可查看 [my.showNavigationBarLoading](https://opendocs.alipay.com/mini/api/lydg2a)。
更多关于导航栏的常见问题可查看 [导航栏 FAQ](https://opendocs.alipay.com/mini/007l6m)。
diff --git "a/mini/framework/\346\241\206\346\236\266\346\246\202\350\277\260.md" "b/mini/framework/\346\241\206\346\236\266\346\246\202\350\277\260.md"
index 8a675a90e..a180ad5b5 100644
--- "a/mini/framework/\346\241\206\346\236\266\346\246\202\350\277\260.md"
+++ "b/mini/framework/\346\241\206\346\236\266\346\246\202\350\277\260.md"
@@ -1,29 +1,28 @@
# 文件结构
-小程序分为 `app` 和 `page` 两层。`app` 用来描述整个应用,`page` 用来描述各个页面,此外还有关于整个 `project` 的配置描述(可选)。
+小程序分为 `app` 和 `page` 两层。`app` 用来描述整个应用,而 `page` 用来描述各个页面。此外,还有关于整个 `project` 的配置描述(可选)。
`app` 由三个文件组成,必须放在项目的根目录。
-| **文件** | **必填** | **作用** |
-| -------- | -------- | ---------------- |
-| app.js | 是 | 小程序逻辑 |
-| app.json | 是 | 小程序全局设置 |
-| app.acss | 否 | 小程序全局样式表 |
+| 文件 | 必填 | 作用 |
+| ------ | ---- | -------------- |
+| app.js | 是 | 小程序逻辑 |
+| app.json | 是 | 小程序全局设置 |
+| app.acss | 否 | 小程序全局样式表 |
`page` 由四个文件组成,分别是:
-| **文件类型** | **必填** | **作用** |
-| ------------ | -------- | ---------- |
-| js | 是 | 页面逻辑 |
-| axml | 是 | 页面结构 |
-| json | 是 | 页面配置 |
-| acss | 否 | 页面样式表 |
-
-**注意:** 为了方便开发者,支付宝小程序规定这四个文件必须具有相同的路径与文件名。 `project` 特指 `mini.project.json` 文件,必须放在项目的根目录,其中的具体配置可查看 [小程序项目配置介绍](https://opendocs.alipay.com/mini/framework/project)。开发者写的所有代码最终将会打包成一份 JavaScript 脚本,在小程序启动的时候运行,在小程序结束运行时销毁。
+| 文件类型 | 必填 | 作用 |
+| -------- | ---- | ------------ |
+| js | 是 | 页面逻辑 |
+| axml | 是 | 页面结构 |
+| json | 是 | 页面配置 |
+| acss | 否 | 页面样式表 |
+**注意:** 为了方便开发者,支付宝小程序规定这四个文件必须具有相同的路径与文件名。`project` 特指 `mini.project.json` 文件,须放在项目的根目录。其中的具体配置可以查看 [小程序项目配置介绍](https://opendocs.alipay.com/mini/framework/project)。开发者编写的所有代码最终会打包成一份 JavaScript 脚本。在小程序启动时运行,结束运行时销毁。
# 逻辑结构
-小程序的核心是一个响应式的数据绑定系统,分为视图层和逻辑层。这两层始终保持同步,只要在逻辑层修改数据,视图层就会相应的更新。示例代码:
+小程序的核心是一个响应式的数据绑定系统,分为视图层和逻辑层。这两层始终保持同步,只要在逻辑层修改数据,视图层就会相应地更新。示例代码:
```html
@@ -48,43 +47,42 @@ Page({
});
```
-上面代码中,框架自动将逻辑层数据中的 `name` 与视图层的 `name` 进行了绑定,所以在页面一打开的时候会显示 `Hello taobao!`。用户点击按钮的时候,视图层会发送 `changeName` 的事件给逻辑层,逻辑层找到对应的事件处理函数。逻辑层执行了 `setData` 的操作,将 `name` 从 `taobao` 变为 `alipay` ,因为该数据和视图层已经绑定了,从而视图层会自动改变为 `Hello alipay!`。 **注意:** 由于框架并非运行在浏览器中,所以 JavaScript 在 web 中的一些能力都无法使用,如 `document`、`window` 等对象。逻辑层 js 可以用 ES2015 模块化语法组织代码:
+如上代码所示,框架自动将逻辑层数据中的 `name` 与视图层的 `name` 进行了绑定,因此页面一打开的时候会显示 `Hello taobao!`。用户点击按钮时,视图层会发送 `changeName` 的事件给逻辑层,逻辑层找到对应的事件处理函数。执行 `setData` 操作后,将 `name` 从 `taobao` 变为 `alipay`,由于该数据和视图层已经绑定,视图层会自动更新为 `Hello alipay!`。**注意:** 由于框架并非运行在浏览器中,因此 JavaScript 在 web 中的一些能力都无法使用,例如 `document`、`window` 等对象。逻辑层的 JavaScript 可以使用 ES2015 的模块化语法组织代码:
```javascript
import util from './util'; // 载入相对路径
import absolute from '/absolute'; // 载入项目根路径文件
```
-
## 模块名的保留字
-小程序中将浏览器部分内置对象名(如 window、document)作保留字使用,以应对未来的不时之需。 保留字有:**globalThis**、**global**、**AlipayJSBridge**、**fetch**、**self**、**window**、**document**、**location**、**XMLHttpRequest**。请勿使用保留字做模块名,否则框架会出现无法正常访问模块的现象。如:
+小程序中将一些浏览器内部对象名(如 `window`、`document`)定义为保留字,为未来的应用留出可能性。这些保留字包括:`globalThis`、`global`、`AlipayJSBridge`、`fetch`、`self`、`window`、`document`、`location`、`XMLHttpRequest`。请不要使用这些保留字作为模块名,否则可能会导致框架无法正常访问模块。例如:
```javascript
import { window } from './myWindow';
-console.log(window); // undefined
+console.log(window); // 结果为 undefined
```
-上述代码中,因为使用了保留字做模块名,使得引入的模块变成了 undefined 。正确的方法是不使用保留字命名模块,或者在引入模块的时候使用 as 关键字给模块重新命名,例如:
+在上述代码中,由于模块名采用了保留字,导致引入的模块变成了 `undefined`。正确的做法是避免使用保留字命名模块。或者,在引入模块时,可以使用 `as` 关键字给模块重新命名。例如:
```javascript
import { window as myWindow } from './myWindow';
console.log(myWindow);
```
-# 第三方 NPM 模块
+## 第三方 NPM 模块
-小程序支持引入第三方模块,需先在小程序根目录下执行如下命令安装该模块:
+小程序支持引入第三方模块。首先,需要在小程序的根目录下执行以下命令来安装所需模块:
-```javascript
+```shell
$ npm install query-string --save
```
-引入后即可在逻辑层中直接使用:
+安装完成后,即可在逻辑层中直接使用该模块:
```javascript
-import queryString from 'query-string'; // 载入第三方 npm 模块
+import queryString from 'query-string'; // 引入第三方 npm 模块
```
-有关 NPM 的详细介绍,可查看 [NPM 包管理](https://opendocs.alipay.com/mini/ide/npm-manage)。
+关于 NPM 的详细介绍,请参阅 [NPM 包管理](https://opendocs.alipay.com/mini/ide/npm-manage)。
-**注意:** 由于 `node_modules` 里第三方模块代码不会经过转换器,为了确保各个终端兼容,`node_modules` 下的代码需要转成 ES5 格式再引用,模块格式推荐使用 ES2015 的 import/export。同时,浏览器相关 web 能力同样无法使用。
+**注意**:由于 `node_modules` 中的第三方模块代码不会经过转换器处理,为了确保各终端的兼容性,`node_modules` 下的代码需要转换为 ES5 格式后引用。同时,推荐模块格式使用 ES2015 的 import/export 语法。此外,无法使用浏览器相关的 web 能力。
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/Mixin.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/Mixin.md"
index 9bba56ae2..b826e069d 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/Mixin.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/Mixin.md"
@@ -1,40 +1,39 @@
注册一个 `mixin`,接受一个 Object 类型的参数。
## 版本要求
-- 基础库 [2.8.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始支持,若版本较低,建议采取 [兼容处理](https://opendocs.alipay.com/mini/framework/compatibility)。可通过 `my.canIUse('mixin')` 进行判断。
-- 基础库 [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始支持小程序页面设置 mixins 字段以引用 Mixin 实例,可通过 my.canIUse('page.mixins') 进行判断。
+- 基础库 [2.8.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始支持,若版本较低,建议采取[兼容处理](https://opendocs.alipay.com/mini/framework/compatibility)。可通过 `my.canIUse('mixin')` 进行判断。
+- 基础库 [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始支持小程序页面设置 `mixins` 字段以引用 Mixin 实例,可通过 `my.canIUse('page.mixins')` 进行判断。
# 注意
-Page 引用 mixin 与 Component 引用 mixin 相比,有以下区别:
-- Mixin 定义段 props、onInit、deriveDataFromProps、didMount、didUpdate、didUnmount、onError、lifetimes、relations 会被忽略。
-- rootEvents 内的页面生命周期函数/页面事件处理函数与 page.events 得触发时机一致。
-- methods 内的事件响应函数或自定义方法会被解构赋值作为 Page 实例的方法,但优先级小于 Page 构造器本身定义的方法。
+Page 引用 mixin 与 Component 引用 mixin 相比,有以下区别:
+- Mixin 定义段 `props`、`onInit`、`deriveDataFromProps`、`didMount`、`didUpdate`、`didUnmount`、`onError`、`lifetimes`、`relations` 会被忽略。
+- `rootEvents` 内的页面生命周期函数/页面事件处理函数与 `page.events` 的触发时机一致。
+- `methods` 内的事件响应函数或自定义方法会被解构赋值作为 Page 实例的方法,但优先级小于 Page 构造器本身定义的方法。
## 参数
**Object object**
-| **定义段** | **类型** | **必填** | **描述** | **最低版本** |
+| 定义段 | 类型 | 必填 | 描述 | 最低版本 |
| --- | --- | --- | --- | --- |
-| props | Object | 否 | 为外部传入的数据设置默认值。
**注意:** 被 Page 引用时,此定义段无效。| - |
+| props | Object | 否 | 为外部传入的数据设置默认值。
**注意:** 被 Page 引用时,此定义段无效。| - |
| data | Object | 否 | 组件内部状态。 |
-| observers | Object | 否 | 数据变化观测器,用于监听 data 的变化,可查看 [数据变化观测器](https://opendocs.alipay.com/mini/04y1n6)。 | - |
-| onInit | Function | 否 | 组件生命周期函数,组件创建时触发。
**注意:** 被 Page 引用时,此定义段无效。 | - |
-| deriveDataFromProps | Function | 否 | 组件生命周期函数,组件创建时和更新前触发。
**注意:** 被 Page 引用时,此定义段无效。 | - |
-| didMount | Function | 否 | 组件生命周期函数,组件创建完毕时触发。
**注意:** 被 Page 引用时,此定义段无效。| - |
-| didUpdate | Function | 否 | 组件生命周期函数,组件更新完毕时触发。
**注意:** 被 Page 引用时,此定义段无效。 | - |
-| didUnmount | Function | 否 | 组件生命周期函数,组件删除时触发。
**注意:** 被 Page 引用时,此定义段无效。| - |
-| onError | Function | 否 | 组件方法执行抛出错误时触发。
**注意:** 被 Page 引用时,此定义段无效。| - |
-| mixins | Array | 否 | 组件间代码复用机制。
**注意:** 支持传入 `Mixin()` 的返回值,不支持传入普通的 mixin 对象。 | - |
-| methods | Object | 否 | 组件的方法,可以是事件响应函数或任意的自定义方法。
**注意:** 被 Page 引用时,会解构赋值作为 page 实例的方法,但优先级小于 Page 构造器本身定义的方法。 | - |
-| definitionFilter | Function | 否 | 定义段过滤器,用于自定义组件扩展,可查看 [自定义组件扩展](https://opendocs.alipay.com/mini/05bdpv)。 | - |
-| lifetimes | Object | 否 | 树维度生命周期。
**注意:** 被 Page 引用时,此定义段无效。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| rootEvents | Object | 否 | 组件所在页面的页面生命周期以及页面事件处理函数声明。
**注意:** 被 Page 引用时,此定义段会被认为是 [events](https://opendocs.alipay.com/mini/framework/page-detail#events) 定义段。 | [2.8.6](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| relations | Object | 否 | 组件间关系定义。可查看 [组件间关系](https://opendocs.alipay.com/mini/069w9y)。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-
+| observers | Object | 否 | 数据变化观测器,用于监听 `data` 的变化,可查看[数据变化观测器](https://opendocs.alipay.com/mini/04y1n6)。| - |
+| onInit | Function | 否 | 组件生命周期函数,组件创建时触发。
**注意:** 被 Page 引用时,此定义段无效。| - |
+| deriveDataFromProps | Function | 否 | 组件生命周期函数,组件创建时和更新前触发。
**注意:** 被 Page 引用时,此定义段无效。| - |
+| didMount | Function | 否 | 组件生命周期函数,组件创建完毕时触发。
**注意:** 被 Page 引用时,此定义段无效。| - |
+| didUpdate | Function | 否 | 组件生命周期函数,组件更新完毕时触发。
**注意:** 被 Page 引用时,此定义段无效。| - |
+| didUnmount | Function | 否 | 组件生命周期函数,组件删除时触发。
**注意:** 被 Page 引用时,此定义段无效。| - |
+| onError | Function | 否 | 组件方法执行抛出错误时触发。
**注意:** 被 Page 引用时,此定义段无效。| - |
+| mixins | Array | 否 | 组件间代码复用机制。
**注意:** 支持传入 `Mixin()` 的返回值,不支持传入普通的 mixin 对象。| - |
+| methods | Object | 否 | 组件的方法,可以是事件响应函数或任意的自定义方法。
**注意:** 被 Page 引用时,会解构赋值作为 page 实例的方法,但优先级小于 Page 构造器本身定义的方法。| - |
+| definitionFilter | Function | 否 | 定义段过滤器,用于自定义组件扩展,可查看[自定义组件扩展](https://opendocs.alipay.com/mini/05bdpv)。| - |
+| lifetimes | Object | 否 | 树维度生命周期。
**注意:** 被 Page 引用时,此定义段无效。|[2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| rootEvents | Object | 否 | 组件所在页面的页面生命周期以及页面事件处理函数声明。
**注意:** 被 Page 引用时,此定义段会被认为是[events](https://opendocs.alipay.com/mini/framework/page-detail#events)定义段。|[2.8.6](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| relations | Object | 否 | 组件间关系定义。可查看[组件间关系](https://opendocs.alipay.com/mini/069w9y)。|[2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
## 示例代码
```typescript
const mixin = Mixin({
- mixins: [Mixin({})],
+ mixins: [Mixin({})],
props: {
},
@@ -49,4 +48,3 @@ const mixin = Mixin({
}
});
```
-
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/mixins.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/mixins.md"
index 3b684170a..7d4106427 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/mixins.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/mixins.md"
@@ -1,5 +1,6 @@
## 概述
-开发者有时可能会实现多个自定义组件,而这些自定义组件可能会有些公共逻辑要处理,小程序提供 mixins 用于解决这种情况。
+
+开发者有时可能会实现多个自定义组件,而这些自定义组件可能会有些公共逻辑要处理。小程序提供 mixins,用于解决这种情况。
示例代码:
@@ -16,7 +17,7 @@ export default {
};
```
-**注意**: `onInit` 与 `deriveDataFromProps` 自基础库 `1.14.0` 开始支持,可以使用 `my.canIUse('component2')` 做兼容判断,并且,使用 component2 的相关功能,需要在 IDE 中的 **详情** > **项目配置** 中,勾选 component2。
+**注意**:`onInit` 与 `deriveDataFromProps` 自基础库 `1.14.0` 开始支持。可以使用 `my.canIUse('component2')` 做兼容判断。并且,使用 component2 的相关功能,需要在 IDE 中的 **详情** > **项目配置** 中,勾选 component2。
```javascript
// /components/index/index.js
@@ -39,42 +40,41 @@ const methods = {
Component({
mixins: [lifecycle, initialState, defaultProps, methods],
data: {
- name: 'alipay',
+ name: 'Alipay',
},
});
```
```html
-{{name}}: {{age}}
+{{name}}:{{age}}
```
-
-
## Mixin
-基础库 [2.8.2](https://opendocs.alipay.com/mini/framework/lib) 开始,自定义组件的参数 mixins 开始支持通过 `Mixin()` 注册生成的 mixin。对比直接传入普通的 JS 对象,通过 Mixin 注册生成的 mixin 有三点不同:
-- Mixin 支持 [mixins](https://opendocs.alipay.com/mini/framework/component_object#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E) 参数,即嵌套传入 mixin。
+基础库 [2.8.2](https://opendocs.alipay.com/mini/framework/lib) 版本起,自定义组件的参数 mixins 支持通过 `Mixin()` 注册生成的 mixin。与直接传入普通 JS 对象相比,通过 Mixin 注册生成的 mixin 有以下三个差异:
+
+- Mixin 支持 [mixins](https://opendocs.alipay.com/mini/framework/component_object#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E) 参数,即能嵌套传入 mixin。
- Mixin 注册的 mixin 实例支持自定义组件扩展机制。
-- 可通过自定义组件实例方法 `hasMixin` 判断当前自定义组件使用引入了某个 Mixin 实例。
+- 可通过自定义组件实例方法 `hasMixin` 判断当前自定义组件是否引入了特定的 Mixin 实例。
## 同名字段的覆盖和组合规则
-组件和它引用的 mixin 可以包含同名的字段,对这些字段的处理方法如下:
-- 如果有同名的属性(props)或方法 (methods):
- 1. 若组件有这个属性或方法,则组件的属性会覆盖 mixin 中的同名属性或方法。
- 2. 若组件本身无这个属性或方法,则在组件的 [mixins](https://opendocs.alipay.com/mini/framework/component_object#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E) 字段中定义靠后的 mixin 的属性或方法会覆盖靠前的同名属性或方法。
- 3. 在 b 的基础上,若存在嵌套引用 mixin 的情况(只有 Mixin 才支持嵌套引用 mixin,且被引用的 mixin 需是 Mixin 实例),则规则为:引用者 mixin 覆盖被引用的 mixin 实例中的同名属性或方法。
-- 如果有同名的内部数据字段(data):
- 1. 若组件有这个数据字段,则组件的数据字段会覆盖 mixin 中的同名数据字段。
- 2. 若组件无这个数据字段,则:引用者 mixin > 被引用的 mixin(只有 Mixin 才支持嵌套引用 mixin,且被引用的 mixin 需是 Mixin 实例)、 靠后的 mixin > 靠前的 mixin(优先级高的覆盖优先级低的,最大的为优先级最高)。
-- 生命周期函数和 observers 不会相互覆盖,而是在对应触发时机被逐个调用:
- - 对于不同的生命周期函数之间,遵循组件生命周期函数的执行顺序。
- - 对于同种生命周期函数和同字段 observers ,遵循如下规则:
- - mixin 优先于组件执行。
- - 被引用的 mixin 优先于 引用者 mixin 执行(只有 Mixin 才支持嵌套引用 mixin,且被引用的 mixin 需是 Mixin 实例)。
- - 靠前的 mixin 优先于 靠后的 mixin 执行;
- - 如果同一个 mixin(需是 Mixin 实例) 被一个组件多次引用,它定义的生命周期函数和 observers 不会重复执行。
+组件和它引用的 mixin 可以包含同名的字段,这些字段的处理方法如下:
+- 如果存在同名的属性(props)或方法(methods):
+ 1. 如果组件有这个属性或方法,则组件的属性会覆盖 mixin 中的同名属性或方法。
+ 2. 如果组件本身没有这个属性或方法,则组件的 [mixins](https://opendocs.alipay.com/mini/framework/component_object#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E) 参数中定义靠后的 mixin 的属性或方法会覆盖靠前的同名属性或方法。
+ 3. 在上述基础上,若存在嵌套引用 mixin 的情况(只有 Mixin 支持嵌套引用,且被引用的 mixin 必须是 Mixin 实例),则规则为:引用者 mixin 的同名属性或方法会覆盖被引用的 mixin 实例中的同名属性或方法。
+- 如果存在同名的内部数据字段(data):
+ 1. 如果组件已定义这个数据字段,则组件的数据字段会覆盖 mixin 中的同名数据字段。
+ 2. 如果组件没有这个数据字段,则:引用者 mixin 优先于被引用的 mixin(只有 Mixin 支持嵌套引用,且被引用的 mixin 必须是 Mixin 实例),靠后的 mixin 会覆盖靠前的同名字段(优先级高者覆盖优先级低者)。
+- 生命周期函数和 observers 不相互覆盖,而是在各自的触发时机被依次调用:
+ - 不同生命周期函数间遵循组件生命周期函数的执行顺序。
+ - 相同生命周期函数和同字段 observers 遵循如下规则:
+ - mixin 优先于组件执行。
+ - 被引用的 mixin 优先于引用者 mixin 执行(只有 Mixin 支持嵌套引用,且被引用的 mixin 必须是 Mixin 实例)。
+ - 靠前的 mixin 优先于靠后的 mixin 执行;
+ - 如果同一个 mixin(需是 Mixin 实例)被一个组件多次引用,它定义的生命周期函数和 observers 会执行多次。
# 相关文档
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/ref \350\216\267\345\217\226\347\273\204\344\273\266\345\256\236\344\276\213.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/ref \350\216\267\345\217\226\347\273\204\344\273\266\345\256\236\344\276\213.md"
index 46af88e34..c4c70b263 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/ref \350\216\267\345\217\226\347\273\204\344\273\266\345\256\236\344\276\213.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/ref \350\216\267\345\217\226\347\273\204\344\273\266\345\256\236\344\276\213.md"
@@ -2,7 +2,7 @@
# 自定义组件 ref 定义段
-自定义组件可在选项中配置一个 `ref` 方法,该方法的返回值将作为该自定义组件的对外引用实例。配置 `ref` 后,支持小程序宿主、小程序插件互相获取对方的自定义组件对外实例。
+从基础框架 1.18.0 起,自定义组件可以在选项中配置 `ref` 方法。此方法的返回值将作为该自定义组件的对外引用实例。配置了 `ref` 后,宿主小程序和插件小程序可以互相获取对方的自定义组件对外实例。
```javascript
// components/index/index.js
@@ -23,11 +23,10 @@ Component({
});
```
-如未定义此方法,尝试引用该自定义组件的对外实例时,同属于一个小程序宿主或者小程序插件的其他自定义组件或页面会获得该自定义组件的 `this`,否则获得 `null`。
-
+如果未定义 `ref` 方法,尝试引用该自定义组件的对外实例时,若是同属一个小程序宿主或插件的其他自定义组件或页面,会获得该自定义组件的 `this`;否则,获得 `null`。
# 创建后 ref 回调
-如果小程序项目开启了 component2,就可以在 AXML 中给自定义组件定义 ref 回调。当被引用的自定义组件创建后,将自动触发该回调。对于未开启 component2 的场景请使用 [my.canIUse('component2')](https://opendocs.alipay.com/mini/api/can-i-use) 做兼容。
+如果小程序项目开启了 `component2`,就可以在 AXML 中给自定义组件定义 `ref` 回调。当被引用的自定义组件创建后,将自动触发该回调。对于未开启 `component2` 的场景,请使用 [`my.canIUse('component2')`](https://opendocs.alipay.com/mini/api/can-i-use) 做兼容。
```javascript
// /pages/index/index.js
@@ -48,10 +47,9 @@ Page({
```
-
# 自定义组件选择方法
-自定义组件可以通过 [this.selectOwnerComponent](https://opendocs.alipay.com/mini/framework/component_object#%E7%BB%84%E4%BB%B6%E5%AE%9E%E4%BE%8B%E6%96%B9%E6%B3%95)、[this.selectComposedParentComponent](https://opendocs.alipay.com/mini/framework/component_object#%E7%BB%84%E4%BB%B6%E5%AE%9E%E4%BE%8B%E6%96%B9%E6%B3%95) 等方法获取其创建者自定义组件、事件路径父自定义组件时,返回相关父组件的实例结果与 ref 回调相同。
+自定义组件可以通过 [this.selectOwnerComponent](https://opendocs.alipay.com/mini/framework/component_object#%E7%BB%84%E4%BB%B6%E5%AE%9E%E4%BE%8B%E6%96%B9%E6%B3%95)、[this.selectComposedParentComponent](https://opendocs.alipay.com/mini/framework/component_object#%E7%BB%84%E4%BB%B6%E5%AE%9E%E4%BE%8B%E6%96%B9%E6%B3%95) 等方法获取其创建者自定义组件、事件路径父自定义组件时,返回相关父组件的实例结果与 `ref` 回调相同。
假设某页面结构如下:
@@ -62,7 +60,7 @@ Page({
-
+
@@ -82,12 +80,10 @@ Component({
};
},
didMount() {
- // 被定义在页面的 .axml 中
+ // 在页面的 .axml 中定义了
console.log(this.selectOwnerComponent() === this.$page); // true
- // 在事件路径上页面是 的父节点
- console.log(
- this.selectComposedParentComponent() === this.selectOwnerComponent()
- ); // true
+ // 事件路径上页面是 的父节点
+ console.log(this.selectComposedParentComponent() === this.selectOwnerComponent()); // true
},
});
@@ -99,10 +95,10 @@ Component({
};
},
didMount() {
- // 被定义在页面的 .axml 中
+ // 在页面的 .axml 中定义了
console.log(this.selectOwnerComponent() === this.$page); // true
- // 作为默认插槽提供给了
- // 在事件路径上 是 的父节点
+ // 作为默认插槽被 使用
+ // 事件路径上 是 的父节点
console.log(this.selectComposedParentComponent().getMessage()); // "i am a"
},
});
@@ -110,12 +106,10 @@ Component({
// my-c.js
Component({
didMount() {
- // 被定义在 my-b.axml 中
+ // 在 my-b.axml 中定义了
console.log(this.selectOwnerComponent().getMessage()); // "i am b"
- // 在事件路径上 是 的父节点
- console.log(
- this.selectComposedParentComponent() === this.selectOwnerComponent()
- ); // true
+ // 事件路径上 是 的父节点
+ console.log(this.selectComposedParentComponent() === this.selectOwnerComponent()); // true
},
});
```
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\344\275\277\347\224\250\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\344\275\277\347\224\250\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md"
index fb47e22c8..fca5c4716 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\344\275\277\347\224\250\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\344\275\277\347\224\250\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md"
@@ -1,4 +1,4 @@
-**注意**:自定义组件的事件(如 onTap 等),并不是每个自定义组件默认支持的,需要自定义组件本身明确支持才能使用。
+**注意**:自定义组件的事件(如 `onTap` 等),并不是每个自定义组件默认支持的,需要自定义组件本身明确支持才能使用。
自定义组件的使用和基础组件类似。
@@ -18,15 +18,15 @@
```html
-
+
```
**注意**:
-- 使用自定义组件时,给自定义组件传递的属性可以在自定义组件内通过 this.props 获取,可查看 [props](https://opendocs.alipay.com/mini/framework/component_object#props)。
-- 自定义组件只能在 page 自身的 AXML 文件和组件自身的 AXML 文件中使用,不能通过 import 或 include 使用。
+- 使用自定义组件时,给自定义组件传递的属性可以在自定义组件内通过 `this.props` 获取,可查看 [props](https://opendocs.alipay.com/mini/framework/component_object#props)。
+- 自定义组件只能在页面自身的 AXML 文件和组件自身的 AXML 文件中使用,不能通过 `import` 或 `include` 使用。
**正确示例**:
@@ -43,11 +43,10 @@
HI, template
```
-
# 引用自定义组件
```json
-// 在 /pages/index/index.json 中配置(不是 app.json )
+// 在 /pages/index/index.json 中配置(不是 app.json)
{
"usingComponents": {
"your-custom-component": "mini-ali-ui/es/list/index",
@@ -59,7 +58,8 @@
// 项目绝对路径以 / 开头,相对路径以 ./ 或者 ../ 开头
```
+
# 相关文档
-- [props](https://opendocs.alipay.com/mini/framework/component_object#props)
+- [`props`](https://opendocs.alipay.com/mini/framework/component_object#props)
- [发布自定义组件](https://opendocs.alipay.com/mini/framework/custom-component-publish)
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\345\215\240\344\275\215\347\273\204\344\273\266.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\345\215\240\344\275\215\347\273\204\344\273\266.md"
index 44995d0dd..6a4c8d61c 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\345\215\240\344\275\215\347\273\204\344\273\266.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\345\215\240\344\275\215\347\273\204\344\273\266.md"
@@ -1,24 +1,24 @@
-在使用静态声明的 [懒加载模式](https://opendocs.alipay.com/mini/plugin/plugin-usage#%E6%87%92%E5%8A%A0%E8%BD%BD%E6%A8%A1%E5%BC%8F) 、[分包异步化](https://opendocs.alipay.com/mini/057ht3) 特性时,[自定义组件](https://opendocs.alipay.com/mini/framework/custom-component-overview) 所引用的其它自定义组件,在小程序刚开始进行渲染时可能处于不可用的状态,为了使渲染过程不被阻塞,不可用的自定义组件需要一个 **占位组件**。基础库会用占位组件替代不可用组件进行渲染,在该组件可用后,再将占位组件替换回该组件。
+在使用静态声明的[懒加载模式](https://opendocs.alipay.com/mini/plugin/plugin-usage#%E6%87%92%E5%8A%A0%E8%BD%BD%E6%A8%A1%E5%BC%8F)、[分包异步化](https://opendocs.alipay.com/mini/057ht3)特性时,[自定义组件](https://opendocs.alipay.com/mini/framework/custom-component-overview)所引用的其它自定义组件,在小程序刚开始进行渲染时可能处于不可用的状态。为了使渲染过程不被阻塞,不可用的自定义组件需要一个**占位组件**。基础库会用占位组件替代不可用组件进行渲染,在该组件可用后,再将占位组件替换回该组件。
# 使用须知
-- [非虚拟化组件节点](https://opendocs.alipay.com/mini/framework/component-template#%E9%9D%9E%E8%99%9A%E6%8B%9F%E5%8C%96%E7%BB%84%E4%BB%B6%E8%8A%82%E7%82%B9) 和占位组件同时使用时,需要基础库版本 [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 及以上。
-- 小程序基础库从 [2.8.1](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 版本开始支持占位组件。
-- 目前占位组件必须是另一个 **自定义组件**。
-- 当一个组件被指定为占位组件时(如配置示例中的 `hello` 组件),再为这个组件指定占位组件是无效的。
-- 如果一个组件需要作为其它组件的占位组件,这个组件必须在一开始就是可用的,如下场景是不可用的。
+- 当[非虚拟化组件节点](https://opendocs.alipay.com/mini/framework/component-template#%E9%9D%9E%E8%99%9A%E6%8B%9F%E5%8C%96%E7%BB%84%E4%BB%B6%E8%8A%82%E7%82%B9)与占位组件同时使用时,需要基础库版本[2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2)及以上。
+- 小程序基础库从[2.8.1](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2)版本开始支持占位组件。
+- 目前占位组件必须是另一个**自定义组件**。
+- 当一个组件被指定为占位组件时(如配置示例中的`hello`组件),再为这个组件指定占位组件是无效的。
+- 如果一个组件需要作为其它组件的占位组件,这个组件必须在一开始就是可用的。以下场景是不可用的:
- 插件开启懒加载模式后,使用插件提供的自定义组件作为占位组件,则渲染时会报错并抛出异常。
- - 使用分包的组件做为占位组件,如果运行时该分包还未被加载,则渲染时会报错并抛出异常。
+ - 使用分包的组件作为占位组件,如果运行时该分包还未被加载,则渲染时会报错并抛出异常。
- 如果一个组件不可用,且其占位组件不存在,则渲染时会报错并抛出异常。
-- 如果一个组件不存在,但为其指定了可用的占位组件,则占位组件可以被正常渲染,但后续尝试准备替换时会报错并抛出异常。
+- 如果一个组件不存在,但为其指定了可用的占位组件,则占位组件可以被正常渲染。但后续尝试准备替换时会报错并抛出异常。
# 配置
-`componentPlaceholder` 字段用于指定占位组件。
**说明**:开发者可在页面或自定义组件对应的 JSON 中进行配置。
-
+`componentPlaceholder`字段用于指定占位组件。
**说明**:开发者可在页面或自定义组件对应的JSON中进行配置。
## 配置示例
在页面的 JSON 文件中进行配置:
- 一个组件配置多个占位组件的配置示例:
+
```json
{
"usingComponents": {
@@ -34,6 +34,7 @@
```
- 一个组件配置一个占位组件的配置示例:
+
```json
{
"usingComponents": {
@@ -46,18 +47,20 @@
}
```
- - 该配置表示组件 `lazy-plugin-hello` 的占位组件为自定义组件 `hello`(其路径在 `usingComponents` 中配置)。假设该配置对应的模板如下:
+该配置表示组件 `lazy-plugin-hello` 的占位组件为自定义组件 `hello`(其路径在 `usingComponents` 中配置)。假设该配置对应的模板如下:
+
```html
```
- - 小程序页面渲染时,当渲染到组件 `lazy-plugin-hello`,发现是一个懒加载模式的插件,此时插件还未加载完成,会自动进行插件加载,并且页面将被渲染为:
+小程序页面渲染时,若渲染到组件 `lazy-plugin-hello` 且发现它是懒加载模式的插件,同时插件尚未加载完成,则会自动开始插件加载。在此期间,页面会被渲染为:
+
```html
```
- - 插件加载完成,`lazy-plugin-hello` 准备完毕后,页面被替换为:
+插件加载完成且 `lazy-plugin-hello` 准备完毕后,页面则会替换为:
+
```html
```
-
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\345\217\221\345\270\203\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\345\217\221\345\270\203\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md"
index 5d3146203..0143d890c 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\345\217\221\345\270\203\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\345\217\221\345\270\203\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266.md"
@@ -2,7 +2,7 @@
# 文件结构
-以下是发布自定义组件的推荐文件结构,仅供参考 。
+以下是发布自定义组件的推荐文件结构,仅供参考。
```plain
├── src // 单个自定义组件文件夹
@@ -23,14 +23,13 @@
## .json 示例代码
```json
-// package.json
{
- "name": "your-custom-compnent",
+ "name": "your-custom-component",
"version": "1.0.0",
- "description": "your-custom-compnent",
+ "description": "your-custom-component",
"repository": {
"type": "git",
- "url": "your-custom-compnent-repository-url"
+ "url": "your-custom-component-repository-url"
},
"files": ["es"],
"keywords": ["custom-component", "mini-program"],
@@ -50,11 +49,12 @@
// scripts/cp.js
const fs = require('fs-extra');
const path = require('path');
-// copy file
+
+// 复制文件
fs.copySync(path.join(__dirname, '../src'), path.join(__dirname, '../es'), {
filter(src, des) {
return !src.endsWith('.js');
- },
+ }
});
```
@@ -62,7 +62,8 @@ fs.copySync(path.join(__dirname, '../src'), path.join(__dirname, '../es'), {
// scripts/rm.js
const fs = require('fs-extra');
const path = require('path');
-// remove unnecessary file
+
+// 删除不必要的文件
const dirs = fs.readdirSync(path.join(__dirname, '../es'));
dirs.forEach(item => {
if (
@@ -87,7 +88,7 @@ fs.removeSync(path.join(__dirname, '../lib/'));
## 1. 打包组件
-运行 `npm run dist` 生成 **生产环境构建目录**。
+运行 `npm run dist`,生成**生产环境构建目录**。
## 2. 注册 npm 账号
@@ -98,9 +99,17 @@ fs.removeSync(path.join(__dirname, '../lib/'));
## 3. 登录账号并发布
- - 登录注册的账号:
npm login\npm adduser
- - 查看是否登录成功:
npm whoami
- - 发布组件包:
npm publish
发布成功后可在 npm 的个人中心的 Packages 里看到。
+ - 登录注册的账号:
+ npm login
+ npm adduser
+
+ - 查看是否登录成功:
+ npm whoami
+
+ - 发布组件包:
+ npm publish
+ 发布成功后可在 npm 的个人中心的 Packages 里看到。
+
# 相关文档
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\346\212\275\350\261\241\350\212\202\347\202\271.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\346\212\275\350\261\241\350\212\202\347\202\271.md"
index c3df2c3f2..18084da8a 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\346\212\275\350\261\241\350\212\202\347\202\271.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\346\212\275\350\261\241\350\212\202\347\202\271.md"
@@ -1,10 +1,17 @@
-自基础库 [2.8.6](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2)、[IDE 3.4.3](https://opendocs.alipay.com/mini/ide/download) 起支持此能力,请使用 [IDE 3.4.3](https://opendocs.alipay.com/mini/ide/download) 及以上调试。
有时,自定义组件模板中的一些节点,其对应的自定义组件不是由自定义组件本身确定的,而是由自定义组件的调用者确定的。这时可以把这个节点声明为“抽象节点”。
例如,现在来实现一个“选框组”(selectable-group)组件,它其中可以放置单选框(custom-radio)或者复选框(custom-checkbox)。这个组件的 AXML 可以这样编写:
+自基础库 [2.8.6](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2)、[IDE 3.4.3](https://opendocs.alipay.com/mini/ide/download) 起支持此能力,请使用 [IDE 3.4.3](https://opendocs.alipay.com/mini/ide/download) 及以上调试。
+
+有时,自定义组件模板中的一些节点,其对应的自定义组件不是由自定义组件本身确定的,而是由自定义组件的调用者确定的。这时可以把这个节点声明为“抽象节点”。
+
+例如,现在来实现一个“选框组”(selectable-group)组件,它其中可以放置单选框(custom-radio)或者复选框(custom-checkbox)。这个组件的 AXML 可以这样编写:
+
```html
```
-
其中,selectable 不是任何在 .json 文件的 usingComponents 字段中声明的组件,而是一个“抽象节点”。它需要在 componentGenerics 字段中声明:
+
+其中,`selectable` 不是任何在 .json 文件的 `usingComponents` 字段中声明的组件,而是一个“抽象节点”。它需要在 `componentGenerics` 字段中声明:
+
```json
{
"component": true,
@@ -15,7 +22,13 @@
}
}
```
-**注意**:
“抽象节点”需指定一个默认自定义组件,当具体组件未被指定时,将创建默认自定义组件的实例。例如上述配置里,当父自定义组件没有为子自定义组件指定 selectable 的实现时,将降级为 ./selectable 指向的自定义组件。
在使用 selectable-group 组件时,可以指定 selectable 具体是哪个自定义组件:
+
+**注意**:
+
+“抽象节点”需指定一个默认自定义组件,当具体组件未被指定时,将创建默认自定义组件的实例。例如上述配置里,当父自定义组件没有为子自定义组件指定 `selectable` 的实现时,将降级为 `./selectable` 指向的自定义组件。
+
+在使用 `selectable-group` 组件时,可以指定 `selectable` 具体是哪个自定义组件:
+
```html
@@ -24,5 +37,7 @@
```
-
**说明**:节点的引用 generic:xxx="yyy" 中,值 yyy 只能是静态值,不能包含数据绑定。
+**说明**:
+
+节点的引用 `generic:xxx="yyy"` 中,值 `yyy` 只能是静态值,不能包含数据绑定。
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\346\225\260\346\215\256\345\217\230\345\214\226\350\247\202\346\265\213\345\231\250.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\346\225\260\346\215\256\345\217\230\345\214\226\350\247\202\346\265\213\345\231\250.md"
index fe5c47c9c..a994a17c8 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\346\225\260\346\215\256\345\217\230\345\214\226\350\247\202\346\265\213\345\231\250.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\346\225\260\346\215\256\345\217\230\345\214\226\350\247\202\346\265\213\345\231\250.md"
@@ -1,61 +1,63 @@
-用于观测和响应任何属性和数据字段的变化,适用于 [自定义组件](https://opendocs.alipay.com/mini/framework/component_object) 和 [小程序页面](https://opendocs.alipay.com/mini/framework/page-detail)。
小程序基础库版本 [2.8.1](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始支持。
-
+用于观测和响应任何属性和数据字段的变化,适用于[自定义组件](https://opendocs.alipay.com/mini/framework/component_object)和[小程序页面](https://opendocs.alipay.com/mini/framework/page-detail)。小程序基础库版本[2.8.1](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2)开始支持。
# 开启数据变化观测器
-开发者在开发跨平台小程序时,会基于支付宝自定义组件系统封装出数据变化观测器。为了避免可能存在的基础库数据变化观测器与开发者对 observers 参数的封装产生冲突,需要由开发者显式开启数据变化观测器。
+
+开发者在开发跨平台小程序时,会基于支付宝自定义组件系统封装出数据变化观测器。为了避免可能存在的基础库数据变化观测器与开发者对 `observers` 参数的封装产生冲突,需要由开发者显式开启数据变化观测器。
- Component 构造器的 `options` 配置项设置 `observers: true`。
+
```typescript
Component({
options: {
// 使用基础库内置的数据变化观测器
- observers: true,
+ observers: true
},
-}
+});
```
- Page 构造器的 `options` 配置项设置 `observers: true`。
+
```typescript
Page({
options: {
// 使用基础库内置的数据变化观测器
- observers: true,
+ observers: true
},
-}
+});
```
## 兼容示例
+
```typescript
-function wrapComponentOptions (options) {
- // 运行时检测当前基础库版本是否已支持observers
+function wrapComponentOptions(options) {
+ // 运行时检测当前基础库版本是否已支持 component.observers
if (my.canIUse('component.observers')) {
options.options = options.options || {};
- options.options = {
- observers: true,
- };
+ options.options.observers = true;
} else {
- // 开发者统一封装的observers功能
+ // 开发者统一封装的 observers 功能
}
return options;
}
-Component(wrapComponentOptions(
+Component(wrapComponentOptions({
// 数据变化观测器
observers: {
"**": function(val) {
- console.log(val);
+ console.log(val);
}
}
-));
+}));
```
-
# 使用数据变化观测器
-有时,在一些数据字段被 setData 设置时,需要执行一些操作。
例如, this.data.sum 永远是 this.data.numberA 与 this.data.numberB 的和。此时,可以使用数据变化观测器进行如下实现。
+
+有时,在一些数据字段被 `setData` 设置时,需要执行一些操作。例如,`this.data.sum` 永远是 `this.data.numberA` 与 `this.data.numberB` 的和。此时,可以使用数据变化观测器进行如下实现。
+
```typescript
Component({
options: {
observers: true,
},
- // 开启comoponent2才会触发onInit
+ // 开启 component2 才会触发 onInit
onInit: function() {
this.setData({
numberA: 1,
@@ -74,13 +76,12 @@ Component({
```
## 观测字段语法
-数据变化观测器支持观测属性或内部数据的变化,可以同时观测多个。但一次 `setData` 每个观测器最多触发一次。
同时,观测器可以观测子数据字段。
-### 示例代码
+数据变化观测器支持观测属性或内部数据的变化,可以同时观测多个。但一次 `setData` 中,每个观测器最多触发一次。同时,观测器可以观测子数据字段。
```typescript
Component({
options: {
- observers: true,
+ observers: true
},
observers: {
'some.subfield': function(subfield) {
@@ -92,79 +93,84 @@ Component({
// 使用 setData 设置 this.data.arr[12] 时触发
// (除此以外,使用 setData 设置 this.data.arr 也会触发)
arr12 === this.data.arr[12]
- },
+ }
}
})
```
-如果需要观测所有子数据字段的变化,可以使用通配符 `**` 。
+
+如果需要观测所有子数据字段的变化,可以使用通配符 `**`。
+
```typescript
Component({
options: {
- observers: true,
+ observers: true
},
observers: {
'some.field.**': function(field) {
// 使用 setData 设置 this.data.some.field 本身或其下任何子数据字段时触发
// (除此以外,使用 setData 设置 this.data.some 也会触发)
field === this.data.some.field
- },
+ }
},
onInit: function() {
// 这样会触发上文的 observer
this.setData({
'some.field': { /* ... */ }
- })
+ });
// 这样也会触发上文的 observer
this.setData({
'some.field.xxx': { /* ... */ }
- })
+ });
// 这样还是会触发上文的 observer
this.setData({
'some': { /* ... */ }
- })
+ });
}
})
```
-特别地,仅使用通配符 `**` 可以观测全部 setData 以及所有属性的变化。
+
+特别地,仅使用通配符 `**` 可以观测全部 `setData` 以及所有属性的变化。
+
```typescript
Component({
options: {
- observers: true,
+ observers: true
},
observers: {
'**': function() {
// 每次 setData 都触发
- },
- },
+ }
+ }
})
```
-
# 注意事项
-- 数据变化观测器观测的是 setData 涉及到的数据字段,即使这些数据字段的值没有发生变化,数据变化观测器依然会被触发。
-- 如果在数据变化观测器函数中使用 setData 设置本身观测的数据字段,可能会导致死循环,需要特别留意。
-- 特别地,当观测的字段为`**`时,观测器对应入参的值将是 `{...this.props, ...this.data}`。应尽量避免观测 `**`,会导致性能受影响。
-- 正常情况下,属性或内部数据的变化都会触发对应字段的观测器函数。但同名字段(字段在属性内与内部数据同时存在),则此时只有 `setData` 会触发对应字段的观测器。因此,应尽量避免属性和内部数据拥有同名字段。
- - 对于同名字段,可使用生命周期函数 `deriveDataFromProps` 判断属性是否发生变化。
-- 是否 [开启component2](https://opendocs.alipay.com/mini/framework/component-lifecycle) 的差异:
- - 当开启 component2 后,数据变化观测器会在相当于 [deriveDataFromProps](https://opendocs.alipay.com/mini/framework/component-lifecycle#deriveDataFromProps) 生命周期方法执行后、更新子组件(更新组件树)之前的时刻执行符合条件的 callback。如果数据变化观测器对应的 callback 又执行了`setData`,会继续检测并执行符合条件的 callback。
- - 未开启 component2 时,数据变化观测器会在相当于 [didMount](https://opendocs.alipay.com/mini/framework/component-lifecycle#didMount)/[didUpdate](https://opendocs.alipay.com/mini/framework/component-lifecycle#didUpdate) 生命周期方法执行后即子组件已经更新(更新组件树)的时刻执行符合条件的 callback。如果数据变化观测器对应的 callback 又执行了`setData`,并不会触发数据变化观测器对应的 callback(与 `didUpdate` 内执行 `setData` 不会继续触发 `didUpdate` 的行为保持一致)。
- - 当使用数据变化观测器时,建议开启 component2,可减少不必要的组件树刷新。
+- 数据变化观测器观测的是 `setData` 涉及到的数据字段,即使这些数据字段的值没有发生变化,数据变化观测器依然会被触发。
+- 如果在数据变化观测器函数中使用 `setData` 设置本身观测的数据字段,可能会导致死循环,需要特别留意。
+- 特别地,当观测的字段为 `**` 时,观测器对应入参的值将是 `{...this.props, ...this.data}`。应尽量避免观测 `**`,因它会导致性能问题。
+- 正常情况下,属性或内部数据的变化都会触发对应字段的观测器函数。但同名字段(字段在属性内与内部数据同时存在)情况下,只有 `setData` 会触发对应字段的观测器。因此,应避免属性和内部数据有同名字段。
+ - 对于同名字段,可通过生命周期函数 `deriveDataFromProps` 判断属性是否变化。
+
+- 是否[开启 component2](https://opendocs.alipay.com/mini/framework/component-lifecycle)的差异:
+ - 开启 component2 后,数据变化观测器将在相当于 [`deriveDataFromProps`](https://opendocs.alipay.com/mini/framework/component-lifecycle#deriveDataFromProps) 生命周期方法执行后、更新子组件之前执行。如果数据变化观测器所触发的回调中执行了 `setData`,则会连续检测并执行符合条件的回调。
+ - 未开启 component2 时,数据变化观测器在相当于 [`didMount`](https://opendocs.alipay.com/mini/framework/component-lifecycle#didMount)/[`didUpdate`](https://opendocs.alipay.com/mini/framework/component-lifecycle#didUpdate) 生命周期方法执行后执行。此时,如果数据变化观测器所触发的回调又执行了 `setData`,不会再触发数据变化观测器的回调。此行为与 `didUpdate` 方法中执行 `setData` 一致。
+ - 使用数据变化观测器时,建议开启 component2,以减少不必要的组件树刷新。
+
```typescript
Component({
- props: {
+ props: {
max: 1,
},
data: {
max: 100
},
deriveDataFromProps(nextProps) {
- if (nextProps.max !== this.props.max) {
- // 将属性max的最新值通过setData 赋值给this.data.max
+ if (nextProps.max !== this.props.max) {
+ // 将属性 max 的最新值通过 setData 赋值给 this.data.max
this.setData({
- max: this.props.max,
- })
+ max: nextProps.max,
+ });
}
}
-})
+});
```
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\224\237\345\221\275\345\221\250\346\234\237.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\224\237\345\221\275\345\221\250\346\234\237.md"
index 3fd384923..9095a6863 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\224\237\345\221\275\345\221\250\346\234\237.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\224\237\345\221\275\345\221\250\346\234\237.md"
@@ -1,70 +1,70 @@
-组件的生命周期,指的是在特殊的时间点由框架自动触发的一些组件方法。基础库提供两种维度的生命周期:
+组件的生命周期,指的是在特殊的时间点由框架自动触发的一些组件方法。基础库提供了两种维度的生命周期:
-- 数据维度的生命周期:主要包含 onInit、deriveDataFromProps、didMount、didUpdate、didUnmount、onError 方法。
-- 节点树维度的生命周期:组件在页面节点树发生变化时触发,主要包含 created、attached、ready、moved、detached 方法,这些方法包含了一个组件实例生命流程的主要时间点。
+- 数据维度的生命周期:主要包含 `onInit`、`deriveDataFromProps`、`didMount`、`didUpdate`、`didUnmount`、`onError` 方法。
+- 节点树维度的生命周期:组件在页面节点树发生变化时触发,主要包含 `created`、`attached`、`ready`、`moved`、`detached` 方法,这些方法包含了一个组件实例生命流程的主要时间点。
# 生命周期示意图

# 数据维度生命周期
-数据维度的生命周期,在 Component 构造器的第一级参数中定义。
-生命周期函数具体信息见下表:
-| **函数名** | **参数** | **说明** | **最低版本** |
+数据维度的生命周期,在 `Component` 构造器的第一级参数中定义。生命周期函数具体信息见下表:
+
+| 函数名 | 参数 | 说明 | 最低版本 |
| --- | --- | --- | --- |
-| onInit | - | 组件创建时触发。
注: 需 [开启component2](https://opendocs.alipay.com/mini/03dbc3#compileOptions) | [1.14.0](https://opendocs.alipay.com/mini/framework/compatibility) |
-| deriveDataFromProps | nextProps | 组件创建时和更新前触发。
注: 需 [开启component2](https://opendocs.alipay.com/mini/03dbc3#compileOptions) | [1.14.0](https://opendocs.alipay.com/mini/framework/compatibility) |
+| onInit | - | 组件创建时触发。
注:需[开启 component2](https://opendocs.alipay.com/mini/03dbc3#compileOptions) | [1.14.0](https://opendocs.alipay.com/mini/framework/compatibility) |
+| deriveDataFromProps | nextProps | 组件创建时和更新前触发。
注:需[开启 component2](https://opendocs.alipay.com/mini/03dbc3#compileOptions) | [1.14.0](https://opendocs.alipay.com/mini/framework/compatibility) |
| didMount | - | 组件创建完毕时触发。 | - |
-| didUpdate | (prevProps,prevData) | 组件更新完毕时触发。 | - |
+| didUpdate | (prevProps, prevData) | 组件更新完毕时触发。 | - |
| didUnmount | - | 组件删除时触发。 | - |
| onError | Error | 组件 JS 代码抛出错误时触发。 | [1.24.9](https://opendocs.alipay.com/mini/framework/compatibility) |
**注意**:
-- 基础库 `1.14.0` 开始支持的生命周期函数 `onInit`、`deriveDataFromProps` 需在项目配置里 [开启component2](https://opendocs.alipay.com/mini/03dbc3#compileOptions) 后才会生效,自定义组件 component2 相关介绍详见[自定义组件介绍-使用须知](https://opendocs.alipay.com/mini/framework/custom-component-overview#%E4%BD%BF%E7%94%A8%E9%A1%BB%E7%9F%A5)。
-- 运行时阶段,可以使用 [my.canIUse('component2')](https://opendocs.alipay.com/mini/api/can-i-use) 做兼容,判断当前自定义组件是否会触发 `onInit` 以及 `deriveDataFromProps`。
-- 根据 [基础库版本分布](https://opendocs.alipay.com/mini/framework/lib),基础库 `1.14.0`以下的版本占比极低,可以忽略。
+
+- 基础库 `1.14.0` 开始支持的生命周期函数 `onInit`、`deriveDataFromProps`,需在项目配置中[开启 component2](https://opendocs.alipay.com/mini/03dbc3#compileOptions)后才会生效。自定义组件 component2 相关介绍详见[自定义组件介绍-使用须知](https://opendocs.alipay.com/mini/framework/custom-component-overview#%E4%BD%BF%E7%94%A8%E9%A1%BB%E7%9F%A5)。
+- 运行时阶段,可以使用 `my.canIUse('component2')` 做兼容判断,了解当前自定义组件是否会触发 `onInit` 及 `deriveDataFromProps`。
+- 根据[基础库版本分布](https://opendocs.alipay.com/mini/framework/lib),基础库 `1.14.0`以下版本占比极低,可以忽略。
```javascript
Component({
onInit() {
- // 当开启component2时,会触发onInit
- // 在组件创建时发起request请求。
+ // 当开启 component2 时,会触发 onInit。
+ // 在组件创建时发起 request 请求。
// my.request(...);
},
didMount() {
- // 当未开启component2时,不会触发onInit
- // 在组件创建完毕时发起request请求。
+ // 当未开启 component2 时,不会触发 onInit。
+ // 在组件创建完毕时发起 request 请求。
if (!my.canIUse('component2')) {
// my.request(...);
- // 已支持component2,在onInit阶段已发起request请求,didMount不再发起同一个request请求
+ // 已支持 component2,在 onInit 阶段已发起 request 请求,didMount 不再发起同一个 request 请求。
} else {
-
+ // ...
}
}
-})
+});
```
-
## onInit
-`onInit` 在组件创建时触发。在 onInit 中,可以进行以下操作:
+`onInit` 在组件创建时触发。在 `onInit` 中,可以进行以下操作:
-- 访问 `this.is`、`this.$id`、`this.$page` 等属性。
-- 访问 `this.data`、`this.props` 等属性。
+- 访问 `this.is`、`this.$id` 和 `this.$page` 等属性。
+- 访问 `this.data` 和 `this.props` 等属性。
- 访问组件 methods 中的自定义属性。
-- 调用 `this.setData`、`this.$spliceData` 修改数据。
+- 调用 `this.setData` 和 `this.$spliceData` 修改数据。
### 示例代码
```javascript
// /components/index/index.js
Component({
data: {
- counter: 0,
+ counter: 0
},
onInit() {
this.setData({
counter: 1,
- is: this.is,
+ is: this.is
});
- },
+ }
});
```
```html
@@ -77,11 +77,8 @@ Component({
1
/components/index/index
```
-
## deriveDataFromProps
-`deriveDataFromProps` 在组件创建和更新时都会触发。
-在 `deriveDataFromProps` 中可以:
-
+`deriveDataFromProps` 在组件创建和更新时都会触发。在 `deriveDataFromProps` 中可以:
- 访问 `this.is`、`this.$id`、`this.$page` 等属性。
- 访问 `this.data`、`this.props` 等属性。
- 访问组件 methods 中的自定义属性。
@@ -90,7 +87,7 @@ Component({
### 示例代码
```javascript
-// /components/index/index.
+// components/index/index.js
Component({
data: {
counter: 5,
@@ -105,31 +102,31 @@ Component({
});
```
```html
-
+
{{counter}}
```
```javascript
-// /pages/index/index.js
+// pages/index/index.js
Page({
data: {
counter: 1,
},
plus() {
- this.setData({ counter: this.data.counter + 1 })
+ this.setData({ counter: this.data.counter + 1 });
},
});
```
```html
-
+
```
-**注意:** 本示例中点击 + 按钮,页面上的 counter 会一直保持不变,直到 pCounter 的值大于 5。
-
+**注意:**本示例中,点击 + 按钮时,页面上的 counter 会一直保持不变,直到 pCounter 的值大于 5。
## didMount
-didMount 为组件创建完毕的回调。此时组件已完成首次渲染。
+`didMount` 为组件创建完毕的回调。此时组件已完成首次渲染。
### 示例代码
+
```javascript
Component({
data: {},
@@ -140,9 +137,10 @@ Component({
```
## didUpdate
-didUpdate 为自定义组件数据更新后的回调,每次组件数据变更的时候都会调用。
+`didUpdate` 为自定义组件数据更新后的回调,每次组件数据变更的时候都会调用。
### 示例代码
+
```javascript
Component({
data: {},
@@ -151,15 +149,17 @@ Component({
},
});
```
+
**注意**:
-- 组件内部调用 `this.setData` 会触发 didUpdate。
-- 外部调用者调用 `this.setData` 也会触发 didUpdate。
+- 组件内部调用 `this.setData` 会触发 `didUpdate`。
+- 外部调用者调用 `this.setData` 也会触发 `didUpdate`。
## didUnmount
-didUnmount 为自定义组件被卸载后的回调,每当组件实例从页面卸载的时候都会触发此回调。
+`didUnmount` 为自定义组件被卸载后的回调,每当组件实例从页面卸载的时候都会触发此回调。
### 示例代码
+
```javascript
Component({
data: {},
@@ -168,72 +168,73 @@ Component({
},
});
```
-
## onError
-onError 为自定义组件 JS 代码执行抛出出错时的回调。
+`onError` 是自定义组件 JS 代码执行出错时的回调函数。
### 示例代码
```javascript
Component({
didMount() {
- this.triggerError(); // this.triggerError不存在,此处会抛错,并被onError捕获到。
+ this.triggerError(); // `this.triggerError` 不存在,此处会抛出错误,并被 `onError` 捕获。
},
onError(error) {
console.log(error);
}
});
```
-
# 节点树维度生命周期 lifetimes
-节点树维度的生命周期,在节点树发生变化时触发,包含了一个组件实例生命流程的主要时间点。
从基础库版本 [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始, Component 构造器开始支持 lifetimes 字段,用于定义节点树维度的生命周期。
生命周期函数具体信息见下表:
-| **函数名** | **参数** | **说明** | **最低版本** |
-| --- | --- | --- | --- |
-| created | - | 在组件实例刚刚被创建时执行。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| attached | - | 在组件实例进入页面节点树时执行。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| ready | - | 在组件在视图层布局完成后执行。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| moved | - | 在组件实例被移动到节点树另一个位置时执行。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| detached | - | 在组件实例被从页面节点树移除时执行。| [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+节点树维度的生命周期在节点树发生变化时触发,包含了一个组件实例生命流程的主要时间点。从基础库版本 [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始,`Component` 构造器开始支持 `lifetimes` 字段,用于定义节点树维度的生命周期。
+
+生命周期函数具体信息见下表:
+| 函数名 | 参数 | 说明 | 最低版本 |
+| --- | --- | --- | --- |
+| `created` | - | 在组件实例刚刚被创建时执行。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| `attached` | - | 在组件实例进入页面节点树时执行。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| `ready` | - | 在组件在视图层布局完成后执行。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| `moved` | - | 在组件实例被移动到节点树另一个位置时执行。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| `detached` | - | 在组件实例被从页面节点树移除时执行。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
## 开启 lifetimes
-为避免基础库原生支持的 lifetimes 与开发者自身对 lifetimes 字段的封装产生冲突,需要由开发者显式开启 lifetimes,否则框架不自动触发 lifetimes 相关方法。
通过 Component 构造器的 `options` 配置项设置 `lifetimes: true` 开启。
+
+为避免基础库原生支持的 `lifetimes` 与开发者自身对 `lifetimes` 字段的封装产生冲突,需要由开发者显式开启 `lifetimes`,否则框架不自动触发 `lifetimes` 相关方法。通过 `Component` 构造器的 `options` 配置项设置 `lifetimes: true` 开启。
+
```javascript
Component({
options: {
- // 允许基础库识别 lifetimes 字段以支持 lifetimes 功能
+ // 允许基础库识别 `lifetimes` 字段以支持 lifetimes 功能
lifetimes: true,
},
-}
+});
```
## 注意
-在 Mixin 中也可以编写 lifetimes 内的生命周期方法,同时不会与其它 Mixin 实例中的同名生命周期相互覆盖。
-## Bug & Tip
+在 `Mixin` 中也可以编写 `lifetimes` 内的生命周期方法,同时不会与其它 `Mixin` 实例中的同名生命周期相互覆盖。
-- `Bug` 基础库 2.8.5 版本,退出一个页面时,还在页面节点树中的组件 detached 不会被触发。
+## Bug & Tip
-## 示例代码
+- **Bug** :在基础库 2.8.5 版本,退出一个页面时,还在页面节点树中的组件 `detached` 不会被触发。
```javascript
Component({
options: {
- // 允许基础库识别lifetimes字段以支持lifetimes功能
+ // 允许基础库识别 lifetimes 字段以支持 lifetimes 功能
lifetimes: true,
},
lifetimes: {
- // 在组件实例刚刚被创建时执行。
+ // 在组件实例刚刚被创建时执行
created() { },
- // 在组件实例进入页面节点树时执行。
+ // 在组件实例进入页面节点树时执行
attached() { },
- // 在组件在视图层布局完成后执行。
+ // 在组件在视图层布局完成后执行
ready() { },
- // 在组件实例被移动到节点树另一个位置时执行。
+ // 在组件实例被移动到节点树另一个位置时执行
moved() { },
- // 在组件实例被从页面节点树移除时执行。
+ // 在组件实例被从页面节点树移除时执行
detached() { }
}
-}
+});
```
# 相关文档
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\345\257\271\350\261\241.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\345\257\271\350\261\241.md"
index 492e1fd8b..deaaf9c31 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\345\257\271\350\261\241.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\345\257\271\350\261\241.md"
@@ -19,32 +19,32 @@ Component({
});
```
-**注意**:`onInit`、`deriveDataFromProps` 仅支持在基础库 **1.14.0** 版本及以上使用,可调用 [my.canIUse('component2')](https://opendocs.alipay.com/mini/api/can-i-use) 实现兼容,并且,需要在 IDE 中的 **详情** > **项目配置** 中,勾选 **component2**。
-
+**注意**:`onInit` 和 `deriveDataFromProps` 仅支持在基础库 **1.14.0** 版本及以上使用。您可以调用 [my.canIUse('component2')](https://opendocs.alipay.com/mini/api/can-i-use) 来检测是否兼容。此外,还需在 IDE 的 **详情** > **项目配置** 中勾选 **component2**。
## 参数
-| **参数** | **类型** | **必填** | **说明** | **最低版本** |
-| --- | --- | --- | --- | --- |
-| data | Object | 否 | 组件内部状态。 | - |
-| options | Object | 否 | 一些选项(介绍相关功能时会涉及到具体的配置项,这里暂不列举)。 | [2.8.1](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| observers | Object | 否 | 数据变化观测器,用于监听 data 的变化,可查看 [数据变化观测器](https://opendocs.alipay.com/mini/04y1n6)。 | [2.8.1](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| props | Object | 否 | 为外部传入的数据设置默认值。 | - |
-| onInit | Function | 否 | 组件生命周期函数,组件创建时触发。 | [1.14.0](https://opendocs.alipay.com/mini/framework/compatibility) |
-| deriveDataFromProps | Function | 否 | 组件生命周期函数,组件创建时和更新前触发。 | [1.14.0](https://opendocs.alipay.com/mini/framework/compatibility) |
-| didMount | Function | 否 | 组件生命周期函数,组件创建完毕时触发。 | - |
-| didUpdate | Function | 否 | 组件生命周期函数,组件更新完毕时触发。 | - |
-| didUnmount | Function | 否 | 组件生命周期函数,组件删除时触发。 | - |
-| mixins | Array | 否 | 组件间代码复用机制。 基础库 [2.8.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持传入 [Mixin()](https://opendocs.alipay.com/mini/05bchn) 实例。| - |
-| methods | Object | 否 | 组件的方法,可以是事件响应函数或任意的自定义方法。 | - |
-| ref | Function | 否 | 指定组件被 ref 引用时或被自定义组件选择方法(如 selectOwnerComponent )选中时的返回值。基础库 [2.8.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持通过实例方法 `hasMixin('ref')` 检测自定义组件使用传入了 `ref`。 | [1.18.0](https://opendocs.alipay.com/mini/framework/compatibility) |
-| relations | Object | 否 | 组件间关系定义,可查看 [组件间关系](https://opendocs.alipay.com/mini/069w9y)。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| 参数 | 类型 | 必填 | 说明 | 最低版本 |
+| ---------- | -------- | ---- | ----------------------------------------------------------- | ------------------------------------------------------------ |
+| data | Object | 否 | 组件内部状态。 | - |
+| options | Object | 否 | 一些选项(介绍相关功能时会涉及到具体的配置项,这里暂不列举)。 | [2.8.1](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| observers | Object | 否 | 数据变化观测器,用于监听 data 的变化,可查看 [数据变化观测器](https://opendocs.alipay.com/mini/04y1n6)。 | [2.8.1](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| props | Object | 否 | 为外部传入的数据设置默认值。 | - |
+| onInit | Function | 否 | 组件生命周期函数,组件创建时触发。 | [1.14.0](https://opendocs.alipay.com/mini/framework/compatibility) |
+| deriveDataFromProps | Function | 否 | 组件生命周期函数,组件创建时和更新前触发。 | [1.14.0](https://opendocs.alipay.com/mini/framework/compatibility) |
+| didMount | Function | 否 | 组件生命周期函数,组件创建完毕时触发。 | - |
+| didUpdate | Function | 否 | 组件生命周期函数,组件更新完毕时触发。 | - |
+| didUnmount | Function | 否 | 组件生命周期函数,组件删除时触发。 | - |
+| mixins | Array | 否 | 组件间代码复用机制。基础库 [2.8.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持传入 [Mixin()](https://opendocs.alipay.com/mini/05bchn) 实例。 | - |
+| methods | Object | 否 | 组件的方法,可以是事件响应函数或任意的自定义方法。 | - |
+| ref | Function | 否 | 指定组件被 ref 引用时或被自定义组件选择方法(如 selectOwnerComponent)选中时的返回值。基础库 [2.8.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 起支持通过实例方法 `hasMixin('ref')` 检测自定义组件是否传入了 `ref`。 | [1.18.0](https://opendocs.alipay.com/mini/framework/compatibility) |
+| relations | Object | 否 | 组件间关系定义,可查看 [组件间关系](https://opendocs.alipay.com/mini/069w9y)。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
| externalClasses | Array | 否 | 组件接受的外部样式类,可查看 [外部样式类](https://opendocs.alipay.com/mini/framework/component-template#%E5%A4%96%E9%83%A8%E6%A0%B7%E5%BC%8F%E7%B1%BB)。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| lifetimes | Object | 否 | 节点树维度的生命周期对象。可查看 [节点树维度生命周期](https://opendocs.alipay.com/mini/framework/component-lifecycle#%E8%8A%82%E7%82%B9%E6%A0%91%E7%BB%B4%E5%BA%A6%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%20lifetimes)。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
-| rootEvents | Object | 否 | 组件所在页面的页面生命周期以及页面事件处理函数声明对象。可查看 Page 的 [events](https://opendocs.alipay.com/mini/framework/page-detail#events) 定义段。 | [2.8.6](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| lifetimes | Object | 否 | 节点树维度的生命周期对象。可查看 [节点树维度生命周期](https://opendocs.alipay.com/mini/framework/component-lifecycle#%E8%8A%82%E7%82%B9%E6%A0%91%E7%BB%B4%E5%BA%A6%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%20lifetimes)。 | [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+| rootEvents | Object | 否 | 组件所在页面的页面生命周期以及页面事件处理函数声明对象。可查看 Page 的 [events](https://opendocs.alipay.com/mini/framework/page-detail#events) 定义段。 | [2.8.6](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |
+
### methods
-自定义组件不仅可以渲染静态数据,也可以响应用户点击事件,进而处理并触发自定义组件重新渲染。methods 中可以定义任意自定义方法。
+自定义组件不仅可以渲染静态数据,也可以响应用户点击事件,进而处理并触发自定义组件重新渲染。可以在 methods 中定义任意自定义方法。
**注意**:与 Page 不同,自定义组件需要将事件处理函数定义在 methods 中。
@@ -67,17 +67,16 @@ Component({
});
```
-页面会渲染一个按钮,每次点击它页面的数字都会加 1。
-
+页面会渲染一个按钮。每次点击该按钮时,页面的数字都会增加 1。
### props
-自定义组件可以接受外界的输入,做完处理之后,还可以通知外界说:我做完了。这些都可以通过 props 实现。
+自定义组件可以接受外界的输入,处理之后,还可以通知外界:我已完成。这些功能通过 `props` 实现。
**注意**:
-- props 为外部传过来的属性,可指定默认属性,不能在自定义组件内部代码中修改。
+- `props` 为外部传来的属性,可设置默认值,但不可在自定义组件内部代码中修改。
- 自定义组件的 AXML 中可以直接引用 `props` 属性。
-- 自定义组件的 AXML 中的事件只能由自定义组件的 JS 的 methods 中的方法来响应, 如果需要调用父组件传递过来的函数,可以在 methods 中通过 `this.props` 调用。
+- 自定义组件的 AXML 中的事件,只能由 JS 中 `methods` 定义的方法响应。如果需要用父组件传来的函数,可在 `methods` 中通过 `this.props` 调用。
```javascript
// /components/index/index.js
@@ -93,13 +92,13 @@ Component({
console.log(e);
const counter = this.data.counter + 1;
this.setData({ counter });
- this.props.onCounterPlusOne(counter); // axml中的事件只能由methods中的方法响应
+ this.props.onCounterPlusOne(counter); // AXML 中的事件只能由 methods 中的方法响应
},
},
});
```
-以上代码中 `props` 设置默认属性,然后在事件处理函数中通过 `this.props` 获取这些属性。
+上述代码中,`props` 设置了默认属性,在事件处理函数中通过 `this.props` 获取这些属性。
```html
@@ -107,28 +106,21 @@ Component({
extra: {{extra}}
```
-
#### 外部使用不传递 props
-
```html
```
-
页面输出:
-
```plain
0
extra: default extra
+1
```
-
-此时并未传递参数,所以页面会显示组件 js 中 `props` 设定的默认值。
+此时并未传递参数,所以页面会显示组件 `js` 中 `props` 设定的默认值。
#### 外部使用传递 props
-
-**注意**:外部使用自定义组件时,如果传递参数是函数,一定要以 `on` 为前缀,否则会将其处理为字符串。
-
+**注意**:外部使用自定义组件时,如果传递的是函数参数,一定要以 `on` 为前缀,否则该参数会被处理为字符串。
```javascript
// /pages/index/index.js
Page({
@@ -137,33 +129,28 @@ Page({
},
});
```
-
```html
```
-
页面输出:
-
```plain
0
extra: external extra
+1
```
-
-此时传递了参数,所以页面会显示外部传递的 extra 值 `external extra` 。
-
+此时传递了参数,所以页面会显示外部传递的 `extra` 值 `external extra`。
# 组件实例属性
-| **属性名** | **类型** | **说明** |
-| --- | --- | --- |
-| data | Object | 组件内部数据。 |
-| props | Object | 传入组件的属性。 |
-| is | String | 组件路径。 |
-| $page | Object | 组件所属页面实例。 |
-| $id | Number | 组件 id,可直接在组件 axml 中渲染值。 |
-| router | Object | 相对于当前自定义组件的 [Router](https://opendocs.alipay.com/mini/03uzdq) 对象 |
-| pageRouter | Object | 相对于当前自定义组件所在页面的 [Router](https://opendocs.alipay.com/mini/03uzdq) 对象 |
+| 属性名 | 类型 | 说明 |
+|--------|--------|--------------------------------------------|
+| data | Object | 组件内部数据。 |
+| props | Object | 传入组件的属性。 |
+| is | String | 组件路径。 |
+| $page | Object | 组件所属页面实例。 |
+| $id | Number | 组件 id,可直接在组件 axml 中渲染值。 |
+| router | Object | 相对于当前自定义组件的 [Router](https://opendocs.alipay.com/mini/03uzdq) 对象。 |
+| pageRouter | Object | 相对于当前自定义组件所在页面的 [Router](https://opendocs.alipay.com/mini/03uzdq) 对象。 |
以下为一个简单示例:
@@ -171,7 +158,7 @@ extra: external extra
// /components/index/index.js
Component({
didMount() {
- this.$page.xxCom = this; // 通过此操作可以将组件实例挂载到所属页面实例上
+ this.$page.xxCom = this; // 通过此操作可以将组件实例挂载到所属页面实例上。
console.log(this.is);
console.log(this.$page);
console.log(this.$id);
@@ -188,7 +175,7 @@ Component({
// /pages/index/index.js
Page({
onReady() {
- console.log(this.xxCom); // 可以访问当前页面所挂载的组件
+ console.log(this.xxCom); // 可以访问当前页面所挂载的组件。
},
});
```
@@ -200,64 +187,66 @@ Page({
{$viewId: 51, route: "pages/index/index"}
1
```
-
# 组件实例方法
-> 表格中 “-” 代表支持。
+表格中 “-” 代表支持。
-| **方法名** | **参数类型** | **说明** | **WebView兼容性** |**Native兼容性** |
+| 方法名 | 参数类型 | 说明 | WebView 兼容性 | Native 兼容性 |
| --- | --- | --- | -------- |--------- |
| setData | Object | 设置 data 触发视图渲染。 | - | - |
-| $spliceData | Object | 设置 data 触发视图渲染。 | - | - |
+| $spliceData | Object | 设置 data 触发视图渲染。 | - | - |
| createSelectorQuery | - | 创建 SelectorQuery 对象实例。| [2.7.24+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
-| createIntersectionObserver | Object | 创建 IntersectionObserver对象实例。 | [2.7.4+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) | 暂不支持 |
+| createIntersectionObserver | Object | 创建 IntersectionObserver 对象实例。 | [2.7.4+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) | 暂不支持 |
| createMediaQueryObserver | - | 创建一个 [MediaQueryObserver](https://opendocs.alipay.com/mini/05bb9n) 对象。| [2.8.2+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) | 暂不支持 |
| getTabBar | - | 获取自定义 tabBar 组件实例。 | [2.7.20+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
| selectOwnerComponent | - | 选取当前组件的创建者(即 AXML 中定义了此组件的组件),返回它的组件实例对象(会被 `ref` 影响)。 | [2.7.22+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
| selectComposedParentComponent | - | 选取当前组件在事件冒泡路径上的父组件,返回它的组件实例对象(会被 `ref` 影响)。 | [2.7.22+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
| $selectComponent | String | 根据传入的 [selector 匹配器](https://opendocs.alipay.com/mini/01og7z#selector%20%E8%AF%AD%E6%B3%95) 查询,返回匹配到的第一个的组件实例(会被 `ref` 影响)。 | [2.8.0+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
| $selectAllComponents | String | 根据传入的 [selector 匹配器](https://opendocs.alipay.com/mini/01og7z#selector%20%E8%AF%AD%E6%B3%95) 查询,返回匹配到的全部的组件实例数组(会被 `ref` 影响)。 | [2.8.0+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
-| getRelationNodes | String `relationKey` |获取这个关系所对应的所有关联节点。可查看 [组件间关系](https://opendocs.alipay.com/mini/069w9y) 。 | [2.8.5+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
-| setUpdatePerformanceListener | Object `options`, Function `listener` |设置更新性能统计信息接收函数。可查看 [获取更新性能统计信息](https://opendocs.alipay.com/mini/069xfk)。 | [2.8.5+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
-| getSavedReloadState | - |获取自定义组件及其所属页面重载前的状态对象。可查看 [beforeReload 事件](https://opendocs.alipay.com/mini/framework/page-detail?pathHash=15155d5c#beforeReload(event%3A%20Object)) | [2.8.9+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
-| hasMixin | String | 检查组件是否具有 mixin(须是通过 [Mixin()](https://opendocs.alipay.com/mini/05bchn) 创建的 mixin 实例)。
**注意:** 若自定义组件注册时传入了 ref 以指定组件返回值,则可通过 hasMixin('ref') 检查到。 | [2.8.2+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
+| getRelationNodes | String `relationKey` | 获取这个关系所对应的所有关联节点。可查看 [组件间关系](https://opendocs.alipay.com/mini/069w9y)。 | [2.8.5+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
+| setUpdatePerformanceListener | Object `options`, Function `listener` | 设置更新性能统计信息接收函数。可查看 [获取更新性能统计信息](https://opendocs.alipay.com/mini/069xfk)。 | [2.8.5+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
+| getSavedReloadState | - | 获取自定义组件及其所属页面重载前的状态对象。可查看 [beforeReload 事件](https://opendocs.alipay.com/mini/framework/page-detail?pathHash=15155d5c#beforeReload(event%3A%20Object)) | [2.8.9+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
+| hasMixin | String | 检查组件是否具有 mixin(须是通过 [Mixin()](https://opendocs.alipay.com/mini/05bchn) 创建的 mixin 实例)。注意:若自定义组件注册时传入了 ref 以指定组件返回值,则可通过 hasMixin('ref') 检查到。 | [2.8.2+](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) |- |
### $selectComponent/$selectAllComponents
-在页面或父组件中,可调用 `this.$selectComponent` `this.$selectAllComponents` 获取子组件实例对象。调用时需传入一个 [匹配选择器 selector](https://opendocs.alipay.com/mini/01og7z#selector%20%E8%AF%AD%E6%B3%95)。
+在页面或父组件中,可调用 `this.$selectComponent` 和 `this.$selectAllComponents` 获取子组件实例对象。调用时需传入一个 [匹配选择器 selector](https://opendocs.alipay.com/mini/01og7z#selector%20%E8%AF%AD%E6%B3%95)。
**示例:**
```javascript
Component({
methods: {
getChildComponent() {
- // 在 Component 中获取 class 为 .child-class 的第一个子组件实例,即子组件的 this
- const child = this.$selectComponent('.child-class');
+ // 在 Component 中获取 class 为 .child-class 的第一个子组件实例
+ const child = this.$selectComponent('.child-class');
console.log(child);
},
},
})
```
+
**说明:**
-- **组件隔离**:默认情况下,小程序与插件、不同插件之间无法通过 `$selectComponent` 获取组件实例,将返回 `null`。如果想在上述条件下仍然返回,可使用 [ref](https://opendocs.alipay.com/mini/framework/component-ref) 。
-- **组件顺序**:通俗理解为所见即顺序。以当前 axml 中第一个自定义组件为起点,先子组件,再兄弟组件;当使用跨组件后代选择器(>>>)时,会先在自定义组件内部查找,再从外部查找;相同的 [具名插槽](https://opendocs.alipay.com/mini/framework/component-template#%E5%85%B7%E5%90%8D%E6%8F%92%E6%A7%BD%20named%20slot) 会合并。
-- **组件数量**:只有实际渲染的自定义组件才能被查找到;当渲染多个 slot 插槽时,如果 slot 有自定义组件,也会查询到多份。
-- **兼容性**:基础库 2.8.0 起支持,可通过 `my.canIUse('component.$selectComponent')` 判断。
+- **组件隔离**:默认情况下,小程序与插件、不同插件之间无法通过 `$selectComponent` 获取组件实例,将返回 `null`。如果想在上述条件下仍然返回,可使用 [ref](https://opendocs.alipay.com/mini/framework/component-ref)。
+- **组件顺序**:通俗理解为所见即为顺序。以当前 AXML 中第一个自定义组件为起点,先处理子组件,再处理兄弟组件;当使用跨组件后代选择器(`>>>`)时,会先在自定义组件内部查找,再从外部查找;相同的 [具名插槽](https://opendocs.alipay.com/mini/framework/component-template#具名插槽%20named%20slot) 会被合并。
+- **组件数量**:只有实际渲染的自定义组件才能被查找到;当渲染多个 slot 插槽时,如果 slot 中有自定义组件,也将被查询到。
+- **兼容性**:基础库 2.8.0 及以上版本支持,你可以通过 `my.canIUse('component.$selectComponent')` 判断是否可用。
### createIntersectionObserver
**Native 渲染引擎**:暂不支持。
-
可用性判断:
+
+可用性判断:
```javascript
-my.canIUse('my.canIUse('component.createIntersectionObserver');');
+my.canIUse('component.createIntersectionObserver');
```
### createMediaQueryObserver
**Native 渲染引擎**:暂不支持。
-
可用性判断:
+
+可用性判断:
```javascript
my.canIUse('component.createMediaQueryObserver');
```
-在页面或自定义组件中,可调用`this.createMediaQueryObserver` 创建 [MediaQueryObserver](https://opendocs.alipay.com/mini/05bb9n) 实例,用于监听页面 media query 状态的变化。
+在页面或自定义组件中,可以调用 `this.createMediaQueryObserver` 创建 [MediaQueryObserver](https://opendocs.alipay.com/mini/05bb9n) 实例,用于监听页面 media query 状态的变化。
**示例:**
```javascript
@@ -268,7 +257,7 @@ Component({
didMount() {
const mediaQueryObserver = this.createMediaQueryObserver();
mediaQueryObserver.observe(
- {minWidth: 100},
+ { minWidth: 100 },
res => {
console.log(res.matches);
}
@@ -281,5 +270,4 @@ Component({
**说明:**
-- 需在 `didMount` 触发之后才可调用`this.createMediaQueryObserver`。因为`onInit` / `deriveDataFromProps` 触发时组件还未在视图层渲染完毕。
-
+- 需在 `didMount` 触发之后才可调用 `this.createMediaQueryObserver`。因为 `onInit` / `deriveDataFromProps` 触发时,组件还未在视图层渲染完毕。
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\346\250\241\346\235\277\345\222\214\346\240\267\345\274\217.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\346\250\241\346\235\277\345\222\214\346\240\267\345\274\217.md"
index 2418751e5..2903013fb 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\346\250\241\346\235\277\345\222\214\346\240\267\345\274\217.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\346\250\241\346\235\277\345\222\214\346\240\267\345\274\217.md"
@@ -4,7 +4,7 @@
## .axml 示例代码
-AXML 是自定义组件必选部分:
+AXML 是自定义组件的必选部分:
```html
@@ -24,12 +24,11 @@ Component({
});
```
-**注意**:与页面不同,用户自定义事件需要放到 methods 里面。
+**注意**:与页面不同,用户自定义的事件需要放到 `methods` 对象里面。
# 插槽 slot
-通过在组件 JS 中支持 props,自定义组件可以和外部调用者交互,接受外部调用者传来的数据,同时可以调用外部调用者传来的函数,通知外部调用者组件内部的变化。但是这样还不够,自定义组件还不够灵活。除了数据的处理与通知,小程序提供的 slot 使得自定义组件的 AXML 结构可以使用外部调用者传来的 AXML 组装。外部调用者可以传递 AXML 给自定义组件,自定义组件使用其组装出最终的组件 AXML 结构。
-
+自定义组件可以通过声明 props 来与外部调用者互动。这样,组件不仅能接受外部传递的数据,还能调用传入的函数,通知外部发生的变化。然而,这还不够灵活。除了数据的处理与通知,小程序提供的 `slot` 功能使自定义组件的 AXML 结构能够动态整合外部传递的 AXML。这样,调用者可以将 AXML 内容传递给组件,由组件整合出完整的 AXML 结构,提高了组件的灵活性。
## 默认插槽 default slot
示例代码:
@@ -44,9 +43,9 @@ Component({
```
-调用者不传递 axml,示例如下:
+调用者不传递 AXML,示例如下:
-```javascript
+```json
// /pages/index/index.json
{
"usingComponents": {
@@ -62,12 +61,12 @@ Component({
页面输出:
-```javascript
+```plain
default slot & default value
other
```
-调用者传递 axml,示例如下:
+调用者传递 AXML,示例如下:
```html
@@ -85,13 +84,12 @@ footer
other
```
-可以将 slot 理解为插槽,default slot 就是默认插槽,如果调用者在组件标签 `` 之间不传递 AXML,则渲染的是默认插槽。而如果调用者在组件标签 `` 之间传递有 AXML,则使用其替代默认插槽,进而组装出最终的 AXML 以供渲染。
-
+可以将 slot 理解为插槽,default slot 就是默认插槽。如果调用者在组件标签 `` 之间不传递 AXML,则渲染的是默认插槽中的内容。如果调用者在组件标签 `` 之间传递了 AXML,则使用这些 AXML 替代默认插槽的内容,从而组装出最终的 AXML 进行渲染。
## 具名插槽 named slot
default slot 只能传递一份 AXML。
-复杂的组件需要在不同位置渲染不同的 AXML,即需要传递多个 AXML,此时需要 named slot。 使用 named slot 后,外部调用者可以在自定义组件标签的子标签中指定要将哪一部分的 AXML 放入到自定义组件的哪个具名插槽中,而自定义组件标签的子标签中没有指定具名插槽的部分则会放入到默认插槽上。
+复杂的组件需要在不同位置渲染不同的 AXML,即需要传递多个 AXML,此时需要 named slot。使用 named slot 后,外部调用者可以在自定义组件标签的子标签中指定要将哪一部分的 AXML 放入到自定义组件的哪个具名插槽中,而自定义组件标签的子标签中没有指定具名插槽的部分则会放入到默认插槽上。
如果仅传递了具名插槽,则默认插槽不会被覆盖。
@@ -100,12 +98,12 @@ default slot 只能传递一份 AXML。
```html
-
- default slot & default value
-
-
- body
-
+
+ default slot & default value
+
+
+ body
+
```
@@ -114,14 +112,14 @@ default slot 只能传递一份 AXML。
```html
- header
- footer
+ header
+ footer
```
页面输出:
-```javascript
+```plain
default slot & default value
header
body
@@ -130,12 +128,12 @@ footer
传递具名插槽与默认插槽,示例如下:
-```HTML
+```html
- this is to default slot
- header
- footer
+ this is to default slot
+ header
+ footer
```
@@ -147,10 +145,9 @@ header
body
footer
```
-
## 作用域插槽 slot-scope
-通过使用 named slot ,自定义组件的 AXML 要么使用自定义组件的 AXML,要么使用外部调用者(例如页面)的 AXML。 使用自定义组件的 AXML,可以访问组件内部的数据,同时通过 props 属性,可以访问外部调用者的数据。
+通过使用命名插槽(named slot),自定义组件的 AXML 可以选择使用组件自身的 AXML 或外部调用者(如页面)的 AXML。若使用组件自身的 AXML,可以访问组件内部的数据;通过 props 属性,还可以访问外部调用者的数据。
示例代码:
@@ -168,8 +165,8 @@ Component({
```html
-component data: {{x}}
-page data: {{y}}
+组件数据:{{x}}
+页面数据:{{y}}
```
```javascript
@@ -186,12 +183,12 @@ Page({
页面输出:
-```javascript
-component data: 1
-page data: 2
+```plaintext
+组件数据:1
+页面数据:2
```
-自定义组件通过 slot 使用外部调用者(例如页面)的 axml 时,却只能访问外部调用者的数据。
+自定义组件通过 slot 使用外部调用者(如页面)的 AXML 时,只能访问外部调用者的数据。
示例代码:
@@ -199,7 +196,7 @@ page data: 2
- default slot & default value
+ 默认插槽和默认值
body
@@ -215,17 +212,17 @@ Page({
```html
- page data: {{y}}
+ 页面数据:{{y}}
```
页面输出:
```html
-page data: 2 body
+页面数据:2 body
```
-slot scope 使得插槽内容可以访问到组件内部的数据。
+slot scope 使得插槽内容能够访问组件内部的数据。
示例代码:
@@ -242,7 +239,7 @@ Component({
- default slot & default value
+ 默认插槽和默认值
body
@@ -259,29 +256,28 @@ Page({
- component data: {{props.x}}
- page data: {{y}}
+ 组件数据:{{props.x}}
+ 页面数据:{{y}}
```
页面输出:
-```plain
-component data: 1
-page data: 2
+```plaintext
+组件数据:1
+页面数据:2
body
```
-如上所示,自定义组件通过定义 slot 属性的方式暴露组件内部数据,页面使用组件时,通过 slot-scope 申明为作用域插槽,属性值定义临时变量名 props,即可访问到组件内部数据。
-
+如示例所示,自定义组件通过定义 slot 属性的方式暴露组件内部数据。页面在使用组件时,通过 slot-scope 声明作用域插槽,并用属性值定义临时变量名 props,即可访问到组件内部数据。
# ACSS
-和页面一样,自定义组件也可以定义自己的 ACSS 样式。ACSS 会自动被引入使用组件的页面,不需要页面手动引入。可查看 [acss 语法](https://opendocs.alipay.com/mini/framework/acss)。
+和页面一样,自定义组件也可以定义自己的 ACSS 样式。ACSS 会自动被引入使用组件的页面,不需要页面手动引入。可查看 [ACSS 语法](https://opendocs.alipay.com/mini/framework/acss)。
# 自定义组件样式隔离
-默认情况下,自定义组件的样式将对外产生影响。从基础库版本 [2.7.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始,可以在自定义组件的 JSON 文件中配置 styleIsolation,避免页面的样式影响到外部。例如:
+默认情况下,自定义组件的样式将对外产生影响。从基础库版本 [2.7.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始,可以在自定义组件的 JSON 文件中配置 `styleIsolation`,避免页面的样式影响到外部。例如:
```json
{
@@ -291,23 +287,21 @@ body
该选项支持以下取值:
-- `apply-shared` 表示 app.acss 样式以及其它(设置了 `shared` 的页面和其它自定义组件)的样式将影响到自定义组件,但自定义组件 acss 中指定的样式不会影响外部。
-- `shared`(默认)表示 app.acss 样式以及其它(设置了 `shared` 的页面和其它自定义组件)的样式将影响到页面,自定义组件 acss 中指定的样式也会影响到外部。
-
-
+- `apply-shared` 表示 `app.acss` 样式以及其它(设置了 `shared` 的页面和其它自定义组件)的样式将影响到自定义组件,但自定义组件 ACSS 中指定的样式不会影响外部。
+- `shared`(默认)表示 `app.acss` 样式以及其它(设置了 `shared` 的页面和其它自定义组件)的样式将影响到页面,自定义组件 ACSS 中指定的样式也会影响到外部。
# 非虚拟化组件节点
-默认情况下,自定义组件是“虚拟的”,即会展示自定义组件内部的第一层节点。但有些时候,开发者希望这个节点是一个“非虚拟化的”,使用时可以在这个节点设置 `id`、`class`、`style`,就如同一个基础组件。
这个时候,可以将该自定义组件设置为“非虚拟化”。支持基础库 2.8.0、IDE 3.2.3 及以上版本。
+默认情况下,自定义组件是“虚拟的”,即会展示自定义组件内部的第一层节点。但有些时候,开发者希望这个节点是一个“非虚拟化的”。使用时,可以在这个节点设置 `id`、`class`、`style`,就像一个基础组件一样。这时,可以将该自定义组件设置为“非虚拟化”。此特性支持基础库 2.8.0、IDE 3.2.3 及以上版本。
## 配置示例
-支持两种方式配置,同时 **js 的优先级高于 json**。
+支持两种配置方式,同时 js 的优先级高于 json。
```javascript
Component({
mixins: [],
options: {
- virtualHost: false,
+ virtualHost: false
},
- data: {},
-})
+ data: {}
+});
```
```json
{
@@ -318,12 +312,12 @@ Component({
```
```html
- 字体是蓝色的
+ 字体是蓝色的
```
## :host 选择器
-当开启 `virtualHost: false` 时,自定义组件可以使用 `:host` 选择器来指定该自定义组件的默认样式。支持基础库 2.8.0、IDE 3.2.3 及以上版本。
+当开启 `virtualHost: false` 时,自定义组件可以使用 `:host` 选择器来指定该自定义组件的默认样式。此特性支持基础库 2.8.0、IDE 3.2.3 及以上版本。
```css
:host {
color: red;
@@ -331,35 +325,35 @@ Component({
```
```html
- 字体是红色的
+ 字体是红色的
```
-
# 外部样式类
有时,组件希望接受外部传入的样式类。此时可以在 `Component` 中用 `externalClasses` 定义段定义若干个外部样式类。
基础库 [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始支持外部样式类。
-这个特性可以用于实现类似于 `view` 组件的 `hover-class` 属性:页面可以提供一个样式类,赋予 `view` 的 `hover-class`,这个样式类本身写在页面中而非 `view` 组件的实现中。
-
+这个特性可以用于实现类似于 `view` 组件的 `hover-class` 属性:页面可以提供一个样式类,赋予 `view` 的 `hover-class`,这个样式类本身写在页面中,而不是在 `view` 组件的实现中。
## 开启外部样式类
-由于开发者在开发跨平台小程序时可能已经设置了 `externalClasses` 字段,但其实之前会无效(在其它平台会生效)。
-为了避免产生非预期行为,故需要开发者显式开启外部样式类功能。
+由于开发者在开发跨平台小程序时可能已经设置了 `externalClasses` 字段,但之前该设置实际上是无效的(在其他平台会生效)。
+
+为了避免产生非预期行为,因此,需要开发者显式开启外部样式类功能。
-通过 Component 构造器的 `options` 配置项设置 `externalClasses: true` 开启。该功能仅在开启了[样式隔离](https://opendocs.alipay.com/mini/framework/component-template#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E6%A0%B7%E5%BC%8F%E9%9A%94%E7%A6%BB)的自定义组件当中生效。
+通过 Component 构造器的 `options` 配置项设置 `externalClasses: true`,可开启该功能。该功能仅在开启了[样式隔离](https://opendocs.alipay.com/mini/framework/component-template#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E6%A0%B7%E5%BC%8F%E9%9A%94%E7%A6%BB)的自定义组件中生效。
### 示例代码
+
```javascript
/* 组件 custom-component.js */
Component({
options: {
// 开启外部样式类功能
- externalClasses: true,
+ externalClasses: true
},
externalClasses: ['my-class']
-})
+});
```
```html
@@ -371,9 +365,9 @@ Component({
```html
-
-
-
+
+
+
```
```css
@@ -384,7 +378,6 @@ Component({
font-size: 1.5em;
}
```
-
# 使用示例
下面通过一个示例演示 component2 的使用,具体代码可查看 [component2-demo](https://github.com/ant-mini-program/component2-demo)。
@@ -393,31 +386,31 @@ Component({
// /pages/complex/complex.js
Page({
data: {
- count: 2,
+ count: 2
},
plus() {
this.setData({
- count: this.data.count + 1,
+ count: this.data.count + 1
});
- },
+ }
});
```
```html
{{item}}
+ 给 named slot 传递渲染的内容,并使用其传递的参数:
+ 1. 这里会匹配自定义组件中的 。
+ 2. 使用其传递的参数,即 c = {value: o.value}。
+ -->
{{c.value}}
count: {{count}}
@@ -430,15 +423,15 @@ Page({
Component({
data: {
o: {
- value: 'scope-value',
- },
+ value: 'scope-value'
+ }
},
onInit() {
// 组件创建时触发
console.log('i1 onInit', this.props, this.data);
},
deriveDataFromProps(nextProps) {
- // 组件创建时触发或更新时触发
+ // 组件更新时触发
console.log('i1 deriveDataFromProps', nextProps, this.props, this.data);
},
didMount() {
@@ -456,8 +449,8 @@ Component({
methods: {
change() {
this.setData({ 'o.value': 'changed-scope-value' });
- },
- },
+ }
+ }
});
```
@@ -471,53 +464,52 @@ export default function addOne(value) {
```html
+ named slot:具名插槽
+ 1. 通过 name 与使用者传入内容的一一匹配。
+ 2. 如果匹配不到,会默认渲染 default。
+ 详见:/mini/framework/component-template#axml
+ -->
default
+ named slot:具名插槽
+ 1. 这里同样是一个具名插槽,同时会传递一些参数给使用者。
+ 2. 对于本示例,会传递 {value: o.value} 给使用者。
+ 详见:/mini/framework/component-template#axml
+ -->
```
-本示例在 page 中 使用自定义组件 i1,并使用了小程序框架提供的如下关键技术:
+本示例在 page 中使用自定义组件 i1,并使用了小程序框架提供的以下关键技术:
- 自定义组件体系 component2。
-- axml 支持灵活的使用 slot。
+- axml 支持使用 slot。
- axml 中使用 sjs。
本示例初始渲染内容如下:
- 控制台会依次打印:
+ 控制台依次打印:
```plain
i1 onInit
@@ -525,11 +517,11 @@ i1 deriveDataFromProps
i1 didMount
```
-**说明**:自定义组件创建阶段依次触发: `onInit`、`deriveDataFromProps`、`didMount` 生命周期。
+**说明**:自定义组件创建阶段依次触发:`onInit`、`deriveDataFromProps`、`didMount` 生命周期。
-当点击 `count+` button 的时候,页面渲染如下:
+当点击 `count+` 按钮时,页面渲染如下:
-
+
控制台依次打印:
@@ -538,14 +530,14 @@ i1 deriveDataFromProps
i1 didUpdate
```
-**说明:**
+**说明**:
-- 自定义组件更新阶段依次触发: deriveDataFromProps、didUpdate 生命周期。
-- 外部 props 变化会触发 deriveDataFromProps。
+- 自定义组件更新阶段依次触发:`deriveDataFromProps`、`didUpdate` 生命周期。
+- 外部 props 变化会触发 `deriveDataFromProps`。
点击 **change scope slot value** 按钮时,页面渲染如下:
-
+
控制台依次打印:
@@ -555,7 +547,6 @@ i1 didUpdate
```
**说明**:自定义组件 data 变化也会触发 `deriveDataFromProps`。
-
# 相关文档
- [acss 语法](https://opendocs.alipay.com/mini/framework/acss)
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\351\205\215\347\275\256.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\351\205\215\347\275\256.md"
index f9f5194c1..b8de28264 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\351\205\215\347\275\256.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\351\205\215\347\275\256.md"
@@ -1,4 +1,4 @@
-在 `[componentName].json` 中声明自定义组件。如果该自定义组件还依赖了其它组件,则还需要额外声明依赖哪些自定义组件。
+在 `[componentName].json` 中声明自定义组件。如果该自定义组件还依赖了其他组件,则还需要额外声明依赖哪些自定义组件。
```json
{
@@ -8,11 +8,12 @@
}
}
```
+(必须在自定义组件的 `json` 文件中声明组件是自定义组件,并设置 `component` 为 `true`。如果自定义组件依赖其他组件,需要在 `usingComponents` 中声明依赖的自定义组件的路径。)
# 参数
-| **参数** | **类型** | **必填** | **说明** |
-| --- | --- | --- | --- |
-| component | Boolean | 是 | 声明是自定义组件。 |
-| usingComponents | Object | 否 | 声明依赖的自定义组件所在路径: 项目绝对路径以 `/` 开头,相对路径以 `./` 或者 `../` 开头。 |
-| styleIsolation | String | 否 | 基础库版本 [2.7.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 支持。设置样式隔离表现。该选项支持以下值:
- `apply-shared` 表示 app.acss 样式以及其它(设置了 `shared` 的页面和其它自定义组件)的样式将影响到自定义组件,但自定义组件 acss 中指定的样式不会影响外部。
- `shared`(默认)表示 app.acss 样式以及其它(设置了 `shared` 的页面和其它自定义组件)的样式将影响到页面,自定义组件 acss 中指定的样式也会影响到外部。
|
+| 参数 | 类型 | 必填 | 说明 |
+| ---------- | ------- | ---- | --------------------------------------------------------------------------------------------------------- |
+| component | Boolean | 是 | 声明是自定义组件。 |
+| usingComponents | Object | 否 | 声明依赖的自定义组件所在路径:项目绝对路径以 `/` 开头,相对路径以 `./` 或者 `../` 开头。 |
+| styleIsolation | String | 否 | 基础库版本 [2.7.2](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 支持。设置样式隔离表现。选项支持的取值有:
- `apply-shared` 表示仅 app.acss 样式以及被设置为 `shared` 的页面或自定义组件的样式会影响到自定义组件,自定义组件的 acss 样式不会影响到外部;
- `shared` 表示 app.acss 样式以及被设置为 `shared` 的页面或自定义组件的样式会影响到外部,自定义组件的 acss 样式也会影响到外部。默认值为 `shared`。 |
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\351\227\264\345\205\263\347\263\273.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\351\227\264\345\205\263\347\263\273.md"
index a29f992c1..4b824833c 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\351\227\264\345\205\263\347\263\273.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\347\273\204\344\273\266\351\227\264\345\205\263\347\263\273.md"
@@ -1,4 +1,5 @@
-对于有相互关系的自定义组件而言,互相感知与通信往往比较复杂,基于此种情况引入了 `relations` 的定义,可以方便的解决此类问题。
如下:`custom-form``custom-input``custom-button` 均为自定义组件,可通过以下示例代码来建立它们之间的关系。
+对于有相互关系的自定义组件而言,互相感知与通信往往比较复杂。基于此种情况,引入了 `relations` 的定义,它可以方便地解决此类问题。例如,`custom-form`、`custom-input` 和 `custom-button` 均为自定义组件,可通过以下示例代码来建立它们之间的关系。
+
```html
@@ -6,22 +7,21 @@
```
## 功能要求
-基础库 [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始支持,若版本较低,建议采取 [兼容处理](https://opendocs.alipay.com/mini/framework/compatibility)。可通过 `my.canIUse('component.relations')` 进行判断。
同时需要在自定义组件构造器中显式开启。
+基础库版本 [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始支持该功能。如果你使用的版本较低,建议采取[兼容处理](https://opendocs.alipay.com/mini/framework/compatibility)。你可以通过执行 `my.canIUse('component.relations')` 来判断是否支持。同时需要在自定义组件构造器中显式开启,如下所示:
+
```javascript
Component({
- options: {
+ options: {
// 启用组件间关系定义段
- relations: true,
- },
+ relations: true
+ }
})
```
-
-## 路径关联
```javascript
// custom-form.js
Component({
relations: {
- './custom-input': {
+ './custom-input': {
type: 'child',
linked(target) {
// 每次有 input 插入时(attached 生命周期之后)执行,target 是 input 节点实例
@@ -31,58 +31,42 @@ Component({
},
unlinked(target) {
// 每次有 input 移除时(detached 生命周期之后)执行,target 是 input 节点实例
- },
- },
+ }
+ }
},
ready() {
// 同时提供 getRelationNodes 可查询当前定义的有序关系数组
console.log(this.getRelationNodes('./custom-input'));
- },
-})
-// custom-input.js
-Component({
- relations: {
- './custom-form': {
- type: 'parent',
- linked(target) {
- // 每到插入到 form 时(attached 生命周期之后)执行,target 是 from 节点实例
- },
- linkChanged(target) {
- // 每次移动后(moved 生命周期之后)执行,target 是 from 节点实例
- },
- unlinked(target) {
- // 每次移除时(detached 生命周期之后)执行,target 是 from 节点实例
- },
- },
- },
-})
-```
-```javascript
+ }
+});
+
// custom-input.js
Component({
relations: {
- './custom-form': {
+ './custom-form': {
type: 'parent',
linked(target) {
- // 每到插入到 form 时(attached 生命周期之后)执行,target 是 from 节点实例
+ // 每次插入到 form 时(attached 生命周期之后)执行,target 是 form 节点实例
},
linkChanged(target) {
- // 每次移动后(moved 生命周期之后)执行,target 是 from 节点实例
+ // 每次移动后(moved 生命周期之后)执行,target 是 form 节点实例
},
unlinked(target) {
- // 每次移除时(detached 生命周期之后)执行,target 是 from 节点实例
- },
- },
- },
-})
+ // 每次移除时(detached 生命周期之后)执行,target 是 form 节点实例
+ }
+ }
+ }
+});
```
-**注意:**
+**注意**:
- 需要两个组件都定义 relations 才能建立关系。
- parent 只能与 child 建立关系,ancestor 只能与 descendant 建立关系。
## Mixin 关联
-当 input 使用了某个 Mixin 时,也可以使用这个 Mixin 来代替路径建立关系。
+
+当 `input` 使用了某个 Mixin 时,也可以使用这个 Mixin 来代替路径建立关系。
+
```javascript
// custom-mixin.js
const defaultMix = Mixin({
@@ -90,37 +74,39 @@ const defaultMix = Mixin({
});
export default defaultMix;
```
+
```javascript
// custom-input.js
import defaultMix from './custom-mixin';
Component({
mixins: [defaultMix],
relations: {
- './custom-form': {
+ './custom-form': {
type: 'ancestor',
},
},
-})
+});
```
+
```javascript
// custom-form.js
import defaultMix from './custom-mixin';
Component({
relations: {
- './custom-input': {
+ './custom-input': {
type: 'descendant',
target: defaultMix,
},
},
-})
+});
```
## relations 定义段
-| **名称** | **类型** | **必填** | **说明** |
-| --- | --- | --- | --- |
-| type | String | 是 | 与目标组件的相对关系。
**可选值:** parent child ancestor descendant。 |
-| linked | Function | 否 | 目标组件建立时触发,触发时机在组件 attached 生命周期之后。 |
-| linkChanged | Function | 否 | 目标组件移动时触发,触发时机在组件 moved 生命周期之后。 |
-| unlinked | Function | 否 | 目标组件销毁时触发,触发时机在组件 detached 生命周期之后。 |
-| target | String | 否 | 根据组件使用的 Mixin 来建立关系。 |
+| 名称 | 类型 | 必填 | 说明 |
+| ------------ | -------- | ---- | ------------------------------------------------------------ |
+| type | String | 是 | 与目标组件的相对关系。
可选值:`parent`、`child`、`ancestor`、`descendant`。 |
+| linked | Function | 否 | 当与目标组件建立关系时触发,触发时机在组件的 `attached` 生命周期之后。 |
+| linkChanged | Function | 否 | 当与目标组件的关系变动时触发,触发时机在组件的 `moved` 生命周期之后。 |
+| unlinked | Function | 否 | 当与目标组件解除关系时触发,触发时机在组件的 `detached` 生命周期之后。 |
+| target | String | 否 | 根据组件使用的 Mixin 来建立关系。 |
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\344\273\213\347\273\215.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\344\273\213\347\273\215.md"
index 18f640718..17087fe99 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\344\273\213\347\273\215.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\344\273\213\347\273\215.md"
@@ -1,58 +1,57 @@
-自定义组件功能可将需要复用的功能模块抽象成自定义组件,从而在不同页面中复用,更可以将自定义组件发布到 NPM 上,从而在不同小程序中进行复用,NPM 的使用可查看 [NPM 包管理](https://opendocs.alipay.com/mini/ide/npm-manage)。
+自定义组件功能可以让开发者将需要复用的功能模块抽象为自定义组件,以便在不同页面中复用。开发者甚至可以将自定义组件发布到 NPM 上,实现在不同小程序中的复用。关于 NPM 的使用,可以查看 [NPM 包管理](https://opendocs.alipay.com/mini/ide/npm-manage)。
# 使用须知
-小程序基础库从 **1.7.0** 版本开始支持自定义组件功能。 通过调用 [my.canIUse('component')](https://opendocs.alipay.com/mini/api/can-i-use) 可判断自定义组件功能是否可在当前版本使用;从 **1.14.0** 版本开始,自定义组件有了较大改动,支持 component2 相关功能,通过调用 [my.canIUse('component2')](https://opendocs.alipay.com/mini/api/can-i-use)可判断新自定义组件功能是否可在当前版本使用,component2 相关功能如下:
+小程序基础库从 **1.7.0** 版本开始支持自定义组件功能。通过调用 [my.canIUse('component')](https://opendocs.alipay.com/mini/api/can-i-use) 可判断当前版本是否支持自定义组件功能;从 **1.14.0** 版本开始,自定义组件功能进行了较大改动,增加了对 component2 相关功能的支持,可以通过调用 [my.canIUse('component2')](https://opendocs.alipay.com/mini/api/can-i-use) 判断新自定义组件功能是否可用。component2 相关功能包括:
-- 新增 `onInit`、`deriveDataFromProps` [生命周期函数](https://opendocs.alipay.com/mini/framework/component-lifecycle) 。
-- 支持使用 `ref` [获取自定义组件实例](https://opendocs.alipay.com/mini/framework/component-ref) 。
+- 新增 `onInit`、`deriveDataFromProps` [生命周期函数](https://opendocs.alipay.com/mini/framework/component-lifecycle)。
+- 支持使用 `ref` [获取自定义组件实例](https://opendocs.alipay.com/mini/framework/component-ref)。
-使用 component2 的相关功能,需要在 IDE 中的 **详情** > **项目配置** 中,勾选 **启用 component2 编译** 。
+要使用 component2 的相关功能,需要在 IDE 中的 **详情** > **项目配置** 中勾选 **启用 component2 编译**。
-
+
# 创建并使用自定义组件
-与 `Page` 类似,自定义组件也由 `axml`、`js`、`json`、`acss` 四个部分组成。
+与 `Page` 类似,自定义组件也是由 `axml`、`js`、`json`、`acss` 四个部分组成。
创建并使用自定义组件有以下 4 个步骤:
1. 新建自定义组件文件夹。
2. 在 `.json` 文件中声明自定义组件。
-3. 使用 `Component` 函数,注册自定义组件。
+3. 使用 `Component` 函数注册自定义组件。
4. 使用自定义组件。
-以下讲述如何创建最基本的自定义组件。
+以下详细讲述如何创建最基本的自定义组件。
## 新建自定义组件文件夹
-打开一个现有项目中(或者在 IDE 中,新建一个官方提供的 `blank` 项目),在 IDE 左侧文件树先新建一个 `components` 文件夹,用于存放所有组件,文件夹名字可以任意修改。在 `components` 文件夹的右击菜单中,选择**新建小程序组件**,输入组件名(例如 `index`,以下示例均以组件名 `index` 为例),IDE 会自动生成自定义组件所需的几个文件,如下所示:
+打开一个现有项目(或者在 IDE 中新建一个官方提供的 `blank` 项目),在 IDE 左侧的文件树中先新建一个 `components` 文件夹,用于存放所有组件,文件夹名称可以自定义。在 `components` 文件夹右键菜单中选择“新建小程序组件”,输入组件名(例如 `index`,以下示例均以组件名 `index` 为例)。IDE 将自动生成自定义组件所需的几个文件,如下图所示:
-
+
-
+
-
+
## 声明自定义组件
-组件配置文件 `index.json` 用于声明当前目录是个自定义组件。
+组件的配置文件 `index.json` 用于声明当前目录是一个自定义组件。
-```javascript
+```json
// /components/index/index.json
{
"component": true
}
```
-
## 注册自定义组件
-组件注册 `index.js` 用于注册一个组件对象。
+组件注册的 `index.js` 文件用于注册一个组件对象。
```javascript
// /components/index/index.js
Component({
- mixins: [], // mixins 方便复用代码
+ mixins: [], // Mixins 方便复用代码
data: { x: 1 }, // 组件内部数据
props: { y: 1 }, // 可给外部传入的属性添加默认值
didMount() {}, // 生命周期函数
@@ -61,22 +60,21 @@ Component({
methods: {
// 自定义方法
handleTap() {
- this.setData({ x: this.data.x + 1 }); // 可使用 setData 改变内部属性
+ this.setData({ x: this.data.x + 1 }); // 使用 setData 改变内部数据
},
},
});
```
-组件模板 `index.axml` 和组件样式 `index.acss`(可选):定义组件模板和样式。其中,样式文件可选。
+组件的模板文件 `index.axml` 和组件样式 `index.acss`(可选)负责定义组件的模板和样式,其中,样式文件可以不写。
```html
HI, My Component
```
-
## 使用自定义组件
-声明好一个组件后,即可在其它页面上使用。
+声明好一个组件后,即可在其他页面上使用。
先在页面配置中说明要使用哪个自定义组件,主要指定组件标签名字和组件所在路径。
@@ -92,7 +90,7 @@ Component({
然后在页面中引用组件即可。
```html
-
+
this is a blank page
```
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\345\270\270\350\247\201\351\227\256\351\242\230.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\345\270\270\350\247\201\351\227\256\351\242\230.md"
index 92b591a0e..9cf69bdc3 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\345\270\270\350\247\201\351\227\256\351\242\230.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\345\270\270\350\247\201\351\227\256\351\242\230.md"
@@ -1,6 +1,6 @@
### Q:小程序报错 worker render components is not sync,如何解决?
-A:请升级 [小程序基础库 2.0](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2),如果无法升级到基础库 2.0 且当前是非插件小程序,可以尝试关闭 component2(在小程序开发者工具(IDE)中的 **详情** > **项目配置** 中,取消勾选 **component2**)。
+A:请升级到 [小程序基础库 2.0](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2)。如果无法升级且当前小程序不是插件,可以尝试关闭 component2 (在小程序开发者工具(IDE)中的 **详情** > **项目配置** 中,取消勾选 **component2**)。
### Q:为什么自定义组件影响到其它组件,导致页面混乱?
@@ -8,72 +8,72 @@ A:组件命名时不要重名。
### Q:自定义组件中,父组件和子组件之间,如何相互调用传值?
-A:在小程序 page 页面,自定义组件可以通过 this.$page 拿到小程序页面实例,然后将组件实例挂载到小程序页面实例上进行相互调用。
+A:在小程序 page 页面,自定义组件可以通过 `this.$page` 拿到小程序页面实例,然后将组件实例挂载到小程序页面实例上进行相互调用。
1. 将父组件、子组件分别挂载到所属页面实例上。
```javascript
// 父组件 - /component/fu/fu.js
didMount() {
- this.$page.fu = this; // 通过此操作可以将组件实例挂载到所属页面实例上
+ this.$page.fu = this; // 通过此操作可以将组件实例挂载到所属页面实例上
},
```
```javascript
// 子组件 - /component/zi/zi.js
didMount() {
- this.$page.zi = this; // 通过此操作可以将组件实例挂载到所属页面实例上
+ this.$page.zi = this; // 通过此操作可以将组件实例挂载到所属页面实例上
},
```
-2. 通过页面实例实现相互调用。
小程序页面调用父组件、子组件方法:
+2. 通过页面实例实现相互调用。
+小程序页面调用父组件、子组件方法:
```javascript
// 调用组件内 method 方法
this.zi.zimethod();
this.fu.fumethod();
-// 更改组件内data值
+// 更改组件内 data 值
this.fu.setData({
- test: '123',
+ test: '123'
});
this.zi.setData({
- test: '123',
+ test: '123'
});
```
父组件调用子组件内方法:
```javascript
-// 调用子组件method方法
+// 调用子组件 method 方法
this.$page.zi.zimethod();
-// 更改子组件内data值
+// 更改子组件内 data 值
this.$page.zi.setData({
- test: '123',
+ test: '123'
});
```
-子组件调用父组件内方法 :
+子组件调用父组件内方法:
```javascript
-// 调用父组件method方法
+// 调用父组件 method 方法
this.$page.fu.zimethod();
-// 更改父组件内data值
+// 更改父组件内 data 值
this.$page.fu.setData({
- test: '123',
+ test: '123'
});
```
+### Q:自定义组件如何通过 props 进行传值?
-### Q:自定义组件如何要通过 props 进行传值?
+A:可查看[组件对象](https://opendocs.alipay.com/mini/framework/component_object)。
-A:可查看 [组件对象](https://opendocs.alipay.com/mini/framework/component_object)。
+### Q:模板 `template` 里可以使用自定义组件吗?
-### Q:模板 template 里可以使用自定义组件吗?
+A:不可以在模板 `template` 中使用自定义组件。模板能创建成功,自定义组件不会生效。
-A:不可以在模板 template 中使用自定义组件。模板能创建成功,自定义组件不会生效。
+### Q:模板 `template` 里 `data` 参数的类型为布尔值时,为什么获取不到值?
-### Q:模板 template 里 data 参数的类型为布尔值时,为什么获取不到值?
-
-A:IDE 版本过低,请升级,可查看 [下载](https://opendocs.alipay.com/mini/ide/download)。
+A:IDE 版本过低,请升级。可查看[下载](https://opendocs.alipay.com/mini/ide/download)。
### Q:子组件能不能监听父组件参数的变化?
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\346\211\251\345\261\225.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\346\211\251\345\261\225.md"
index ff9504dee..7fa38ee70 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\346\211\251\345\261\225.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266\346\211\251\345\261\225.md"
@@ -1,43 +1,45 @@
-为了更好定制自定义组件的功能,可以使用自定义组件扩展机制。
+为了更好地定制自定义组件的功能,可以使用自定义组件扩展机制。
## 版本要求
-基础库 [2.8.2](https://opendocs.alipay.com/mini/framework/lib) 版本开始支持。
+基础库 `2.8.2` 版本开始支持。请点击[这里](https://opendocs.alipay.com/mini/framework/lib)查看详细信息。
## 扩展后的效果
为了更好地理解自定义组件扩展,可查看如下示例:
如果想修改或者消费定义段(自定义组件构造器参数),通常需要提供一个函数在组件注册前进行处理,并返回处理后的定义段。
+
```typescript
// 没有使用自定义组件扩展
const wrap4Observers = function(defFields) {
- if (my.canIUse('component.observers') === true) {
- defFields.options = options.options || {};
+ if (my.canIUse('component.observers') === true) {
+ defFields.options = defFields.options || {};
defFields.options.observers = true;
} else {
- // 当前基础库不支持observers,自己pollyfill
- // pollyfill observers
+ // 当前基础库不支持 observers,自己实现相应功能
+ // polyfill observers
}
return defFields;
-}
+};
-// 使用 wrap4Observers 函数 对 options 做加工
+// 使用 wrap4Observers 函数对 options 做加工
Component(wrap4Observers({
observers: {
'**': function(val) {
// ...
}
}
-}))
+}));
```
+
通过自定义组件扩展,可以改为这样:
+
```typescript
const observersMixin = Mixin({
definitionFilter(defFields) {
- // 当前基础库支持observers
if (my.canIUse('component.observers') === true) {
- defFields.options = options.options || {};
+ defFields.options = defFields.options || {};
defFields.options.observers = true;
} else {
- // 当前基础库不支持observers,自己pollyfill
- // pollyfill observers
+ // 当前基础库不支持 observers,自己实现相应功能
+ // polyfill observers
}
}
});
@@ -51,10 +53,12 @@ Component({
},
})
```
-通过示例可以发现,自定义组件的扩展其实就是提供在自定义组件注册阶段修改其定义段的能力,上述示例就是修改了自定义组件中的 options 定义段里的内容。
+通过示例可以发现,自定义组件的扩展其实就是提供在自定义组件注册阶段修改其定义段的能力。上述示例就是修改了自定义组件中的 options 定义段里的内容。
## 使用扩展
-`Mixin()` 构造器对比普通的 `mixin` JS 对象提供了新的定义段 `definitionFilter`,用于支持自定义组件扩展。`definitionFilter` 是一个函数,在被调用时会注入两个参数,第一个参数是使用该 mixin 的 `Component`/`Mixin` 的定义对象(构造器参数),第二个参数是该 mixin 通过 mixins 定义段所使用的 mixin 的 `definitionFilter` 函数列表。
+
+`Mixin()` 构造器相比普通的 `mixin` JS 对象,提供了一个新的定义段 `definitionFilter`,用于支持自定义组件扩展。`definitionFilter` 是一个函数,当被调用时会注入两个参数:第一个参数是使用该 `mixin` 的 `Component`/`Mixin` 的定义对象(构造器参数),第二个参数是该 `mixin` 通过 `mixins` 定义段所使用的 `mixin` 的 `definitionFilter` 函数列表。
+
```typescript
// mixin3
const mixin3 = Mixin({
@@ -77,13 +81,14 @@ Component({
mixins: [mixin1],
})
```
-上述代码中注册了1个自定义组件和3个 Mixin,每个 Mixin 都使用了 `definitionFilter` 定义段。根据 `Component` 和 `Mixin` 中的 `mixins` 参数值(引用关系)会有以下事情发生:
-1. 由于 mixin2 引用了 mixin3,当注册 mixin2 时会调用 mixin3 的 `definitionFilter` 函数,其中 `defFields` 参数是 mixin2 的定义段,`definitionFilterArr` 参数为 `undefined`,因为 mixin3 没有通过 mixins 参数使用其它的 mixin。
-2. 由于 mixin1 引用了 mixin2,当注册 mixin1 时会调用 mixin2 的 `definitionFilter` 函数,其中 `defFields` 参数是 mixin1 的定义段,`definitionFilterArr` 参数为长度为 1 的数组,`definitionFilterArr[0]` 即 mixin3 的 `definitionFilter`,因为 mixin2 使用了mixin3。用户在此可以自行决定在注册 mixin1 时是否调用 mixin3 的 `definitionFilter`。如果需要调用,在此处补充代码 `definitionFilterArr[0](defFields)` 即可,`definitionFilterArr` 参数(若有)则会由基础库补充传入。
-3. 同理,在注册 Component 时,会调用 mixin1 的 `definitionFilter` 函数。
+上述代码中,注册了 1 个自定义组件和 3 个 `Mixin`,每个 `Mixin` 都使用了 `definitionFilter` 定义段。根据 `Component` 和 `Mixin` 中的 `mixins` 参数值(引用关系),会有以下事情发生:
+
+1. 由于 `mixin2` 引用了 `mixin3`,当注册 `mixin2` 时会调用 `mixin3` 的 `definitionFilter` 函数。其中,`defFields` 参数是 `mixin2` 的定义段,`definitionFilterArr` 参数为 `undefined`,因为 `mixin3` 没有通过 `mixins` 参数使用其他 `mixin`。
+2. 由于 `mixin1` 引用了 `mixin2`,当注册 `mixin1` 时会调用 `mixin2` 的 `definitionFilter` 函数。其中,`defFields` 参数是 `mixin1` 的定义段,`definitionFilterArr` 参数为长度为 1 的数组,`definitionFilterArr[0]` 是 `mixin3` 的 `definitionFilter`,因为 `mixin2` 使用了 `mixin3`。此时,用户可以自行决定在注册 `mixin1` 时是否调用 `mixin3` 的 `definitionFilter`。如果需要调用,此处补充代码 `definitionFilterArr[0](defFields)` 即可,`definitionFilterArr` 参数(若有)则会由基础库补充传入。
+3. 同理,在注册 `Component` 时,会调用 `mixin1` 的 `definitionFilter` 函数。
简单概括:
-- `definitionFilter` 函数可以理解为当 A 使用了 B 时,在注册 A 的时刻就会调用 B 的 `definitionFilter` 函数并传入 A 的定义对象让 B 进行处理。
-- 此时,如果 B 还使用了 C 和 D,那么 B 可以自行决定要不要调用 C 和 D 的 `definitionFilter` 函数去处理 A 的定义对象。
+- `definitionFilter` 函数可以理解为,当 `A` 使用了 `B` 时,在注册 `A` 的时刻就会调用 `B` 的 `definitionFilter` 函数,并传入 `A` 的定义对象让 `B` 进行处理。
+- 若 `B` 还使用了 `C` 和 `D`,`B` 可以自行决定是否调用 `C` 和 `D` 的 `definitionFilter` 函数处理 `A` 的定义对象。
diff --git "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\216\267\345\217\226\346\233\264\346\226\260\346\200\247\350\203\275\347\273\237\350\256\241\344\277\241\346\201\257.md" "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\216\267\345\217\226\346\233\264\346\226\260\346\200\247\350\203\275\347\273\237\350\256\241\344\277\241\346\201\257.md"
index 678c31e34..5d352ac87 100644
--- "a/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\216\267\345\217\226\346\233\264\346\226\260\346\200\247\350\203\275\347\273\237\350\256\241\344\277\241\346\201\257.md"
+++ "b/mini/framework/\350\207\252\345\256\232\344\271\211\347\273\204\344\273\266/\350\216\267\345\217\226\346\233\264\346\226\260\346\200\247\350\203\275\347\273\237\350\256\241\344\277\241\346\201\257.md"
@@ -1,4 +1,4 @@
-如果想要知道 setData 引发界面更新的开销,可以使用更新性能统计信息接口。它将返回每次更新中主要更新步骤发生的时间戳,可以用来大体上估计自定义组件(或页面)更新性能。
+如果想要知道 `setData` 引发界面更新的开销,可以使用更新性能统计信息接口。它将返回每次更新中主要更新步骤发生的时间戳,可以用来大体上估计自定义组件(或页面)更新性能。
# 版本要求
基础库 [2.8.5](https://opendocs.alipay.com/mini/framework/lib-upgrade-v2) 开始支持,若版本较低,建议采取 [兼容处理](https://opendocs.alipay.com/mini/framework/compatibility)。
@@ -10,51 +10,47 @@
```javascript
Component({
onInit() {
- this.setUpdatePerformanceListener({withDataPaths: true}, (res) => {
+ this.setUpdatePerformanceListener({ withDataPaths: true }, (res) => {
console.log(res)
})
}
})
```
-
## 入参
-setUpdatePerformanceListener 方法接受一个 options 对象和回调函数 listener 作为参数。
+`setUpdatePerformanceListener` 方法接受一个 `options` 对象和回调函数 `listener` 作为参数。
### Object options
-| **属性** | **类型** | **说明** |
+| 属性 | 类型 | 说明 |
| --- | --- | --- |
-| withDataPaths | Boolean | 是否返回变更的 data 字段信息。 |
-
+| withDataPaths | Boolean | 是否返回变更的 `data` 字段信息。 |
### Function listener
-listener 回调携带一个 res 对象,表示一批由 setData 引发的更新过程。根据 setData 调用时机的不同,更新过程大体可以分为三类:
+`listener` 回调携带一个 `res` 对象,表示一批由 `setData` 引发的更新过程。根据 `setData` 调用时机的不同,更新过程大体可以分为三类:
-- **基本更新:** 一个批次内调用的所有 setData,有一个唯一的 updateProcessId。
-- **子更新:** 它是另一个基本更新的一个子步骤,也有唯一的 updateProcessId ,但还有一个 parentUpdateProcessId。
+- **基本更新:** 一个批次内调用的所有 `setData`,有一个唯一的 `updateProcessId`。
+- **子更新:** 它是另一个基本更新的一个子步骤,也有唯一的 `updateProcessId`,但还有一个 `parentUpdateProcessId`。
- **被合并更新:** 它被合并到了另一个基本更新或子更新过程中,无法被独立统计。
-每一个成功的基本更新,都会使得 listener 回调一次。不过 setData 究竟触发了哪类更新过程很难判断,更新性能好坏与其具体是哪类更新也没有必然联系,只是它们的返回值参数有所不同。具体返回值如下:
+每一个成功的基本更新,都会使得 `listener` 回调一次。不过 `setData` 究竟触发了哪类更新过程很难判断,更新性能好坏与其具体是哪类更新也没有必然联系,只是它们的返回值参数有所不同。具体返回值如下:
-| **字段** | **类型** | **说明** |
+| 字段 | 类型 | 说明 |
| --- | --- | --- |
-| updateProcessId | Number | 一个批次内收集到的 data 数据,分配一个更新过程的 ID。 |
+| updateProcessId | Number | 一个批次内收集到的 `data` 数据,分配一个更新过程的 ID。 |
| parentUpdateProcessId | Number | 对于子更新,返回它所属的更新过程 ID。 |
-| isMergedUpdate | Boolean | 是否是被合并更新,如果是,则 updateProcessId 表示被合并到的更新过程 ID。 |
-| dataPaths | Array | 此次更新的 data 字段信息,只有 withDataPaths 设为 true 时才会返回。 |
-| dataList | Array