当前位置:首页 > VUE

vue指令实现源码

2026-02-19 23:09:02VUE

Vue 指令实现源码解析

Vue 指令的核心实现位于 Vue 的源码中,主要涉及指令的注册、解析、绑定和更新逻辑。以下是关键实现部分的解析:

指令注册与初始化

Vue 指令通过 Vue.directive 方法注册,注册后的指令会存储在 Vue.options.directives 中。初始化时,Vue 会遍历模板中的指令,生成对应的指令对象。

vue指令实现源码

// 指令注册示例
Vue.directive('my-directive', {
  bind(el, binding, vnode) {},
  inserted(el, binding, vnode) {},
  update(el, binding, vnode, oldVnode) {},
  componentUpdated(el, binding, vnode, oldVnode) {},
  unbind(el, binding, vnode) {}
});

指令解析与绑定

在模板编译阶段,Vue 解析模板中的指令属性(如 v-modelv-if),生成 AST(抽象语法树)。随后,在 patch 过程中,指令会被实例化并绑定到 DOM 元素上。

vue指令实现源码

// 指令解析逻辑(简化版)
function processDirectives(el, dirs, vm) {
  dirs.forEach(dir => {
    const def = vm.$options.directives[dir.name];
    if (def) {
      // 创建指令实例并调用 bind 钩子
      const directive = {
        ...def,
        def,
        name: dir.name,
        value: dir.value
      };
      callHook(directive, 'bind', el, vm);
    }
  });
}

指令更新逻辑

当响应式数据变化时,Vue 会触发指令的 update 钩子。对于需要 DOM 操作的指令(如 v-show),会在 componentUpdated 钩子中处理。

// 指令更新逻辑(简化版)
function updateDirectives(oldVnode, vnode) {
  const oldDirs = oldVnode.data.directives;
  const newDirs = vnode.data.directives;
  // 对比新旧指令,触发 update 或 componentUpdated
  for (const dir of newDirs) {
    const oldDir = oldDirs.find(d => d.name === dir.name);
    if (oldDir) {
      dir.oldValue = oldDir.value;
      callHook(dir, 'update', vnode.elm, vnode.context);
    }
  }
}

内置指令示例:v-show

v-show 的实现通过控制元素的 display 样式实现显隐:

Vue.directive('show', {
  bind(el, { value }, vnode) {
    el._originalDisplay = el.style.display;
    updateDisplay(el, value);
  },
  update(el, { value, oldValue }) {
    if (value !== oldValue) {
      updateDisplay(el, value);
    }
  },
  unbind(el) {
    el.style.display = el._originalDisplay;
  }
});

function updateDisplay(el, value) {
  el.style.display = value ? el._originalDisplay : 'none';
}

自定义指令实现要点

  1. 钩子函数:自定义指令需实现 bindupdate 等钩子,用于初始化和响应式更新。
  2. 指令参数:通过 binding 对象访问指令的值(value)、参数(arg)、修饰符(modifiers)。
  3. 清理逻辑:在 unbind 钩子中移除事件监听或定时器,避免内存泄漏。
Vue.directive('focus', {
  inserted(el) {
    el.focus();
  }
});

源码位置参考

  • 指令注册:src/core/global-api/index.js 中的 Vue.directive
  • 指令处理:src/core/vdom/modules/directives.js
  • 内置指令:src/platforms/web/runtime/directives

标签: 指令源码
分享给朋友:

相关文章

vue实现散点图源码

vue实现散点图源码

以下是一个基于 Vue 和 ECharts 实现散点图的完整源码示例,分为组件封装和基础使用两部分: 安装依赖 确保项目中已安装 ECharts 和 Vue-ECharts: npm instal…

vue指令实现拖拽

vue指令实现拖拽

Vue 指令实现拖拽功能 通过自定义指令或结合第三方库,可以轻松实现拖拽功能。以下是几种常见方法: 使用原生 HTML5 拖拽 API 通过 v-drag 自定义指令封装原生拖拽事件: Vue.d…

vue的指令if实现

vue的指令if实现

Vue 指令 v-if 的实现原理 Vue 的 v-if 指令用于条件性地渲染一块内容,其实现基于 Vue 的响应式系统和虚拟 DOM 机制。 核心实现步骤 模板编译阶段 Vue 编译器将模板中…

vue指令的实现原理

vue指令的实现原理

Vue 指令的实现原理 Vue 指令是 Vue.js 提供的特殊属性,用于在 DOM 元素上添加特定行为。其核心实现原理涉及编译、绑定和更新机制。 编译阶段 Vue 在编译模板时,会解析所有指令(如…

react源码实现视频

react源码实现视频

以下是关于React源码实现的视频资源推荐,涵盖核心概念、虚拟DOM、Fiber架构等关键内容的讲解: React源码解析视频资源 React Fiber架构深度解析 B站UP主「技术蛋」的系列视频…

js 源码实现

js 源码实现

JavaScript 源码实现通常涉及核心功能模块的编写、设计模式的应用以及性能优化。以下是关键方向和技术要点: 核心功能模块 封装基础功能时需考虑模块化设计,例如实现一个自定义事件系统: cla…