脚本定义

JS 能力

  • 默认已开启支持 TS 类型声明
  • 整体可使用的 JS 语法和能力与 AIP 标准规范一致,限制包括:不支持异步函数、提供了沙盒、不支持 window 全局变量等。详细可参考标准规范中的元概念章节

SFC 脚本

非必须:如未用到脚本,脚本(script 标签内容)部分可为空,不设置 script 标签

SFC 的脚本部分分为两部分,JS 文件导入和 export default 默认导出结构体

导入

导入(import)支持两种形式的导入:导入函数和导入组件

导入函数

导入函数语法与 ES Module 一致,文件指向路径支持 JS 或 TS 文件路径。

基本使用方式:

import { log } from './a.js
import * as a from './a.js'
import { log } from './a'
import * as a from './a.ts'
1
2
3
4

导入组件

导入组件必须提供完整文件名,且文件后缀需为 aip

基本使用方式:

import Component from './a.aip';
1

并在 SFC 脚本中默认导出部分声明组件:

components: {
    Component: Component;
}
1
2
3

导出

默认导出结构体包含 componentsstateiniteffectmethods 这几个属性。

components 自定义组件

  • 支持引用其他文件定义的组件,并通过传入的属性通信
  • 内部组件可直接访问到外部组件的 state

state

当前组件的状态管理对象,如模版属性中的状态声明所示,支持在模版中直接引用名称,不需要加 state 前缀

init

特殊函数,需要声明在 SFC 导出部分顶层。是当前组件的生命周期方法,页面初始化完成时调用,挂载在当前根节点的 aip-init 上。

如果需要监听 state 值的变化,需要在 init 中声明 $watch 魔法值

基本使用方法:

export default {
    state: {
        a: 1,
    },
    init() {
        let b = 1;
        this.$watch('a', value => {
            console.log(value + b);
        });
    },
};
1
2
3
4
5
6
7
8
9
10
11

effect

特殊函数,声明在 SFC 导出部分顶层。是当前组件的生命周期方法,页面状态更新时调用,挂载在当前根节点的 aip-effect

基本使用方式:

export default {
    effect() {
        console.log('effect');
    },
};
1
2
3
4
5

methods

  • 支持在模版中的事件中调用,或在模版中的生命周期、执行函数返回结果等场景使用
  • 在模版中使用直接使用 methods 中声明的方法
在函数或 state 中使用

例如如下样例:

<template aip>
    <div>{{value}}</div>
</template>
<script>
    export default {
        state: {
            value: ''
        },
        init() {
            this.initValue(10)
        }
        methods: {
            initValue(value) {
                this.value = value || 0
            }
        }
    }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

生成的 AIP 标准页面结果为:

<!-- 编译结果 -->
<div
    aip-state="(() => {return { value: '', initValue(value) {this.value = value || 0;}, init() {this.initValue(10);} };})()"
    aip-init="init()"
>
    {{ value }}
</div>
1
2
3
4
5
6
7
在事件中使用

不推荐:默认可不需要显式调用,也即:仅声明使用到的函数名,不包含函数调用

使用事件对象($event)时,注意需在模版部分事件调用时声明 $event,且在 methods 部分定义相应参数

<template aip>
    <aip-button (click)="onClick($event)">btn</aip-button>
</template>
<script>
    export default {
        methods: {
            onClick($event) {
                console.log($event);
            },
        },
    };
</script>






 





1
2
3
4
5
6
7
8
9
10
11
12
复杂的使用方式

例如引用外部文件,声明作用域变量

<!-- entry.aip -->
<template>
    <div>{{value}}</div>
</template>
<script>
    import { afterInit } from './utils.js';
    let a = 1;

    export default {
        state: {
            value: '',
        },
        methods: {
            initValue(value) {
                this.value = value || a;
                afterInit();
            },
        },
    };
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// utils.js
let a = 2;
let afterInit = () => {
    a = 2;
    console.log(a);
};
export { afterInit };
1
2
3
4
5
6
7

生成的 AIP 标准页面结果为:

<!-- 编译结果 -->
<div
    aip-state="(() => {var a = 2;var afterInit = () => {a = 2;console.log(a);};var a2 = 1;return {value: '', initValue(value) {this.value = value || a2;afterInit();}};})();"
>
    {{value}}
</div>
1
2
3
4
5
6

this 本地变量、方法访问

  • 支持访问到外层 state、全局魔法值、当前 state 中的值和 methods 中的方法
  • 外部 state 和 AIP 魔法值看作当前作用域内注入变量,需通过 this 访问
  • 不可在 state 中使用 this 引用变量
  • 当变量命名重复时,内层变量会遮蔽外层变量

基本使用方式:

export default {
    state: {
        a: 1,
    },
    // 生命周期方法
    init() {
        this.a = 2;
    },
    effect() {
        console.log(this.a);
    },
};
1
2
3
4
5
6
7
8
9
10
11
12
Last Updated: 2022/7/15 下午7:22:06