返回专题首页

Vue 专题

模板基础:指令、事件、条件渲染、列表渲染与 key

模板通常是很多人进入 Vue 的第一站,因为它看起来最像“立刻能写页面”的部分。但模板并不只是语法层,它实际上是 Vue 把状态和视图连接起来的第一层表达系统。你在模板里怎么写条件、循环、事件和绑定,直接决定了页面是否清晰、是否稳定、是否容易维护。

Vue 专题第 04 篇 / 26 篇6 分钟

模板通常是很多人进入 Vue 的第一站,因为它看起来最像“立刻能写页面”的部分。但模板并不只是语法层,它实际上是 Vue 把状态和视图连接起来的第一层表达系统。你在模板里怎么写条件、循环、事件和绑定,直接决定了页面是否清晰、是否稳定、是否容易维护。

所以这一篇不只是过一遍指令表,而是重点讲模板里的几个高频判断:什么时候该在模板里表达,什么时候不该;key 为什么重要;条件渲染和列表渲染为什么经常引出诡异 bug;事件和数据绑定该怎样保持边界。

模板到底在 Vue 里扮演什么角色?

模板的核心职责,是用一种接近 HTML 的方式,把“当前状态下页面应该长什么样”表达出来。也就是说,模板不是用来堆业务逻辑的,而是用来描述界面结构和状态映射关系的。

一个健康的模板通常有几个特征:

  • 结构关系清楚;
  • 渲染条件明确;
  • 循环来源稳定;
  • 事件意图简单;
  • 复杂判断尽量提前放回脚本层。

如果模板里开始充满多层三元表达式、复杂函数调用、隐式副作用,那么它虽然“还能跑”,可读性和稳定性都会迅速下降。

指令为什么是 Vue 模板的核心?

Vue 之所以比纯 HTML 更适合复杂页面,一个关键就在于指令。因为指令把常见的界面动态行为变成了结构化表达,比如:

  • 文本和属性绑定;
  • 事件监听;
  • 条件显示;
  • 列表渲染;
  • 双向输入。

真正重要的不是把名字背下来,而是知道指令背后对应的是哪类界面意图。只要意图清楚,模板就会自然很多;如果意图模糊,模板就会长成“什么都能写进去的大杂烩”。

事件绑定为什么不只是“点击一下执行方法”?

很多项目里的模板问题,都是从事件写法开始变乱的。因为事件绑定真正承载的是“用户意图如何进入系统”。

一个更稳的习惯通常是:

  • 模板里只表达事件入口;
  • 业务判断尽量回到脚本层;
  • 事件命名能体现动作语义;
  • 避免在模板里写过长的内联逻辑。

比如点击保存、删除、切换状态,这些动作本质上都是“意图声明”,模板不应该顺手把整段业务流程也塞进去。

条件渲染最容易出什么问题?

条件渲染看起来很简单,但在真实页面里经常和下面这些东西缠在一起:

  • 权限;
  • 加载态;
  • 空状态;
  • 错误态;
  • 设备类型;
  • 表单分支联动。

如果条件建模不清楚,模板里很快就会出现多层嵌套判断,最后谁也搞不清哪种组合状态下页面应该显示什么。

更成熟的做法通常是:

  • 先把页面状态抽象清楚;
  • 再让模板只负责表达这些状态;
  • 对复杂条件提前在脚本里整理成更稳定的派生状态。

这样模板才会保持“读得懂”,而不是只能“运行得起来”。

列表渲染为什么总离不开 key

很多人一开始会把 key 理解成“Vue 为了性能要求你写的一个属性”。这个理解太轻了。key 的真正作用,是帮助框架在列表更新时稳定识别每一项的身份。

这件事非常关键,因为列表场景里经常会发生:

  • 新增;
  • 删除;
  • 排序;
  • 分页切换;
  • 条件筛选;
  • 局部展开和编辑。

如果身份不稳定,框架就可能把旧节点复用到错误位置,最终出现输入框串值、局部状态错位、动画异常等诡异问题。

key 的核心不是“有”,而是“稳定”

这意味着:

  • 优先使用业务主键;
  • 不要在可重排列表里用索引当 key;
  • 不要让 key 随渲染周期随机变化;
  • 对局部子树切换也要意识到 key 会影响复用与重建。

只要理解“key 是节点身份”,很多模板问题就不会再停留在经验记忆层。

列表渲染为什么经常和性能、状态错位一起出现?

因为列表天然就是界面复杂度最高的地方之一。它同时涉及:

  • 数据量;
  • 渲染频率;
  • 节点复用;
  • 子项状态;
  • 局部编辑与交互。

所以列表不是“会循环输出就结束”的主题。一个成熟的 Vue 页面里,列表通常还要继续思考:

  • 数据来源是否稳定;
  • key 是否可靠;
  • 子项组件是否过重;
  • 是否需要分页、虚拟列表或懒渲染;
  • 交互状态应该留在行内还是提升到父层。

模板里哪些逻辑不应该硬写?

一个很实用的判断是:如果这段逻辑让模板开始承担“推理”工作,而不是“表达”工作,就该考虑回到脚本层。

典型例子包括:

  • 多层嵌套条件判断;
  • 重复格式化逻辑;
  • 一长串权限与状态组合计算;
  • 需要复用的显示规则;
  • 有副作用或高成本的函数调用。

模板最适合做的是“把结果表达出来”,而不是临时计算整套业务规则。

把模板基础放回项目里,该怎样理解?

真正成熟的模板通常遵循一条简单原则:

1. 模板负责表达结构;2. 脚本负责整理状态;3. 样式负责视觉;4. 复杂规则尽量在进入模板前先被整理干净。

这会直接影响团队协作。因为模板如果干净,其他人一眼就能看懂页面结构;模板如果充满临时逻辑,后续任何改动都容易破坏原有关系。

最常见的模板误区

1. 把模板当成任意 JavaScript 执行区

结果是页面结构和业务逻辑糊成一团。

2. 觉得 key 只是“消除警告”

最后在列表重排和表单编辑场景里踩很多隐蔽坑。

3. 条件分支太多,却不先整理页面状态

模板会迅速变成阅读灾难。

4. 事件绑定里塞太多内联逻辑

短期方便,长期可维护性很差。

总结

Vue 模板的重点,不是会写几条指令,而是知道模板应该表达什么、不该承担什么。指令负责把动态界面结构化,事件负责承接用户意图,条件渲染负责表达页面状态,列表渲染和 key 则负责让节点身份和交互状态保持稳定。只要你始终记住“模板负责表达,复杂逻辑提前整理”,后面写复杂页面时会稳很多。