小程序{{ }}和vue{{ }}语法的区别

核心原因:{{ }} 是「单向绑定」,不是双向绑定

在微信小程序里,WXML 中的 {{ }} 只负责 数据 → 视图 一个方向:

例如:

<switch type="switch" checked="{{switchChecked}}" bindchange="switchChange" />

data.switchChecked ──{{ }}渲染──▶ 视图上 switch 的显示状态

它只做一件事:读取 switchChecked 的值,把开关渲染成对应状态。它没有能力反向写回 switchChecked。

对比一下:

框架 写法 方向

Vue v-model="switchChecked" 双向(读 + 写)

小程序 checked="{{switchChecked}}" 仅单向(读)

小程序里没有 v-model 这种语法糖。用户拨动开关时,框架只是根据新状态重绘视图,但不会自动去改 data.switchChecked。

那值从哪来?

用户操作产生的「新值」不会自己跑进 data,它被放在 事件对象 里,需要你手动接住:

code

用户拨动 switch

└─▶ 触发 bindchange 事件

└─▶ 事件对象 e.detail.value = 新的 true/false

└─▶ 你必须 setData 才能写回 data

所以完整链路是「视图 → 事件 → setData → data → 视图」,缺了 bindchange + setData 这一环,switchChecked 就永远停在初始值。

换个角度理解

checked="{{switchChecked}}" 相当于一句只读的赋值:

js

// 它等价于:把 switchChecked 读出来给 checked,仅此而已

switch.checked = data.switchChecked; // 方向:data → view

它并不是:

js

// 小程序不支持这种自动回写

switchChecked = switch.checked; // 方向:view → data(需要你自己做)

一个容易踩的坑

如果只写 checked="{{switchChecked}}" 而不接 bindchange,会出现「开关点了会弹回」的现象:

你拨动开关 → 视图短暂变化

但没有任何 setData 改 switchChecked

下一次渲染时,框架又用 switchChecked(还是旧值)重新渲染 → 开关被「拉回」原状

这也正是你之前 console.log(this.data.switchChecked) 一直是 false 的根本原因:{{ }} 从来没有、也不会去改这个变量。

一句话总结:{{ }} 只读不写,想让开关状态存进 data,必须靠 bindchange 拿到 e.detail.value 再 setData 写回去。

相关推荐
程序员海军3 小时前
用了两年多 GPT,我最近开始换模型了,还折腾了个求职避坑 Agent
前端·人工智能·后端
zttbee4 小时前
echarts图表tooltip色块失效
前端·javascript·echarts
excel5 小时前
IndexNow:让搜索引擎更快发现网站更新的主动通知协议
前端·后端·架构
子兮曰5 小时前
CSS 复现 23 种设计风格:从拟物到液态玻璃的成本阶梯与兜底写法【实战】
前端·css·视觉设计
虚无境6 小时前
如何用AI帮我写出实用的插件
前端·javascript·ai编程
柳杉7 小时前
从数字化到数智化:3D 可视化大屏的下一个五年
前端·ai编程·数据可视化
濮水大叔7 小时前
函数式与对象式:前端架构的两种成本曲线
vue.js·react.js·函数式编程
风骏时光牛马7 小时前
从零到实战:AI全栈学习进阶路线
前端
FRing038 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
用户360055579008 小时前
Kestrel_VLLM - 15 · decode 优化四连击:19ms → 8ms
前端