Vue 的数据驱动与 MVVM 边界
面试怎么问Vue 怎样把状态变化变成页面变化?为什么常说它借鉴了 MVVM?
查看背诵答案与代码
Vue 是声明式、组件化的视图框架:先用模板描述状态与页面的关系,渲染时收集响应式依赖,状态变化后调度组件更新,再把新旧虚拟节点的差异应用到真实 DOM。用户操作通过事件修改状态,表单还能用 v-model 简化输入绑定。它借鉴了模型、视图与视图模型的分离思想,但这不代表所有数据都双向流动;组件通信仍以 props 向下传递、emit 向上表达意图为基本约定。
记住这几个点
- 状态是页面的来源,优先改状态,让渲染器更新页面。
- 模板负责声明展示关系,事件负责把用户操作转成状态变化。
- 响应式负责发现依赖变化,渲染器负责更新真实 DOM。
- v-model 是特定输入场景的绑定约定,组件 props 仍遵守单向数据流。
<script setup>
import { ref } from 'vue'
const name = ref('小林')
const editing = ref(false)
</script>
<template>
<p>你好,{{ name }}</p>
<input v-if="editing" v-model="name" />
<button @click="editing = !editing">编辑</button>
</template>
不能把 MVVM 等同于所有组件数据双向绑定,也不能把响应式系统与虚拟 DOM diff 当成同一个步骤。
常见追问:用了 Vue 后是不是完全不能操作 DOM?
可以在聚焦、测量尺寸或接入第三方库时使用模板引用操作 DOM。业务展示仍应由状态驱动,避免手动改页面内容后又被下一次渲染覆盖。