Skip to content

Setup Context API(setup 上下文)

wevusetup(props, ctx) 除了 Vue 语义,还补齐了小程序运行时场景,特别是 ctx.instance(原生实例)和 ctx.emit(事件派发)。

1. setup 签名与核心类型

类型/接口链接说明
setup(props, ctx)SetupFunction组件/页面 setup 函数签名。
ctxSetupContextsetup 上下文总入口。
ctx.runtimeRuntimeInstance运行时实例(watch、snapshot、teardown 等)。
ctx.instanceMiniProgramInstance小程序原生实例。
ctx.emitTriggerEventOptions自定义事件派发入口。

2. setup 上下文相关 API

API类型入口说明
getCurrentInstanceRuntimeInstance获取当前运行时实例。
getCurrentSetupContextSetupContext获取当前 setup context。

3. provide/inject

API类型入口说明
provideInjectionKey<T> 兼容在当前组件树提供依赖。
injectT | undefined从当前组件树读取依赖。

4. 推荐:通过 ctx.instance 操作原生实例

在 Wevu 里,和小程序实例直接耦合的方法,推荐放在 ctx.instance 上调用,而不是依赖 this

  • ctx.instance.triggerEvent(...)
  • ctx.instance.createSelectorQuery()
  • ctx.instance.createIntersectionObserver(...)
  • ctx.instance.setData(...)
  • ctx.instance.router / ctx.instance.pageRouter(基础库 2.16.1+
  • 以及平台原生 wx 组件实例 API

示例(script setup)

vue
<script setup lang="ts">
import { getCurrentSetupContext, provide, ref } from 'wevu'

// [TS-only] 此示例无专属语法,TS/JS 写法一致。
const visible = ref(false)
provide('featureFlag', 'ctx-instance-demo')

function open() {
  const ctx = getCurrentSetupContext()
  visible.value = true
  ctx?.emit('open', { ok: true })
  ctx?.instance?.triggerEvent?.('opened', { ts: Date.now() })
}

function measure() {
  const ctx = getCurrentSetupContext()
  const query = ctx?.instance?.createSelectorQuery?.()
  query?.select('#target').boundingClientRect()
  query?.exec(console.log)
}

function watchBanner() {
  const ctx = getCurrentSetupContext()
  const observer = ctx?.instance?.createIntersectionObserver?.({ thresholds: [0, 1] })
  observer?.relativeToViewport().observe('#target', console.log)
}

function patchRaw() {
  const ctx = getCurrentSetupContext()
  ctx?.instance?.setData?.({ rawFlag: true })
}
</script>

<template>
  <view id="target" @tap="open">
    open: {{ visible }}
  </view>
  <button @tap="measure">
    measure
  </button>
  <button @tap="watchBanner">
    watchBanner
  </button>
  <button @tap="patchRaw">
    patchRaw
  </button>
</template>
vue
<script setup>
import { getCurrentSetupContext, provide, ref } from 'wevu'

const visible = ref(false)
provide('featureFlag', 'ctx-instance-demo')

function open() {
  const ctx = getCurrentSetupContext()
  visible.value = true
  ctx?.emit('open', { ok: true })
  ctx?.instance?.triggerEvent?.('opened', { ts: Date.now() })
}

function measure() {
  const ctx = getCurrentSetupContext()
  const query = ctx?.instance?.createSelectorQuery?.()
  query?.select('#target').boundingClientRect()
  query?.exec(console.log)
}

function watchBanner() {
  const ctx = getCurrentSetupContext()
  const observer = ctx?.instance?.createIntersectionObserver?.({ thresholds: [0, 1] })
  observer?.relativeToViewport().observe('#target', console.log)
}

function patchRaw() {
  const ctx = getCurrentSetupContext()
  ctx?.instance?.setData?.({ rawFlag: true })
}
</script>

<template>
  <view id="target" @tap="open">
    open: {{ visible }}
  </view>
  <button @tap="measure">
    measure
  </button>
  <button @tap="watchBanner">
    watchBanner
  </button>
  <button @tap="patchRaw">
    patchRaw
  </button>
</template>

5. 双向绑定辅助

API类型入口说明
useBindModelModelBindingOptions / ModelBinding生成小程序可直接绑定的数据 + 事件处理器。

5.1 路由辅助

API类型入口说明
useRouterRouter获取组件路径语义 Router。优先 this.router,再回退 this.pageRouter,低版本基础库降级到全局 wx/my/tt;可通过 WevuTypedRouterRouteMap.entries 收窄 url,并可用 tabBarEntries 收窄 switchTab
usePageRouterRouter获取页面路径语义 Router。优先 this.pageRouter,再回退 this.router,低版本基础库降级到全局 wx/my/tt;可通过 WevuTypedRouterRouteMap.entries 收窄 url,并可用 tabBarEntries 收窄 switchTab

5.1.1 Router 语义矩阵

Router 原生对象从微信基础库 2.16.1+ 可用。wevu 会按顺序做能力回退,因此建议你在设计路由 API 时明确“语义优先级”:

调用位置useRouter() 基准usePageRouter() 基准
页面 setup()页面路径页面路径
组件 setup()组件路径组件所在页面路径
低版本全局回退场景当前激活页(全局路由对象)当前激活页(全局路由对象)

5.1.2 兼容建议

  • 需要跨版本基路径稳定时,优先 usePageRouter()
  • 只在“组件目录相对路径”是业务需求时使用 useRouter()
  • 对低版本必须一致的路由,优先绝对路径(/pages/**/packageA/pages/**)。

5.2 可见性监听辅助

API类型入口说明
useIntersectionObserverIntersectionObserversetup 内创建观察器,自动在 onUnload/onDetached 阶段断开连接。

6. 相关页

Released under the MIT License.