Skip to content

Skyline

Skyline 是微信小程序的高性能渲染引擎,它与 glass-easel 组件框架绑定。因此本文档提到 Skyline 模式时是指 Skyline 渲染引擎 + glass-easel 组件框架。Vue Mini 完美支持 Skyline 模式。

数据函数

Skyline 模式支持在模板中调用数据函数,数据函数很适合用来做多语言、格式化等。Vue Mini 1.3+ 为数据函数提供了专门的支持,你可以使用 dataFn() 来声明数据函数,它返回的是一个响应式的 Function Ref。

js
import { defineComponent, ref, dataFn } from '@vue-mini/core'

defineComponent({
  setup() {
    const lang = ref()

    wx.request({
      url: 'https://api.example.com/lang',
      data: { lang: 'en' },
      success(response) {
        lang.value = response.data
      },
    })

    // `t` 是响应式的,`lang` 更新后 `t` 也会自动更新,
    // 从而触发界面更新,因此无需将 `lang` 暴露给模板。
    const t = dataFn((key) => lang.value?.[key])

    // `t` 是一个 Function Ref,在 JS 中可以这样调用。
    t.value('welcome')

    // 无需返回 `lang`
    return { t }
  },
})
html
<view>{{ t('welcome') }}</view>

注意

dataFn() 的参数函数不能包含副作用,因为不仅模版渲染时会调用它,Vue Mini 内部在某些时候也会调用它。它可以是一个纯函数,或者是上面例子中那样的纯 getter 函数。

注意

dataFn() 的依赖项需要保持稳定,不能跟函数参数相关联。

js
// 不支持,依赖项不能随着参数变化而变化!
const fn = dataFn((condition) => (condition ? fooRef.value : barRef.value))

注意

此文档编写时,作者观察到如果从模板回传对象,微信小程序运行时会修改对象的每个属性名,给每个属性名添加 nv_ 前缀。

js
defineComponent({
  setup() {
    const t = dataFn((obj) => {
      return JSON.stringify(obj) // {"nv_foo":"foo"}
    })

    return { t }
  },
})
html
<view>{{ t({ foo: 'foo' }) }}</view>

Released under the MIT License.