快應(yīng)用 script腳本

2020-08-10 15:01 更新

用來(lái)定義頁(yè)面數(shù)據(jù)和實(shí)現(xiàn)生命周期接口

語(yǔ)法


支持 ES6 語(yǔ)法

模塊聲明

可以通過(guò) import 引入功能模塊,在代碼中調(diào)用模塊方法(具體參看接口部分文檔說(shuō)明)

import fetch from "@system.fetch"

代碼引用

JS 代碼引用推薦使用 import 來(lái)導(dǎo)入, 例如:

import utils from '../Common/utils.js'

注意: 快應(yīng)用環(huán)境不是 node 環(huán)境,不要引用 node 原生模塊,如 import fs from 'fs'

對(duì)象


頁(yè)面級(jí)組件

屬性類型描述
data deprecatedObject | Function頁(yè)面級(jí)組件的數(shù)據(jù)模型,能夠轉(zhuǎn)換為 JSON 對(duì)象;屬性名不能以$或_開頭, 不要使用 for, if, show, tid 等保留字
如果是函數(shù),返回結(jié)果必須是對(duì)象,在組件初始化時(shí)會(huì)執(zhí)行函數(shù)獲取結(jié)果作為 data 的值
使用 data 方式聲明的屬性會(huì)被外部數(shù)據(jù)覆蓋,因此存在一定安全風(fēng)險(xiǎn),推薦使用下面的 public,protected,private 來(lái)聲明屬性(注意:它們不能與 data 同時(shí)聲明)
public 1000+Object頁(yè)面級(jí)組件的數(shù)據(jù)模型,影響傳入數(shù)據(jù)的覆蓋機(jī)制:public 內(nèi)定義的屬性允許被傳入的數(shù)據(jù)覆蓋,如果外部傳入數(shù)據(jù)的某個(gè)屬性未被聲明,在 public 中不會(huì)新增這個(gè)屬性
protected 1000+Object頁(yè)面級(jí)組件的數(shù)據(jù)模型,影響傳入數(shù)據(jù)的覆蓋機(jī)制:protected 內(nèi)定義的屬性,允許被應(yīng)用內(nèi)部頁(yè)面請(qǐng)求傳遞的數(shù)據(jù)覆蓋,不允許被應(yīng)用外部請(qǐng)求傳遞的數(shù)據(jù)覆蓋
private 1000+Object頁(yè)面級(jí)組件的數(shù)據(jù)模型,影響傳入數(shù)據(jù)的覆蓋機(jī)制:private 內(nèi)定義的屬性不允許被覆蓋
computed 1050+Object計(jì)算屬性,屬性名不能以$或_開頭, 不要使用 for, if, show, tid 等保留字

自定義組件

屬性類型描述
dataObject | Function自定義組件的數(shù)據(jù)模型,能夠轉(zhuǎn)換為 JSON 對(duì)象;屬性名不能以$或_開頭, 不要使用 for, if, show, tid 等保留字
如果是函數(shù),返回結(jié)果必須是對(duì)象,在組件初始化時(shí)會(huì)執(zhí)行函數(shù)獲取結(jié)果作為 data 的值
propsArray | Object定義組件外部可傳入的所有屬性;屬性名不能以$或_開頭, 不要使用 for, if, show, tid 等保留字
在模板代碼中,請(qǐng)使用短橫線分隔命名代替駝峰命名。如,屬性定義 props: ['propA'],可通過(guò)<tag prop-a='xx'>方式傳遞到組件內(nèi)部
支持 prop 驗(yàn)證 1010+
computed 1050+Object計(jì)算屬性,屬性名不能以$或_開頭, 不要使用 for, if, show, tid 等保留字

prop 驗(yàn)證

在自定義組件中,可將 props 定義為帶驗(yàn)證需求的對(duì)象。其中,key 為屬性名,value 為屬性對(duì)應(yīng)的驗(yàn)證需求。驗(yàn)證失敗則輸出錯(cuò)誤提示日志,增加 prop 驗(yàn)證有利于規(guī)范自定義組件的使用

定義:

屬性類型描述
type 1010+-檢查屬性值的類型。支持單一類型和多種可能類型,可在原生和自定義構(gòu)造函數(shù)中任意選擇,單獨(dú)或組合使用
  • 原生構(gòu)造函數(shù):String | Number | Boolean | Function | Object | Array | Symbol
  • 自定義構(gòu)造函數(shù)
default 1010+-設(shè)置屬性的默認(rèn)值
required 1010+Boolean設(shè)置屬性是否必填
validator 1010+Function設(shè)置自定義驗(yàn)證函數(shù)。若函數(shù)的返回值為真,則通過(guò)驗(yàn)證;否則驗(yàn)證失敗

示例:

<script>
  export default {
    props: {
      // 單一類型檢查的簡(jiǎn)寫
      propA: Number,
      // 多種可能類型的簡(jiǎn)寫
      propB: [String, Number],
      // 必填的字符串
      propC: {
        type: String,
        required: true
      },
      // 帶默認(rèn)值的數(shù)字
      propD: {
        type: Number,
        default: 100
      },
      // 帶有默認(rèn)值的對(duì)象
      propE: {
        type: Object,
        default () {
          return { message: 'hello' }
        }
      },
      // 自定義驗(yàn)證函數(shù)
      propF: {
        validator (value) {
          return value === 'hello'
        }
      }
    }
  }
</script>

計(jì)算屬性 1050+

  • 類型:{ [key: string]: Function | { get: Function, set: Function } }
  • 詳細(xì):計(jì)算屬性將被混入到 Vm 實(shí)例中。所有 getter 和 setter 的 this 上下文自動(dòng)地綁定為 Vm 實(shí)例。計(jì)算屬性的結(jié)果會(huì)被緩存,除非依賴的響應(yīng)式屬性變化才會(huì)重新計(jì)算。注意,如果某個(gè)依賴 (比如非響應(yīng)式屬性) 在該實(shí)例范疇之外,則計(jì)算屬性是不會(huì)被更新的。

示例:

export default {
  data: {
    firstName: 'Quick',
    lastName: 'App'
  },
  computed: {
    fullName: {
      get() {
        return `${this.firstName} ${this.lastName}`
      },
      set(value) {
        const names = value.split(' ')
        this.firstName = names[0]
        this.lastName = names[names.length - 1]
      }
    }
  },
  onReady() {
    console.log(this.fullName) // Quick App
    this.fullName = 'John Doe'
    console.log(this.firstName) // John
    console.log(this.lastName) // Doe
  }
}

公共對(duì)象

屬性 類型 描述
$app Object 應(yīng)用對(duì)象
$page Object 頁(yè)面對(duì)象
$valid Boolean 頁(yè)面對(duì)象是否有效
$visible Boolean 頁(yè)面是否處于用戶可見狀態(tài)

應(yīng)用對(duì)象

可通過(guò)$app訪問(wèn)

屬性 類型 描述
$def Object 使用this.$app.$def獲取在app.ux中暴露的對(duì)象
$data Object 使用this.$app.$data獲取在manifest.jsonconfig.data中聲明的全局?jǐn)?shù)據(jù)

頁(yè)面對(duì)象

可通過(guò)$page訪問(wèn)

屬性 類型 描述
action String 獲取打開當(dāng)前頁(yè)面的action。僅在當(dāng)前頁(yè)面是通過(guò)filter匹配的方式打開時(shí)有效,否則為undefined。參見manifest文件
uri String 獲取打開當(dāng)前頁(yè)面的uri。僅在當(dāng)前頁(yè)面是通過(guò)filter匹配的方式打開時(shí)有效,否則為undefined。參見manifest文件

方法


數(shù)據(jù)方法

屬性 類型 參數(shù) 描述
$set Function key: String
value: Any
添加數(shù)據(jù)屬性,必須在onInit函數(shù)中使用,否則<template>中數(shù)據(jù)綁定無(wú)法生效用法:this.$set('key',value) this.$vm('id').$set('key',value)
$delete Function key: String 刪除數(shù)據(jù)屬性,如果在onInit函數(shù)中使用,會(huì)導(dǎo)致<template>中相應(yīng)的數(shù)據(jù)綁定無(wú)法生效用法:this.$delete('key') this.$vm('id').$delete('key')

公共方法

屬性 類型 參數(shù) 描述
$element Function id: String 組件id 獲取指定id的組件dom對(duì)象,如果沒(méi)有指定id,則返回根組件dom對(duì)象用法:<template> <div id='xxx'></div> </template> this.$element('xxx') 獲取id為xxx的div組件實(shí)例對(duì)象 this.$element() 獲取根組件實(shí)例對(duì)象
$root Function 無(wú) 獲取頂層ViewModel
$parent Function 無(wú) 獲取父親ViewModel
$child Function id: String 組件id 獲取指定id的自定義組件的ViewModel用法:this.$child('xxx') 獲取id為xxx的div組件ViewModel
$vm deprecated Function id: String 組件id 請(qǐng)使用上面this.$child('xxx')替代
$rootElement deprecated Function 無(wú) 請(qǐng)使用上面this.$element()替代
$forceUpdate Function 無(wú) 強(qiáng)制頁(yè)面刷新

事件方法

屬性 類型 參數(shù) 描述
$on Function type: String 事件名
handler: Function 事件句柄函數(shù)
添加事件處理句柄用法:this.$on('xxxx', this.fn) fn是在<script>中定義的函數(shù)
$off Function type: String 事件名
handler: Function 事件句柄函數(shù)
刪除事件處理句柄用法:this.$off('xxxx', this.fn) this.$off('xxx') 刪除指定事件的所有處理句柄
$dispatch Function type: String 事件名 向上層組件發(fā)送事件通知用法:this.$dispatch('xxx')正常情況下,會(huì)一直向上傳遞事件(冒泡)如果要停止冒泡,在事件句柄函數(shù)中調(diào)用evt.stop()即可
$broadcast Function type: String 事件名 向子組件發(fā)送事件通知用法:this.$broadcast('xxx')正常情況下,會(huì)一直向下傳遞事件如果要停止傳遞,在事件句柄函數(shù)中調(diào)用evt.stop()即可
$emit Function type: String 事件名
data: Object 事件參數(shù)
觸發(fā)事件,對(duì)應(yīng)的句柄函數(shù)被調(diào)用用法:this.$emit('xxx') this.$emit('xxx', {a:1})傳遞的事件參數(shù)可在事件回調(diào)函數(shù)中,通過(guò)evt.detail來(lái)訪問(wèn),例如evt.detail.a
$emitElement Function type: String 事件名
data: Object 事件參數(shù)
id: String 組件id (默認(rèn)為-1 代表根元素)
觸發(fā)組件事件, 對(duì)應(yīng)的句柄函數(shù)被調(diào)用用法:this.$emitElement('xxx', null, 'id') this.$emitElement('xxx', {a:1})傳遞的事件參數(shù)可在事件回調(diào)函數(shù)中,通過(guò)evt.detail來(lái)訪問(wèn),例如evt.detail.a
$watch Function data: String 屬性名, 支持'a.b.c'格式,不支持?jǐn)?shù)組索引
handler: String 事件句柄函數(shù)名, 函數(shù)的第一個(gè)參數(shù)為新的屬性值,第二個(gè)參數(shù)為舊的屬性值
動(dòng)態(tài)添加屬性/事件綁定,屬性必須在data中定義,handler函數(shù)必須在<script>定義;當(dāng)屬性值發(fā)生變化時(shí)事件才被觸發(fā)用法:this.$watch('a','handler')

頁(yè)面方法

可通過(guò)$page訪問(wèn)

屬性 類型 參數(shù) 描述
setTitleBar Function text: String 標(biāo)題欄文字
textColor: String 文字顏色
backgroundColor: String 背景顏色
backgroundOpacity 正式版本可用: Number 背景透明度
menu 正式版本可用: Boolean 是否在標(biāo)題欄右上角顯示菜單按鈕
設(shè)置當(dāng)前頁(yè)面的標(biāo)題欄用法:this.$page.setTitleBar({text:'Hello', textColor:'#FF0000', backgroundColor:'#FFFFFF', backgroundOpacity:0.5, menu: true})

生命周期接口


頁(yè)面生命周期

屬性 類型 參數(shù) 返回值 描述 觸發(fā)時(shí)機(jī)
onInit Function 無(wú) 無(wú) 監(jiān)聽頁(yè)面初始化 當(dāng)頁(yè)面完成初始化時(shí)調(diào)用,只觸發(fā)一次
onReady Function 無(wú) 無(wú) 監(jiān)聽頁(yè)面創(chuàng)建完成 當(dāng)頁(yè)面完成創(chuàng)建可以顯示時(shí)觸發(fā),只觸發(fā)一次
onShow Function 無(wú) 無(wú) 監(jiān)聽頁(yè)面顯示 當(dāng)進(jìn)入頁(yè)面時(shí)觸發(fā)
onHide Function 無(wú) 無(wú) 監(jiān)聽頁(yè)面隱藏 當(dāng)頁(yè)面跳轉(zhuǎn)離開時(shí)觸發(fā)
onDestroy Function 無(wú) 無(wú) 監(jiān)聽頁(yè)面退出 當(dāng)頁(yè)面跳轉(zhuǎn)離開(不進(jìn)入導(dǎo)航棧)時(shí)觸發(fā)
onBackPress Function 無(wú) Boolean 監(jiān)聽返回按鈕動(dòng)作 當(dāng)用戶點(diǎn)擊返回按鈕時(shí)觸發(fā)。返回true表示頁(yè)面自己處理返回邏輯,返回false表示使用默認(rèn)的返回邏輯,不返回值會(huì)作為false處理
onMenuPress Function 無(wú) 無(wú) 監(jiān)聽菜單按鈕動(dòng)作 當(dāng)用戶點(diǎn)擊菜單按鈕時(shí)觸發(fā)

頁(yè)面的生命周期接口的調(diào)用順序:

  • 打開頁(yè)面A:onInit() -> onReady() -> onShow()
  • 在頁(yè)面A打開頁(yè)面B:onHide()
  • 從頁(yè)面B返回頁(yè)面A:onShow()
  • A頁(yè)面返回:onBackPress() -> onHide() -> onDestroy()

應(yīng)用生命周期

屬性 類型 參數(shù) 返回值 描述 觸發(fā)時(shí)機(jī)
onCreate Function 無(wú) 無(wú) 監(jiān)聽?wèi)?yīng)用創(chuàng)建 當(dāng)應(yīng)用創(chuàng)建時(shí)調(diào)用
onDestroy Function 無(wú) 無(wú) 監(jiān)聽?wèi)?yīng)用銷毀 當(dāng)應(yīng)用銷毀時(shí)觸發(fā)

消息通道(BroadcastChannel) 正式版本可用

用來(lái)實(shí)現(xiàn)不同頁(yè)面之間的相互通信。

接口說(shuō)明

在BroadcastChannel的構(gòu)造函數(shù)中,只支持接受一個(gè)參數(shù),就是"頻道名稱"(channel name)

比如:

const test = new BroadcastChannel('channel')

BroadcastChannel 定義的接口如下:

declare interface BroadcastChannel = {
  name: string,
  postMessage: (message: any) => void;
  onmessage: (event: MessageEvent) => void;
  close: () => void;
}

消息對(duì)象(MessageEvent)的類型定義如下:

declare interface MessageEvent = {
  type: string, // "message"
  data: any
}

對(duì)參數(shù)的說(shuō)明:

名稱 類型 參數(shù) 描述
name String String:頻道名稱 頻道名稱,區(qū)分不同的消息頻道(注意:不同頻道之間不可通信)。
postMessage Function Object: 消息內(nèi)容 用于在當(dāng)前頻道中廣播消息。
onmessage Function Event:消息對(duì)象 訂閱消息。在頻道中接收到廣播消息之后,會(huì)給所有訂閱者派發(fā)消息事件。
close Function 無(wú) 關(guān)閉當(dāng)前的頻道。

用法

假設(shè)在我們的應(yīng)用中,有A、B、C三個(gè)頁(yè)面

在頁(yè)面 A 中:

const pageA = new BroadcastChannel('channel1')
pageA.postMessage('haha!')

在頁(yè)面 B 中:

const pageB = new BroadcastChannel('channel1')

在頁(yè)面 C 中:

const pageC = new BroadcastChannel('channel1')
pageC.onmessage = function (event) {
  console.log(event.data)
  pageC.postMessage('hello, i am here!')
}

這樣,頁(yè)面 A 、B 、C 都創(chuàng)建一個(gè)監(jiān)聽了 'channel1' 頻道的 BroadcastChannel 對(duì)象,它們之間可以通過(guò)這個(gè)對(duì)象實(shí)現(xiàn)互相通信。

當(dāng) pageA 發(fā)布了 'haha!' 消息時(shí),pageC 將收到一個(gè)消息事件,其 data 字段等于 'haha!',然后也向頻道中回復(fù)一條消息。注意:自己不會(huì)收到自己發(fā)的消息。

但是 pageB 并不會(huì)收到這些消息,因?yàn)樗麤](méi)有實(shí)現(xiàn)onmessage 方法,相當(dāng)于沒(méi)有接收頻道中的消息,所以他實(shí)際上不是一個(gè)訂閱者。

注意:在pageA銷毀channel當(dāng)前不與頁(yè)面context進(jìn)行上下文綁定,需要主動(dòng)關(guān)閉消息通道,如下所示:

const pageA = new BroadcastChannel('tom')
pageA.close();


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)