叩丁狼

动态数据绑定 · 交互教学

单向绑定:数据 → 视图。数据源变化会自动更新 DOM,但用户操作 DOM 不会反向修改数据。适合展示只读信息(用户名、状态等)。

📊 单向数据流演示
DATA(数据层)
data.username
"游客"
data.score
0
// 操作日志
:value
单向 →
v-bind
DOM(视图层)
<span :text="username">
游客
<div :text="score">
0 分
💡 试着修改 DOM 内容——无法影响左侧数据。
只读视图

双向绑定(v-model):数据 ↔ 视图同步。输入框内容改变时数据更新,数据变化时输入框也更新。 v-model = :value + @input 的语法糖。

⌨️ 视图层(Input)
昵称 v-model
邮箱 v-model
心情 v-model
💾 数据层(reactive)
form.nick
""
form.email
""
form.mood
""
🔄 数据实时同步
点击「从数据注入」观察 反向更新 输入框
🔬 v-model 原理拆解
语法糖写法
<input v-model="form.nick" />
等价展开
<input
  :value="form.nick"
  @input="form.nick =
    $event.target.value"
/>

响应式原理:Vue 3 使用 Proxy 拦截对象读写。当数据变化时,所有依赖该数据的组件自动重新渲染。 点击中心数据源,观察所有订阅组件同步更新。

👤
UserCard 组件
count: 0
📊
Chart 组件
data: 0
reactive()
0
点击 +1
Proxy 拦截
set 触发更新
🔔
Notification 组件
msg: 0
🛒
Cart 组件
items: 0
💡 Proxy 响应式伪代码
// Vue 3 reactive 核心原理
function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key) // 收集依赖
      return target[key]
    },
    set(target, key, val) {
      target[key] = val
      trigger(target, key) // 触发更新
      return true
    }
  })
}
// 依赖收集 & 触发
const deps = new Map()

function track(target, key) {
  // 记录"谁在使用这个数据"
  deps.set(key, currentEffect)
}

function trigger(target, key) {
  // 通知所有依赖方重新执行
  const effect = deps.get(key)
  effect?.() // 重新渲染组件
}

综合演示:填写左侧表单,右侧用户卡片和 JSON 数据实时同步更新。体验完整的数据绑定闭环。

📝 编辑表单(双向绑定)
用户名
职位
头像颜色
个人简介
👁️ 实时预览(单向渲染)
🧑‍💻
(未填写)
职位未设置
暂无简介
🔍 响应式数据(JSON)
{ "name": "", "role": "", "bio": "", "color": "#1f6feb" }