当前位置:首页 > 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.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 属性控制:

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指令实现源码

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

相关文章

uniapp项目源码

uniapp项目源码

Uniapp 项目源码获取方式 官方示例与模板 Uniapp 官方提供了多个开源项目模板和示例,涵盖基础框架、UI组件库等。可通过以下途径获取: 在 DCloud 插件市场 搜索“uniapp…

uniapp游戏源码

uniapp游戏源码

获取UniApp游戏源码的途径 开源平台 GitHub、Gitee等平台提供大量UniApp开发的游戏源码,搜索关键词如“uniapp game demo”或“uniapp 游戏源码”,可找到类似《2…

如何阅读java源码

如何阅读java源码

阅读Java源码的方法 选择合适的源码项目 初学者建议从JDK核心类库(如java.lang、java.util)或知名开源项目(如Spring、Guava)入手。选择文档完善、社区活跃的项目能降低理…

如何看java源码

如何看java源码

查阅官方文档和源码 Java的官方文档和源码是学习Java源码的最佳起点。Oracle官网提供了Java Development Kit (JDK)的下载,其中包含完整的源码。下载JDK后,可以在安装…

vue的指令实现

vue的指令实现

Vue 指令的实现方式 Vue 指令是带有 v- 前缀的特殊属性,用于在 DOM 元素上应用响应式行为。Vue 提供了一些内置指令(如 v-model、v-if),同时也支持自定义指令。 内置指令…

vue实现散点图源码

vue实现散点图源码

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