# Chaining API 的 init 函数
由于目前 glass-easel 组件框架仅可用于 Skyline 渲染引擎,因此这些特性也同样受此限制。
# init 链式调用项
在 Chaining API 中支持 .init(...) 链式调用项,可以以另一种方式进行组件创建:
Component() .data(() => ({ myDataField: 'someValue', })) .init(function ({ lifetime }) { // 这里可以用 JavaScript 局部量 const getUpdatedValue = () => { return 'updated' } // 定义一个生命周期方法 lifetime('attached', () => { this.setData({ myDataField: getUpdatedValue() }) }) }) .register() init 中定义的函数会在每次组件创建时被调用一次。
这种方式的主要好处是在其内部可以自由使用 JavaScript 局部变量,减少对组件 this 的使用,有时会很方便。
# init 函数中的辅助方法
init 的第一个参数包含多个辅助方法,可以用于组件定义。
method 用来定义单个方法,等价于传统形式的 methods 定义段中的单个项目。不过,它通常只用来定义事件响应函数,而且在末尾需要返回出来。例如:
Component() .init(function ({ method }) { const tapHandler = method(() => { /* ... */ }) return { tapHandler } }) .register() lifetime 和 pageLifetime 分别用来定义单个生命周期方法和组件所在页面的生命周期方法,等价于传统形式的 lifetime 和 pageLifetime 定义段中的单个项目。例如:
Component() .init(function ({ lifetime, pageLifetime }) { lifetime('attached', () => { /* ... */ }) pageLifetime('show', () => { /* ... */ }) }) .register() observer 用来定义单个数据监听器,类似于传统形式的 observers 定义段中的单个项目,但在同时监听多个数据字段时,应写成数组形式。例如:
Component() .data(() => ({ a: 1, b: 2, })) .init(function ({ observer }) { observer(['a', 'b'], () => { /* ... */ }) }) .register() relation 用来定义单个组件间关系项,等价于传统形式的 relations 定义段中的单个项目。例如:
Component() .init(function ({ relation }) { relation('another-component', { type: 'parent', }) }) .register() 需要注意的是,上面这些方法都不能异步或延迟执行,否则会报错:
Component() .init(function ({ lifetime }) { setTimeout(() => { // 不能这么做! lifetime('attached', () => { /* ... */ }) }, 0) }) .register() 此外,第一个参数中还包含有 data 和 setData ,可以用来快速访问和设置数据。例如:
Component() .data(() => ({ myDataField: 'someValue', })) .init(function ({ lifetime, data, setData }) { lifetime('attached', () => { setData({ myDataField: data.myDataField + ' updated', }) }) }) .register() 但要注意 data 和 setData 只应在各个回调函数中使用,下面这样做会报错:
Component() .init(function ({ setData }) { setData({ /* ... */ }) }) .register()