Skip to content

Vue SFC:模板与指令

页面事件与生命周期:怎么触发

在小程序里,很多页面事件属于“按需派发”:

  • 只有你定义了 onPageScroll/onReachBottom/onPullDownRefresh/... 这些页面方法,事件才会从渲染层派发到逻辑层。
  • wevuonPageScroll/onShareAppMessage/... hooks,本质也是在注册对应页面方法。

你通常不需要手写 features.enableOnXxx

  • 使用 weapp-vite 构建:当编译器检测到你调用了对应 hooks,会在编译阶段自动补齐 features.enableOnXxx = true
  • 不使用 weapp-vite(或极端场景):才需要在 defineComponent({ features: ... }) 里手动开启。

v-model 支持范围与限制

weapp-vite 的 Vue 模板编译会把 v-model="x" 直接编译成小程序的“赋值表达式事件”(例如 bind:input="x = $event.detail.value"),因此它有一些明确限制:

  • 表达式必须可赋值:只建议写 x / x.y / x[i] 这类“左值”。不要写 a + b、函数调用、可选链(a?.b)等。
  • 不支持 v-model 参数/修饰符v-model:titlev-model.trim/.number/.lazy 目前不会按 Vue 语义生效(会当作普通 v-model 处理,可能导致行为不符合预期)。
  • 仅对部分表单元素做了专门映射(见下表)。其他标签会退化为 value + bind:input 并给出编译警告。

当前内置映射(实现位于 packages/weapp-vite/src/plugins/vue/compiler/template.ts):

标签绑定属性事件赋值来源
input(默认/text)valuebind:input$event.detail.value
input type="checkbox"checkedbind:change$event.detail.value(实现为 best-effort)
input type="radio"checkedbind:change$event.detail.value
textareavaluebind:input$event.detail.value
selectvaluebind:change$event.detail.value
switch / checkboxcheckedbind:change$event.detail.value
slider / pickervaluebind:change$event.detail.value

建议:复杂/非标准表单(如 radio-group / checkbox-group)或自定义组件,优先使用显式 :value + @input/@change,或者用 wevuctx.bindModel() 自己定义 event/valueProp/parser

Released under the MIT License.