当前位置:首页 > 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指令实现源码

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 指令实现的源码解析,主要分为核心实现逻辑和常见指令示例: Vue 指令核心实现 Vue 的指令系统通过 directives 模块实现,核心代码位于 src/core/vdom/mo…

vue的指令if实现

vue的指令if实现

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

vue中指令实现原理

vue中指令实现原理

Vue 指令的实现原理 Vue 指令(Directives)是带有 v- 前缀的特殊属性,用于在 DOM 元素上应用一些特殊行为。Vue 指令的实现原理主要基于以下几个核心机制: 编译阶段解析指令…

react 如何做源码分析

react 如何做源码分析

理解React源码结构 React源码托管在GitHub上,主要分为packages目录,包含核心模块如react、react-dom、scheduler等。每个模块功能独立,通过协同工作实现整体功能…

react实现指令

react实现指令

React 实现指令式操作 在 React 中实现指令式操作通常涉及直接操作 DOM 或调用组件方法。React 推崇声明式编程,但在某些场景(如聚焦输入框、触发动画等)需要指令式操作。 使用 us…

如何查看java源码

如何查看java源码

查看Java源码的方法 通过IDE直接查看 大多数集成开发环境(IDE)如IntelliJ IDEA或Eclipse支持直接查看Java源码。在代码中按住Ctrl键(Windows/Linux)或Co…