• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# JS语法参考
2
3JS文件用来定义HML页面的业务逻辑,支持ECMA规范的JavaScript语言。基于JavaScript语言的动态化能力,可以使应用更加富有表现力,具备更加灵活的设计能力。下面讲述JS文件的编译和运行的支持情况。
4
5
6## 语法
7
8支持ES6语法。
9
10- 模块声明
11  使用import方法引入功能模块:
12
13  ```js
14  import router from '@ohos.router';
15  ```
16
17- 代码引用
18  使用import方法导入js代码:
19
20  ```js
21  import utils from '../../common/utils.js';
22  ```
23
24
25## 对象
26
27- 应用对象
28  | 属性 | 类型   | 描述                                                         |
29  | ---- | ------ | ------------------------------------------------------------ |
30  | $def | Object | 使用this.$app.$def获取在app.js中暴露的对象。<br/>> **说明:**<br/>>&nbsp;应用对象不支持数据绑定,需主动触发UI更新。 |
31
32  示例代码
33
34  ```js
35  // app.js
36  export default {
37    onCreate() {
38      console.info('Application onCreate');
39    },
40    onDestroy() {
41      console.info('Application onDestroy');
42    },
43    globalData: {
44      appData: 'appData',
45      appVersion: '2.0',
46    },
47    globalMethod() {
48      console.info('This is a global method!');
49      this.globalData.appVersion = '3.0';
50    }
51  };
52  ```
53
54  ```js
55  // index.js页面逻辑代码
56  export default {
57    data: {
58      appData: 'localData',
59      appVersion:'1.0',
60    },
61    onInit() {
62      this.appData = this.$app.$def.globalData.appData;
63      this.appVersion = this.$app.$def.globalData.appVersion;
64    },
65    invokeGlobalMethod() {
66      this.$app.$def.globalMethod();
67    },
68    getAppVersion() {
69      this.appVersion = this.$app.$def.globalData.appVersion;
70    }
71  }
72  ```
73
74- 页面对象
75  | 属性       | 类型              | 描述                                       |
76  | -------- | --------------- | ---------------------------------------- |
77  | data     | Object/Function | 页面的数据模型,类型是对象或者函数,如果类型是函数,返回值必须是对象。属性名不能以$或_开头,不要使用保留字for,&nbsp;if,&nbsp;show,&nbsp;tid。<br/>data与private和public不能重合使用。 |
78  | $refs    | Object          | 持有注册过ref&nbsp;属性的DOM元素或子组件实例的对象。示例见[获取DOM元素](#获取dom元素)。 |
79  | private  | Object          | 页面的数据模型,private下的数据属性只能由当前页面修改。          |
80  | public   | Object          | 页面的数据模型,public下的数据属性的行为与data保持一致。        |
81  | props    | Array/Object    | props用于组件之间的通信,可以通过&lt;tag&nbsp;xxxx='value'&gt;方式传递给组件;props名称必须用小写,不能以$或_开头,不要使用保留字for,&nbsp;if,&nbsp;show,&nbsp;tid。目前props的数据类型不支持Function。示例见[自定义组件](../reference/arkui-js/js-components-custom-props.md)。 |
82  | computed | Object          | 用于在读取或设置进行预先处理,计算属性的结果会被缓存。计算属性名不能以$或_开头,不要使用保留字。示例见[自定义组件](../reference/arkui-js/js-components-custom-props.md)。 |
83
84## 方法
85
86- 数据方法
87  | 方法      | 参数                                     | 描述                                       |
88  | ------- | -------------------------------------- | ---------------------------------------- |
89  | $set    | key:&nbsp;string,&nbsp;value:&nbsp;any | 添加新的数据属性或者修改已有数据属性。<br/>用法:<br/>this.$set('key',value):添加数据属性。 |
90  | $delete | key:&nbsp;string                       | 删除数据属性。<br/>用法:<br/>this.$delete('key'):删除数据属性。 |
91
92  示例代码
93
94  ```js
95  // index.js
96  export default {
97    data: {
98      keyMap: {
99        OS: 'OpenHarmony',
100        Version: '2.0',
101      },
102    },
103    getAppVersion() {
104      this.$set('keyMap.Version', '3.0');
105      console.info("keyMap.Version = " + this.keyMap.Version); // keyMap.Version = 3.0
106
107      this.$delete('keyMap');
108      console.info("keyMap.Version = " + this.keyMap); // log print: keyMap.Version = undefined
109    }
110  }
111  ```
112
113- 公共方法
114  | 方法           | 参数              | 描述                                       |
115  | ------------ | --------------- | ---------------------------------------- |
116  | $element     | id:&nbsp;string | 获得指定id的组件对象,如果无指定id,则返回根组件对象。示例见[获取DOM元素](#获取dom元素)。<br/>用法:<br/>&lt;div&nbsp;id='xxx'&gt;&lt;/div&gt;<br/>-&nbsp;this.$element('xxx'):获得id为xxx的组件对象。<br/>-&nbsp;this.$element():获得根组件对象。 |
117  | $rootElement | 无               | 获取根组件对象。<br/>用法:this.$rootElement().scrollTo({&nbsp;duration:&nbsp;500,&nbsp;position:&nbsp;300&nbsp;}),&nbsp;页面在500ms内滚动300px。 |
118  | $root        | 无               | 获得顶级ViewModel实例。[获取ViewModel](#获取viewmodel)示例。 |
119  | $parent      | 无               | 获得父级ViewModel实例。[获取ViewModel](#获取viewmodel)示例。 |
120  | $child       | id:&nbsp;string | 获得指定id的子级自定义组件的ViewModel实例。[获取ViewModel](#获取viewmodel)示例。<br/>用法:<br/>this.$child('xxx')&nbsp;:获取id为xxx的子级自定义组件的ViewModel实例。 |
121
122- 事件方法
123  | 方法                                       | 参数   | 描述   |
124  | ---------------------------------------- | ---- | ---- |
125  | $watch | data:&nbsp;string,&nbsp;callback:&nbsp;string&nbsp;\|&nbsp;Function | 观察data中的属性变化,如果属性值改变,触发绑定的事件。示例见[自定义组件](../reference/arkui-js/js-components-custom-props.md)。<br/>用法:<br/>this.$watch('key',&nbsp;callback) |      |      |
126
127- 页面方法
128  | 方法                    | 参数                               | 描述                              |
129  | --------------------- | -------------------------------- | ------------------------------- |
130  | scrollTo<sup>6+</sup> | scrollPageParam: ScrollPageParam | 将页面滚动到目标位置,可以通过ID选择器指定或者滚动距离指定。 |
131
132  **表1** ScrollPageParam<sup>6+</sup>
133
134  | 名称             | 类型                      | 默认值  | 描述                                       |
135  | -------------- | ----------------------- | ---- | ---------------------------------------- |
136  | position       | number                  | -    | 指定滚动位置。                                  |
137  | id             | string                  | -    | 指定需要滚动到的元素id。                            |
138  | duration       | number                  | 300  | 指定滚动时长,单位为毫秒。                            |
139  | timingFunction | string                  | ease | 指定滚动动画曲线,可选值参考<br/>[动画样式animation-timing-function](../reference/arkui-js/js-components-common-animation.md)。 |
140  | complete       | ()&nbsp;=&gt;&nbsp;void | -    | 指定滚动完成后需要执行的回调函数。                        |
141
142  示例:
143
144  ```js
145  this.$rootElement().scrollTo({position: 0})
146  this.$rootElement().scrollTo({id: 'id', duration: 200, timingFunction: 'ease-in', complete: ()=>void})
147  ```
148
149
150## 获取DOM元素
151
1521. 通过$refs获取DOM元素
153   ```html
154   <!-- index.hml -->
155   <div class="container">
156     <image-animator class="image-player" ref="animator" images="{{images}}" duration="1s" onclick="handleClick"></image-animator>
157   </div>
158   ```
159
160   ```js
161   // index.js
162   export default {
163     data: {
164       images: [
165         { src: '/common/frame1.png' },
166         { src: '/common/frame2.png' },
167         { src: '/common/frame3.png' }
168       ]
169     },
170     handleClick() {
171       const animator = this.$refs.animator; // 获取ref属性为animator的DOM元素
172       const state = animator.getState();
173       if (state === 'paused') {
174         animator.resume();
175       } else if (state === 'stopped') {
176         animator.start();
177       } else {
178         animator.pause();
179       }
180     },
181   };
182   ```
183
1842. 通过$element获取DOM元素
185   ```html
186   <!-- index.hml -->
187   <div class="container" style="width:500px;height: 700px; margin: 100px;">
188     <image-animator class="image-player" id="animator" images="{{images}}" duration="1s" onclick="handleClick"></image-animator>
189   </div>
190   ```
191
192   ```js
193   // index.js
194   export default {
195     data: {
196       images: [
197         { src: '/common/frame1.png' },
198         { src: '/common/frame2.png' },
199         { src: '/common/frame3.png' }
200       ]
201     },
202     handleClick() {
203       const animator = this.$element('animator'); // 获取id属性为animator的DOM元素
204       const state = animator.getState();
205       if (state === 'paused') {
206         animator.resume();
207       } else if (state === 'stopped') {
208         animator.start();
209       } else {
210         animator.pause();
211       }
212     },
213   };
214   ```
215
216![zh-cn_image_0000001118642007](figures/zh-cn_image_0000001118642007.gif)
217
218## 获取ViewModel
219
220根节点所在页面:
221
222```html
223<!-- root.hml -->
224<element name='parentComp' src='../../common/component/parent/parent.hml'></element>
225<div class="container">
226  <div class="container">
227    <text>{{text}}</text>
228    <parentComp></parentComp>
229  </div>
230</div>
231```
232
233```js
234// root.js
235export default {
236  data: {
237    text: 'I am root!',
238  },
239}
240```
241
242![zh-cn_image_0000001118642008](figures/zh-cn_image_0000001118642008.png)
243
244自定义parent组件:
245
246```html
247<!-- parent.hml -->
248<element name='childComp' src='../child/child.hml'></element>
249<div class="item" onclick="textClicked">
250  <text class="text-style" onclick="parentClicked">parent component click</text>
251  <text class="text-style" if="{{showValue}}">hello parent component!</text>
252  <childComp id = "selfDefineChild"></childComp>
253</div>
254```
255
256```js
257// parent.js
258export default {
259  data: {
260    showValue: false,
261    text: 'I am parent component!',
262  },
263  parentClicked () {
264    this.showValue = !this.showValue;
265    console.info('parent component get parent text');
266    console.info(`${this.$parent().text}`);
267    console.info("parent component get child function");
268    console.info(`${this.$child('selfDefineChild').childClicked()}`);
269  },
270}
271```
272
273自定义child组件:
274
275```html
276<!-- child.hml -->
277<div class="item" onclick="textClicked">
278  <text class="text-style" onclick="childClicked">child component clicked</text>
279  <text class="text-style" if="{{isShow}}">hello child component</text>
280</div>
281```
282
283```js
284// child.js
285export default {
286  data: {
287    isShow: false,
288    text: 'I am child component!',
289  },
290  childClicked () {
291    this.isShow = !this.isShow;
292    console.info('child component get parent text');
293    console.info('${this.$parent().text}');
294    console.info('child component get root text');
295    console.info('${this.$root().text}');
296  },
297}
298```
299
300![zh-cn_image_0000001118642009](figures/zh-cn_image_0000001118642009.gif)