当前位置:首页 > 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>

编译为:

vue for循环源码实现

_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 和标签类型:

vue for循环源码实现

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
分享给朋友:

相关文章

vue实现数组

vue实现数组

Vue 实现数组操作的方法 在 Vue 中,数组的操作需要特别注意响应式的问题。Vue 提供了一些方法来确保数组的变动能够触发视图更新。 响应式数组方法 Vue 对以下数组方法进行了封装,确保它们能…

vue代理实现

vue代理实现

Vue 代理实现方法 在 Vue 项目中,配置代理可以解决开发环境下的跨域问题,通常通过修改 vue.config.js 文件实现。以下是几种常见的代理配置方式: 基础代理配置 在 vue.conf…

vue 实现评分

vue 实现评分

Vue 实现评分功能 在 Vue 中实现评分功能可以通过多种方式完成,包括使用第三方组件库或自定义实现。以下是两种常见的方法: 使用第三方组件库(如 Element UI) Element UI 提…

vue实现通讯

vue实现通讯

Vue 组件通讯方法 父子组件通讯 父组件向子组件传递数据通过 props,子组件向父组件传递数据通过 $emit 事件。 父组件模板: <child-component :message=…

vue实现队列

vue实现队列

Vue 实现队列功能 在 Vue 中实现队列功能可以通过多种方式完成,以下是几种常见的方法: 使用数组模拟队列 队列遵循先进先出(FIFO)原则,可以用数组的 push 和 shift 方法模拟入队…

vue 实现hover

vue 实现hover

Vue 实现 Hover 效果的方法 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 伪类 :hover 最简单的方式是直接使用 CSS 的 :hov…