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/>> 应用对象不支持数据绑定,需主动触发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, if, show, tid。<br/>data与private和public不能重合使用。 | 78 | $refs | Object | 持有注册过ref 属性的DOM元素或子组件实例的对象。示例见[获取DOM元素](#获取dom元素)。 | 79 | private | Object | 页面的数据模型,private下的数据属性只能由当前页面修改。 | 80 | public | Object | 页面的数据模型,public下的数据属性的行为与data保持一致。 | 81 | props | Array/Object | props用于组件之间的通信,可以通过<tag xxxx='value'>方式传递给组件;props名称必须用小写,不能以$或_开头,不要使用保留字for, if, show, 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: string, value: any | 添加新的数据属性或者修改已有数据属性。<br/>用法:<br/>this.$set('key',value):添加数据属性。 | 90 | $delete | key: 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: string | 获得指定id的组件对象,如果无指定id,则返回根组件对象。示例见[获取DOM元素](#获取dom元素)。<br/>用法:<br/><div id='xxx'></div><br/>- this.$element('xxx'):获得id为xxx的组件对象。<br/>- this.$element():获得根组件对象。 | 117 | $rootElement | 无 | 获取根组件对象。<br/>用法:this.$rootElement().scrollTo({ duration: 500, position: 300 }), 页面在500ms内滚动300px。 | 118 | $root | 无 | 获得顶级ViewModel实例。[获取ViewModel](#获取viewmodel)示例。 | 119 | $parent | 无 | 获得父级ViewModel实例。[获取ViewModel](#获取viewmodel)示例。 | 120 | $child | id: string | 获得指定id的子级自定义组件的ViewModel实例。[获取ViewModel](#获取viewmodel)示例。<br/>用法:<br/>this.$child('xxx') :获取id为xxx的子级自定义组件的ViewModel实例。 | 121 122- 事件方法 123 | 方法 | 参数 | 描述 | 124 | ---------------------------------------- | ---- | ---- | 125 | $watch | data: string, callback: string \| Function | 观察data中的属性变化,如果属性值改变,触发绑定的事件。示例见[自定义组件](../reference/arkui-js/js-components-custom-props.md)。<br/>用法:<br/>this.$watch('key', 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 | () => 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)