# JSè¯æ³•å‚考 JS文件用æ¥å®šä¹‰HML页é¢çš„业务逻辑,支æŒECMA规范的JavaScriptè¯è¨€ã€‚基于JavaScriptè¯è¨€çš„动æ€åŒ–能力,å¯ä»¥ä½¿åº”ç”¨æ›´åŠ å¯Œæœ‰è¡¨çŽ°åŠ›ï¼Œå…·å¤‡æ›´åŠ çµæ´»çš„设计能力。下é¢è®²è¿°JS文件的编译和è¿è¡Œçš„支æŒæƒ…况。 ## è¯æ³• 支æŒES6è¯æ³•ã€‚ - 模å—声明 使用import方法引入功能模å—: ```js import router from '@ohos.router'; ``` - 代ç 引用 使用import方法导入js代ç : ```js import utils from '../../common/utils.js'; ``` ## 对象 - 应用对象 | 属性 | 类型 | æè¿° | | ---- | ------ | ------------------------------------------------------------ | | $def | Object | 使用this.$app.$def获å–在app.jsä¸æš´éœ²çš„对象。<br/>> **说明:**<br/>> 应用对象ä¸æ”¯æŒæ•°æ®ç»‘定,需主动触å‘UI更新。 | 示例代ç ```js // app.js export default { onCreate() { console.info('Application onCreate'); }, onDestroy() { console.info('Application onDestroy'); }, globalData: { appData: 'appData', appVersion: '2.0', }, globalMethod() { console.info('This is a global method!'); this.globalData.appVersion = '3.0'; } }; ``` ```js // index.js页é¢é€»è¾‘代ç export default { data: { appData: 'localData', appVersion:'1.0', }, onInit() { this.appData = this.$app.$def.globalData.appData; this.appVersion = this.$app.$def.globalData.appVersion; }, invokeGlobalMethod() { this.$app.$def.globalMethod(); }, getAppVersion() { this.appVersion = this.$app.$def.globalData.appVersion; } } ``` - 页é¢å¯¹è±¡ | 属性 | 类型 | æè¿° | | -------- | --------------- | ---------------------------------------- | | data | Object/Function | 页é¢çš„æ•°æ®æ¨¡åž‹ï¼Œç±»åž‹æ˜¯å¯¹è±¡æˆ–者函数,如果类型是函数,返回值必须是对象。属性åä¸èƒ½ä»¥$或_开头,ä¸è¦ä½¿ç”¨ä¿ç•™å—for, if, show, tid。<br/>data与privateå’Œpublicä¸èƒ½é‡åˆä½¿ç”¨ã€‚ | | $refs | Object | æŒæœ‰æ³¨å†Œè¿‡ref 属性的DOMå…ƒç´ æˆ–å组件实例的对象。示例è§[获å–DOMå…ƒç´ ](#获å–domå…ƒç´ )。 | | private | Object | 页é¢çš„æ•°æ®æ¨¡åž‹ï¼Œprivate下的数æ®å±žæ€§åªèƒ½ç”±å½“å‰é¡µé¢ä¿®æ”¹ã€‚ | | public | Object | 页é¢çš„æ•°æ®æ¨¡åž‹ï¼Œpublic下的数æ®å±žæ€§çš„行为与dataä¿æŒä¸€è‡´ã€‚ | | props | Array/Object | props用于组件之间的通信,å¯ä»¥é€šè¿‡<tag xxxx='value'>æ–¹å¼ä¼ 递给组件;propså称必须用å°å†™ï¼Œä¸èƒ½ä»¥$或_开头,ä¸è¦ä½¿ç”¨ä¿ç•™å—for, if, show, tid。目å‰propsçš„æ•°æ®ç±»åž‹ä¸æ”¯æŒFunction。示例è§[自定义组件](../reference/arkui-js/js-components-custom-props.md)。 | | computed | Object | 用于在读å–或设置进行预先处ç†ï¼Œè®¡ç®—属性的结果会被缓å˜ã€‚计算属性åä¸èƒ½ä»¥$或_开头,ä¸è¦ä½¿ç”¨ä¿ç•™å—。示例è§[自定义组件](../reference/arkui-js/js-components-custom-props.md)。 | ## 方法 - æ•°æ®æ–¹æ³• | 方法 | å‚æ•° | æè¿° | | ------- | -------------------------------------- | ---------------------------------------- | | $set | key: string, value: any | æ·»åŠ æ–°çš„æ•°æ®å±žæ€§æˆ–者修改已有数æ®å±žæ€§ã€‚<br/>用法:<br/>this.$set('key',value)ï¼šæ·»åŠ æ•°æ®å±žæ€§ã€‚ | | $delete | key: string | åˆ é™¤æ•°æ®å±žæ€§ã€‚<br/>用法:<br/>this.$delete('key')ï¼šåˆ é™¤æ•°æ®å±žæ€§ã€‚ | 示例代ç ```js // index.js export default { data: { keyMap: { OS: 'OpenHarmony', Version: '2.0', }, }, getAppVersion() { this.$set('keyMap.Version', '3.0'); console.info("keyMap.Version = " + this.keyMap.Version); // keyMap.Version = 3.0 this.$delete('keyMap'); console.info("keyMap.Version = " + this.keyMap); // log print: keyMap.Version = undefined } } ``` - 公共方法 | 方法 | å‚æ•° | æè¿° | | ------------ | --------------- | ---------------------------------------- | | $element | id: string | 获得指定idçš„ç»„ä»¶å¯¹è±¡ï¼Œå¦‚æžœæ— æŒ‡å®šidï¼Œåˆ™è¿”å›žæ ¹ç»„ä»¶å¯¹è±¡ã€‚ç¤ºä¾‹è§[获å–DOMå…ƒç´ ](#获å–domå…ƒç´ )。<br/>用法:<br/><div id='xxx'></div><br/>- this.$element('xxx'):获得id为xxx的组件对象。<br/>- this.$element()ï¼šèŽ·å¾—æ ¹ç»„ä»¶å¯¹è±¡ã€‚ | | $rootElement | æ— | 获å–æ ¹ç»„ä»¶å¯¹è±¡ã€‚<br/>用法:this.$rootElement().scrollTo({ duration: 500, position: 300 }), 页é¢åœ¨500ms内滚动300px。 | | $root | æ— | 获得顶级ViewModel实例。[获å–ViewModel](#获å–viewmodel)示例。 | | $parent | æ— | 获得父级ViewModel实例。[获å–ViewModel](#获å–viewmodel)示例。 | | $child | id: string | 获得指定idçš„å级自定义组件的ViewModel实例。[获å–ViewModel](#获å–viewmodel)示例。<br/>用法:<br/>this.$child('xxx') :获å–id为xxxçš„å级自定义组件的ViewModel实例。 | - 事件方法 | 方法 | å‚æ•° | æè¿° | | ---------------------------------------- | ---- | ---- | | $watch | data: string, callback: string \| Function | 观察dataä¸çš„属性å˜åŒ–,如果属性值改å˜ï¼Œè§¦å‘绑定的事件。示例è§[自定义组件](../reference/arkui-js/js-components-custom-props.md)。<br/>用法:<br/>this.$watch('key', callback) | | | - 页é¢æ–¹æ³• | 方法 | å‚æ•° | æè¿° | | --------------------- | -------------------------------- | ------------------------------- | | scrollTo<sup>6+</sup> | scrollPageParam: ScrollPageParam | 将页é¢æ»šåŠ¨åˆ°ç›®æ ‡ä½ç½®ï¼Œå¯ä»¥é€šè¿‡ID选择器指定或者滚动è·ç¦»æŒ‡å®šã€‚ | **表1** ScrollPageParam<sup>6+</sup> | å称 | 类型 | 默认值 | æè¿° | | -------------- | ----------------------- | ---- | ---------------------------------------- | | position | number | - | 指定滚动ä½ç½®ã€‚ | | id | string | - | 指定需è¦æ»šåŠ¨åˆ°çš„å…ƒç´ id。 | | duration | number | 300 | 指定滚动时长,å•ä½ä¸ºæ¯«ç§’。 | | timingFunction | string | ease | 指定滚动动画曲线,å¯é€‰å€¼å‚考<br/>[åŠ¨ç”»æ ·å¼animation-timing-function](../reference/arkui-js/js-components-common-animation.md)。 | | complete | () => void | - | 指定滚动完æˆåŽéœ€è¦æ‰§è¡Œçš„回调函数。 | 示例: ```js this.$rootElement().scrollTo({position: 0}) this.$rootElement().scrollTo({id: 'id', duration: 200, timingFunction: 'ease-in', complete: ()=>void}) ``` ## 获å–DOMå…ƒç´ 1. 通过$refs获å–DOMå…ƒç´ ```html <!-- index.hml --> <div class="container"> <image-animator class="image-player" ref="animator" images="{{images}}" duration="1s" onclick="handleClick"></image-animator> </div> ``` ```js // index.js export default { data: { images: [ { src: '/common/frame1.png' }, { src: '/common/frame2.png' }, { src: '/common/frame3.png' } ] }, handleClick() { const animator = this.$refs.animator; // 获å–ref属性为animatorçš„DOMå…ƒç´ const state = animator.getState(); if (state === 'paused') { animator.resume(); } else if (state === 'stopped') { animator.start(); } else { animator.pause(); } }, }; ``` 2. 通过$element获å–DOMå…ƒç´ ```html <!-- index.hml --> <div class="container" style="width:500px;height: 700px; margin: 100px;"> <image-animator class="image-player" id="animator" images="{{images}}" duration="1s" onclick="handleClick"></image-animator> </div> ``` ```js // index.js export default { data: { images: [ { src: '/common/frame1.png' }, { src: '/common/frame2.png' }, { src: '/common/frame3.png' } ] }, handleClick() { const animator = this.$element('animator'); // 获å–id属性为animatorçš„DOMå…ƒç´ const state = animator.getState(); if (state === 'paused') { animator.resume(); } else if (state === 'stopped') { animator.start(); } else { animator.pause(); } }, }; ```  ## 获å–ViewModel æ ¹èŠ‚ç‚¹æ‰€åœ¨é¡µé¢ï¼š ```html <!-- root.hml --> <element name='parentComp' src='../../common/component/parent/parent.hml'></element> <div class="container"> <div class="container"> <text>{{text}}</text> <parentComp></parentComp> </div> </div> ``` ```js // root.js export default { data: { text: 'I am root!', }, } ```  自定义parent组件: ```html <!-- parent.hml --> <element name='childComp' src='../child/child.hml'></element> <div class="item" onclick="textClicked"> <text class="text-style" onclick="parentClicked">parent component click</text> <text class="text-style" if="{{showValue}}">hello parent component!</text> <childComp id = "selfDefineChild"></childComp> </div> ``` ```js // parent.js export default { data: { showValue: false, text: 'I am parent component!', }, parentClicked () { this.showValue = !this.showValue; console.info('parent component get parent text'); console.info(`${this.$parent().text}`); console.info("parent component get child function"); console.info(`${this.$child('selfDefineChild').childClicked()}`); }, } ``` 自定义child组件: ```html <!-- child.hml --> <div class="item" onclick="textClicked"> <text class="text-style" onclick="childClicked">child component clicked</text> <text class="text-style" if="{{isShow}}">hello child component</text> </div> ``` ```js // child.js export default { data: { isShow: false, text: 'I am child component!', }, childClicked () { this.isShow = !this.isShow; console.info('child component get parent text'); console.info('${this.$parent().text}'); console.info('child component get root text'); console.info('${this.$root().text}'); }, } ``` 