当前位置:首页 > VUE

vue指令实现源码

2026-01-19 06:46:54VUE

以下是 Vue 指令实现的源码解析,主要分为核心实现逻辑和常见指令示例:

Vue 指令核心实现

Vue 的指令系统通过 directives 模块实现,核心代码位于 src/core/vdom/modules/directives.js。关键实现逻辑如下:

// 指令钩子函数
export default {
  create: updateDirectives,
  update: updateDirectives,
  destroy: function unbindDirectives(vnode) {
    updateDirectives(vnode, emptyNode)
  }
}

function updateDirectives(oldVnode, vnode) {
  if (oldVnode.data.directives || vnode.data.directives) {
    _update(oldVnode, vnode)
  }
}

指令注册机制

指令通过 Vue.directive() 全局注册或组件选项的 directives 局部注册:

vue指令实现源码

// 全局注册
Vue.directive('focus', {
  inserted: function (el) {
    el.focus()
  }
})

// 局部注册
new Vue({
  directives: {
    focus: {
      inserted: function (el) {
        el.focus()
      }
    }
  }
})

常见内置指令实现

v-model

双向绑定实现原理(以 input 为例):

function model(el, dir, _warn) {
  const value = dir.value
  const modifiers = dir.modifiers
  const tag = el.tag

  if (tag === 'input') {
    el.addEventListener('input', () => {
      context[value] = el.value
    })
  }
}

v-show

通过 CSS display 属性控制:

vue指令实现源码

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

v-if/v-else

通过注释节点和条件渲染实现:

function processIfConditions(el, parent) {
  const prev = findPrevElement(parent.children)
  if (prev && prev.if) {
    addIfCondition(prev, {
      exp: el.elseif,
      block: el
    })
  }
}

自定义指令生命周期

指令包含以下生命周期钩子:

bind(el, binding, vnode) {
  // 只调用一次,指令第一次绑定到元素时调用
}

inserted(el, binding, vnode) {
  // 被绑定元素插入父节点时调用
}

update(el, binding, vnode, oldVnode) {
  // 所在组件的 VNode 更新时调用
}

componentUpdated(el, binding, vnode, oldVnode) {
  // 所在组件及子组件全部更新后调用
}

unbind(el, binding, vnode) {
  // 只调用一次,指令与元素解绑时调用
}

指令参数解析

binding 对象包含以下属性:

{
  name: '指令名(不带v-前缀)',
  value: '指令的绑定值',
  oldValue: '指令绑定的前一个值',
  expression: '字符串形式的指令表达式',
  arg: '传给指令的参数',
  modifiers: '包含修饰符的对象'
}

以上内容展示了 Vue 指令系统的核心实现机制,包括注册方式、生命周期管理以及常见内置指令的实现原理。

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

相关文章

vue指令实现

vue指令实现

Vue 指令实现 Vue 指令是 Vue.js 提供的特殊属性,用于在 DOM 元素上添加特殊行为。指令以 v- 前缀开头,例如 v-model、v-if、v-for 等。以下是 Vue 指令的实现方…

vue实现登录源码

vue实现登录源码

以下是一个基于 Vue.js 的登录功能实现示例,包含前端代码和关键逻辑说明: 登录页面组件 <template> <div class="login-container"&g…

jquery源码

jquery源码

jQuery 源码解析 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。其源码设计精妙,值得深入分析。 源码结构 jQue…

jquery 源码

jquery 源码

jQuery 源码解析 jQuery 是一个快速、小巧且功能丰富的 JavaScript 库。以下是其核心源码结构的解析: 核心架构 jQuery 源码采用模块化设计,核心功能包括选择器引擎、DO…

vue指令的实现

vue指令的实现

Vue 指令的实现原理 Vue 指令是 Vue.js 提供的特殊属性,用于在 DOM 元素上添加特定行为。指令的实现涉及 Vue 的编译、虚拟 DOM 和响应式系统。 指令的注册 Vue 指令可以…

vue 实现全局指令

vue 实现全局指令

注册全局指令 在 Vue 中,可以通过 Vue.directive 方法注册全局指令。全局指令可以在任何组件中使用,无需单独引入。 import Vue from 'vue'; Vue.direc…