当前位置:首页 > VUE

vue for循环源码实现

2026-02-24 14:20:06VUE

Vue 中 v-for 的源码实现

Vue 的 v-for 指令通过编译器和运行时协作实现循环渲染。其核心逻辑位于虚拟 DOM 的 patch 阶段,通过 diff 算法高效更新列表。

模板编译阶段

模板中的 v-for 会被编译器转换为 _lrenderList)函数调用。例如:

<div v-for="(item, index) in items" :key="item.id">{{ item.name }}</div>

编译为:

_l(items, (item, index) => _c('div', { key: item.id }, [_v(_s(item.name))]))

运行时实现

_l 函数(src/core/instance/render-helpers/list.js)会遍历数组或对象,为每个元素生成对应的 VNode:

export function renderList (
  val: any,
  render: (
    val: any,
    keyOrIndex: string | number,
    index?: number
  ) => VNode
): ?Array<VNode> {
  if (Array.isArray(val)) {
    return val.map((item, i) => render(item, i))
  } else if (typeof val === 'number') {
    return new Array(val).fill(null).map((_, i) => render(i + 1, i))
  } else if (isObject(val)) {
    return Object.keys(val).map(key => render(val[key], key))
  }
}

Key 的作用

patch 阶段(src/core/vdom/patch.js),Vue 通过 sameVnode 比较 key 和标签类型:

function sameVnode (a, b) {
  return (
    a.key === b.key &&
    a.tag === b.tag &&
    /* 其他条件 */
  )
}

Key 帮助 Vue 识别节点身份,实现高效的原地复用或重新排序。

性能优化策略

对于大型列表,Vue 的 diff 算法采用双端比较策略:

  1. 新旧节点首尾交叉对比
  2. 建立 key 到 index 的映射表
  3. 移动而非重新创建可复用的 DOM 节点

响应式更新机制

items 变化时:

  1. 依赖收集系统触发组件重新渲染
  2. 新的 _l 调用生成新的 VNode 数组
  3. patch 阶段通过 diff 算法最小化 DOM 操作

这种实现方式平衡了声明式编程的便利性和手动优化的性能控制能力。

vue for循环源码实现

标签: 源码vue
分享给朋友:

相关文章

vue点击实现排序

vue点击实现排序

实现点击排序的方法 在Vue中实现点击排序功能,可以通过以下几种方式完成: 使用计算属性结合排序方法 定义一个响应式数据存储排序状态,通过计算属性动态返回排序后的数组。点击事件切换排序状态。…

vue实现选中单元格

vue实现选中单元格

Vue 实现选中单元格的方法 基础实现思路 在 Vue 中实现选中单元格功能,通常可以通过动态绑定 class 或 style 来实现。以下是一个基于表格的简单实现示例: <templ…

vue列表实现

vue列表实现

Vue 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…

vue 实现级联

vue 实现级联

Vue 实现级联选择器 级联选择器(Cascader)常用于省市区选择、分类选择等场景。Vue 中可以通过 Element UI、Ant Design Vue 等 UI 库实现,也可以手动封装。 使…

vue 动画 实现

vue 动画 实现

vue 动画实现方法 Vue 提供了多种方式实现动画效果,主要包括过渡动画和动态动画两类。 使用 <transition> 组件实现基础过渡 通过 Vue 内置的 <transit…

vue grid实现

vue grid实现

Vue Grid 实现方法 在 Vue 中实现网格布局可以通过多种方式完成,包括使用原生 CSS Grid、第三方组件库或自定义组件。以下是几种常见方法: 使用原生 CSS Grid 通过 Vue…