当前位置:首页 > VUE

vue指令实现源码

2026-02-19 23:09:02VUE

Vue 指令实现源码解析

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

指令注册与初始化

Vue 指令通过 Vue.directive 方法注册,注册后的指令会存储在 Vue.options.directives 中。初始化时,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 元素上。

// 指令解析逻辑(简化版)
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指令实现源码

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

相关文章

如何调试react源码

如何调试react源码

调试React源码的方法 克隆React源码仓库到本地: git clone https://github.com/facebook/react.git cd react 安装依赖并构建开发版本:…

vue compile源码实现

vue compile源码实现

Vue 的模板编译(compile)是将模板字符串转换为渲染函数的过程,涉及解析、优化和代码生成三个阶段。以下是其核心实现原理的分析: 解析阶段(Parse) 将模板字符串转换为抽象语法树(AS…

vue 指令实现原理

vue 指令实现原理

Vue 指令的实现原理 Vue 指令是 Vue.js 提供的一种特殊属性,用于在 DOM 元素上绑定特定的行为。指令的实现原理主要涉及以下几个核心机制: 指令的注册与解析 Vue 通过 Vue.di…

vue axios实现登录源码

vue axios实现登录源码

以下是一个基于Vue.js和Axios实现登录功能的完整示例代码,包含前端和后端交互逻辑: 前端部分(Vue组件) 安装Axios依赖: npm install axios 登录组件(Lo…

vue指令实现常见功能

vue指令实现常见功能

v-model 实现双向数据绑定 v-model 用于表单元素(如 <input>、<textarea>、<select>)与数据的双向绑定。 <te…

vue实现轮播图源码

vue实现轮播图源码

Vue 轮播图实现方法 使用 Vue 实现轮播图可以通过原生开发或借助第三方库(如 Swiper)完成。以下是两种常见实现方式: 原生 Vue 实现轮播图 核心代码示例: <templ…