찾다
웹 프론트엔드View.jsvue에서 사용자 정의 명령어 사용에 대한 간략한 분석

최근 프로젝트에서는 Vue의 사용자 정의 지침을 많이 사용했습니다. 동료 및 다른 친구들의 연구에 따르면 많은 사람들이 Vue에서 제공하는 이 기능을 거의 사용하지 않는 것으로 나타났습니다. 그래서 나는 내 사용 방법 중 일부를 정리하고 친구들과 공유하여 모든 사람들이 사용자 정의 지침의 기능을 무시하고 우리 솔루션에 다른 옵션을 추가하지 않도록 할 것입니다.

사용자 정의 지시어

Vue에 내장된 일련의 명령(예: v-model 또는 v-show) 외에도 Vue에서는 다음을 허용합니다. 사용자 정의 명령을 등록하려면 사용자 정의 지시문을 사용하세요. v-model 或 v-show) 之外,Vue 还允许你注册自定义的指令 (Custom Directives)。

两种在 Vue 中重用代码的方式:组件组合式函数。组件是主要的构建模块,而组合式函数则侧重于有状态的逻辑。另一方面,自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。

一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。钩子函数会接收到指令所绑定元素作为其参数。【相关推荐:vuejs视频教程web前端开发

更为详细的介绍可参考 Vue 官方文档:cn.vuejs.org/guide/reusa…

Quick Start

Vue 自定义指令有全局注册局部注册两种方式。

先来看看注册全局指令的方式,通过 Vue.directive( id, [definition] )方式注册全局指令。然后在入口文件中进行 Vue.use()调用。

批量注册指令,新建 src/directives/index.js 文件:

import fitColumns from './fit-columns'
import enterToInput from './enter-to-input'
import resizeHeight from './resize-height'
import resizeWidth from './resize-width'
import inputFilter from './input-filter'
import copy from './copy'
import longpress from './longpress'
import clickOutside from './click-outside'
import emoji from './emoji'

const directives = {
  fitColumns,
  enterToInput,
  resizeHeight,
  resizeWidth,
  inputFilter,
  copy,
  longpress,
  clickOutside,
  emoji
}

export default {
  install(Vue) {
    Object.keys(directives).forEach((key) => {
      Vue.directive(key, directives[key])
    })
  }
}

在 main.js 引入并调用:

// .....

import Directives from '@/directives'
Vue.use(Directives)

//.....

接下来就要开发具体的自定义指令了,那么开发的要领,以及一些开发技术点还是要先赘述一遍。

Vue2版本: 一个指令定义对象可以提供如下几个钩子函数 (均为可选):

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
  • inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
  • update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。
  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

指令钩子函数会被传入以下参数

  • el:指令所绑定的元素,可以用来直接操作 DOM。

  • binding:一个对象,包含以下 property:

    • name:指令名,不包括 v- 前缀。
    • value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2
    • oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    • expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"
    • arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"
    • modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }
  • vnodeVue에서 코드를 재사용하는 두 가지 방법: 구성요소 결합 가능한 기능

    . 구성 요소는 기본 구성 요소인 반면, 구성된 함수는 상태 저장 논리에 중점을 둡니다. 반면에 사용자 지정 지시문은 기본적으로 일반 요소에 대한 기본 DOM 액세스와 관련된 논리를 재사용하기 위한 것입니다. 🎜🎜사용자 지정 지시문은 유사한 구성 요소 수명 주기 후크가 포함된 개체로 정의됩니다. 후크 함수는 명령어가 바인딩된 요소를 매개변수로 받습니다. [관련 권장사항: vuejs 비디오 튜토리얼🎜, 웹 프론트엔드 개발🎜】🎜🎜자세한 소개는 Vue 공식 문서를 참조하세요: cn.vuejs .org/guide/reusa…🎜🎜

    빠른 시작🎜🎜Vue 사용자 정의 지침에는 🎜글로벌 등록🎜과 🎜로컬 등록🎜이라는 두 가지 방법이 있습니다. 🎜🎜먼저 전역 지시어를 등록하는 방법을 살펴보겠습니다. Vue.directive(id, [definition])을 통해 전역 지시어를 등록합니다. 그런 다음 항목 파일에서 Vue.use() 호출을 수행합니다. 🎜🎜일괄 등록 지침, 새 src/directives/index.js 파일 만들기: 🎜
    const clickOutside = {
      bind: function(el, binding, vnode) {
        el.clickOutsideEvent = function(event) {
          if (!(el === event.target || el.contains(event.target))) {
            vnode.context[binding.expression](event)
          }
        }
        document.body.addEventListener('click', el.clickOutsideEvent)
      },
      unbind: function(el) {
        document.body.removeEventListener('click', el.clickOutsideEvent)
      }
    }
    
    export default clickOutside
    🎜main.js 소개 및 호출: 🎜
    const copy = {
      bind: function(el, binding) {
        el.addEventListener('click', function() {
          const textToCopy = binding.value
          const input = document.createElement('input')
          input.setAttribute('value', textToCopy)
          document.body.appendChild(input)
          input.select()
          document.execCommand('copy')
          document.body.removeChild(input)
        })
      }
    }
    
    export default copy
    🎜다음 단계는 특정 사용자 지정 지침을 개발하는 것이므로 개발 필수 사항과 일부 개발 아직 기술적인 부분을 먼저 짚어볼 필요가 있어요. 🎜🎜Vue2 버전: 명령어 정의 객체는 다음과 같은 🎜후크 기능🎜을 제공할 수 있습니다(모두 선택 사항): 🎜
    • bind: 한 번만 호출되고 명령어가 처음 바인딩될 때 호출됩니다. 요소가 할당될 때. 여기에서 일회성 초기화 설정을 수행할 수 있습니다.
    • 삽입: 바인딩된 요소가 상위 노드에 삽입될 때 호출됩니다(상위 노드만 존재하도록 보장되지만 반드시 문서에 삽입될 필요는 없습니다).
    • update: 구성 요소의 VNode가 업데이트될 때 호출되지만 🎜 하위 VNode가 업데이트되기 전에 발생할 수도 있습니다 🎜. 지시어의 값은 변경되었을 수도 있고 변경되지 않았을 수도 있습니다. 하지만 업데이트 전과 후의 값을 비교하면 불필요한 템플릿 업데이트를 무시할 수 있습니다.
    • comComponentUpdated: 명령어가 위치한 구성 요소의 모든 VNode 🎜 및 해당 하위 VNode🎜가 업데이트된 후에 호출됩니다.
    • unbind: 명령이 요소에서 바인딩 해제될 때 한 번만 호출됩니다.
    🎜명령 후크 기능은 다음 🎜매개변수🎜에 전달됩니다: 🎜
    • 🎜el: 명령에 바인딩된 요소는 다음 작업에 사용될 수 있습니다. DOM을 직접 운영합니다. 🎜
    • 🎜바인딩: 다음 속성을 포함하는 개체: 🎜
      • name: v를 제외한 명령 이름 - 접두사.
      • value: 명령의 바인딩 값입니다. 예를 들어 v-my-directive="1 + 1"에서 바인딩 값은 다음과 같습니다. 2.
      • oldValue: 명령에 의해 바인딩된 이전 값이며 updatecomComponentUpdated 후크에서만 사용할 수 있습니다. 값이 변경되었는지 여부에 관계없이 사용할 수 있습니다.
      • 표현: 문자열 형식의 명령어 표현입니다. 예를 들어 v-my-directive="1 + 1"에서 표현식은 "1 + 1"입니다.
      • arg: 명령에 전달되는 매개변수, 선택사항. 예를 들어 v-my-directive:foo에서 매개변수는 "foo"입니다.
      • modifiers: 수정자를 포함하는 개체입니다. 예: v-my-directive.foo.bar에서 수정자 개체는 { foo: true, bar: true }입니다.
    • 🎜vnode: Vue 컴파일로 생성된 가상 노드입니다. 자세한 내용을 알아보려면 🎜VNode API🎜로 이동하세요. 🎜
    • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

    Tips:除了 el 之外,其它参数都应该是只读的,切勿进行修改。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。

    Vue3版本:有稍微变化,由于本文主要说的都是 Vue2 版本的(也是手上很多 vue2 版本的老项目在维护),Vue3的就不做详细介绍了,感兴趣可查看: cn.vuejs.org/guide/reusa…

    实战

    vue에서 사용자 정의 명령어 사용에 대한 간략한 분석

    以下都是我在项目中用到的自定义指令,特此分享出来,供大家参考。同时也不敢保证 100% 无bug,如果在您的使用场景中如有 bug,还望留言批评指导。

    1、click-outside.js

    场景:clickOutside 自定义指令可以应用于需要在点击元素外部时触发某些操作的场景,例如:

    • 点击外部关闭弹窗:当用户点击弹窗外部时,需要关闭弹窗并执行一些操作,例如清空输入框、重置表单等。

    • 点击外部隐藏下拉菜单:当用户点击下拉菜单外部时,需要隐藏下拉菜单并执行一些操作,例如清空搜索框、重置筛选条件等。

    • 点击外部取消选中状态:当用户点击选中元素外部时,需要取消选中状态并执行一些操作,例如清空选中项、重置状态等。

    总之,clickOutside 自定义指令可以帮助我们实现一些常见的交互需求,提升用户体验和操作效率。

    const clickOutside = {
      bind: function(el, binding, vnode) {
        el.clickOutsideEvent = function(event) {
          if (!(el === event.target || el.contains(event.target))) {
            vnode.context[binding.expression](event)
          }
        }
        document.body.addEventListener('click', el.clickOutsideEvent)
      },
      unbind: function(el) {
        document.body.removeEventListener('click', el.clickOutsideEvent)
      }
    }
    
    export default clickOutside

    2、copy.js

    场景: copy 自定义指令可以应用于需要实现一键复制文本内容的场景,例如:

    • 复制分享链接:当用户点击分享按钮时,需要将当前页面的分享链接复制到剪贴板中,方便用户分享给其他人。

    • 复制优惠码:当用户点击领取优惠券按钮时,需要将优惠码复制到剪贴板中,方便用户在购物时使用。

    • 复制代码片段:当用户需要复制代码片段时,可以通过点击复制按钮,将代码片段复制到剪贴板中,方便用户在编辑器中粘贴使用。

    总之,copy 自定义指令可以帮助我们实现一些常见的复制操作,提升用户体验和操作效率。

    const copy = {
      bind: function(el, binding) {
        el.addEventListener('click', function() {
          const textToCopy = binding.value
          const input = document.createElement('input')
          input.setAttribute('value', textToCopy)
          document.body.appendChild(input)
          input.select()
          document.execCommand('copy')
          document.body.removeChild(input)
        })
      }
    }
    
    export default copy

    3、emoji.js

    场景: emoji 自定义指令可以应用于需要在输入框中插入表情符号的场景,例如:

    • 发送表情消息:当用户在聊天应用中发送消息时,可以通过点击表情按钮,在输入框中插入表情符号,丰富聊天内容。

    • 评论点赞:当用户在社交应用中对评论进行点赞时,可以通过点击点赞按钮,在评论框中插入点赞表情符号,表达自己的情感。

    • 表情搜索:当用户需要在输入框中插入特定的表情符号时,可以通过输入表情名称或关键字,筛选出符合条件的表情符号,方便用户选择使用。

    总之,emoji 自定义指令可以帮助我们实现在输入框中插入表情符号的功能,提升用户体验和操作效率。

    // 在指令的inserted钩子函数中,定义一个正则表达式,用来匹配表情及特殊字符。
    // 在指令的update钩子函数中,判断输入框的值是否发生变化,如果变化了,则使用正则表达式来过滤输入框的值。
    // 在指令的unbind钩子函数中,清除事件监听器,避免内存泄漏。
    const emoji = {
      inserted: function(el) {
        el.addEventListener('input', function() {
          const reg = /[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDFFF]|[\u200D\uFE0F\uFE00-\uFE0F]/g
          el.value = el.value.replace(reg, '')
        })
      },
      update: function(el) {
        const reg = /[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDFFF]|[\u200D\uFE0F\uFE00-\uFE0F]/g
        el.value = el.value.replace(reg, '')
      },
      unbind: function(el) {
        el.removeEventListener('input')
      }
    }
    
    export default emoji

    4、enter-to-input.js

    场景: enter-to-input 自定义指令可以应用于需要在输入框中按下回车键时触发特定操作的场景,例如:

    • 搜索框回车搜索:当用户在搜索框中输入关键字后,按下回车键时,可以触发搜索操作,快速获取搜索结果。

    • 发送消息:当用户在聊天应用中输入完消息后,按下回车键时,可以触发发送消息操作,方便快捷地发送消息。

    • 提交表单:当用户在表单中填写完信息后,按下回车键时,可以触发提交表单操作,快速提交表单信息。

    总之,enter-to-input 自定义指令可以帮助我们实现在输入框中按下回车键时触发特定操作的功能,提升用户体验和操作效率。

    const enterToInput = {
      inserted: function(el) {
        let inputs = el.querySelectorAll('input')
        // 绑定回写事件
        for (var i = 0; i < inputs.length; i++) {
          inputs[i].setAttribute(&#39;keyFocusIndex&#39;, i)
          inputs[i].addEventListener(&#39;keyup&#39;, ev => {
            if (ev.keyCode === 13) {
              const targetTo = ev.srcElement.getAttribute(&#39;keyFocusTo&#39;)
              if (targetTo) {
                this.$refs[targetTo].$el.focus()
              } else {
                var attrIndex = ev.srcElement.getAttribute(&#39;keyFocusIndex&#39;)
                var ctlI = parseInt(attrIndex)
                inputs = el.querySelectorAll(&#39;input&#39;)
                if (ctlI < inputs.length - 1) inputs[ctlI + 1].focus()
              }
            }
          })
        }
      }
    }
    
    export default enterToInput

    5、fit-columns.js

    场景: fit-columns 自定义指令可以应用于需要自动调整表格列宽的场景,例如:

    • 数据展示:当我们需要在页面上展示大量数据时,可以使用表格进行展示,通过 fit-columns 自定义指令可以自动调整表格列宽,使得数据更加清晰易读。

    • 数据编辑:当我们需要在页面上编辑表格数据时,可以使用表格进行编辑,通过 fit-columns 自定义指令可以自动调整表格列宽,使得编辑更加方便快捷。

    • 数据导出:当我们需要将表格数据导出为 Excel 或 CSV 格式时,可以使用表格进行导出,通过 fit-columns 自定义指令可以自动调整表格列宽,使得导出的数据更加美观。

    总之,fit-columns 自定义指令可以帮助我们实现自动调整表格列宽的功能,提升数据展示、编辑和导出的效率和美观度。

    import &#39;./fit-columns.css&#39;
    
    function adjustColumnWidth(table, padding = 0) {
      const colgroup = table.querySelector(&#39;colgroup&#39;)
      const colDefs = [...colgroup.querySelectorAll(&#39;col&#39;)]
      colDefs.forEach((col) => {
        const clsName = col.getAttribute(&#39;name&#39;)
        const clsWidth = col.getAttribute(&#39;width&#39;)
        if (clsWidth < 200) return
        const cells = [
          ...table.querySelectorAll(`td.${clsName}`),
          ...table.querySelectorAll(`th.${clsName}`)
        ]
        if (cells[0] && cells[0].classList && cells[0].classList.contains && cells[0].classList.contains(&#39;leave-alone&#39;)) {
          return
        }
        const widthList = cells.map((el) => {
          return el.querySelector(&#39;.cell&#39;) && el.querySelector(&#39;.cell&#39;).scrollWidth || 0
        })
        const max = Math.max(...widthList)
        table.querySelectorAll(`col[name=${clsName}]`).forEach((el) => {
          // console.log(222, max + padding)
          el.setAttribute(&#39;width&#39;, max + padding > 500 ? 500 : max + padding)
        })
      })
    }
    
    const fitColumns = {
      update() { },
      bind() { },
      inserted(el, binding) {
        setTimeout(() => {
          adjustColumnWidth(el, binding.value)
        }, 300)
      },
      componentUpdated(el, binding) {
        el.classList.add(&#39;r-table&#39;)
        setTimeout(() => {
          adjustColumnWidth(el, binding.value)
        }, 300)
      },
      unbind() { }
    }
    
    export default fitColumns

    5.1、fit-columns.css

    .el-table.r-table .cell {
      display: inline-block;
      /* white-space: nowrap; */
      width: auto;
      overflow: auto;
    }
    
    .el-table.r-table .el-table__body-wrapper {
      overflow-x: auto;
    }

    6、input-filter.js

    场景: input-filter 自定义指令可以应用于需要对用户输入进行过滤和限制的场景,例如:

    • 输入框过滤:当我们需要在输入框中输入特定类型的数据时,可以使用 input-filter 自定义指令对用户输入进行过滤和限制,例如只允许输入数字、字母或特定字符等。

    • 表单验证:当我们需要对表单中的数据进行验证时,可以使用 input-filter 自定义指令对用户输入进行过滤和限制,例如验证手机号码、邮箱地址等。

    • 密码输入:当我们需要用户输入密码时,可以使用 input-filter 自定义指令对用户输入进行过滤和限制,例如限制密码长度、只允许输入特定字符等。

    总之,input-filter 自定义指令可以帮助我们实现对用户输入进行过滤和限制的功能,提升表单验证和数据输入的效率和准确性。

    const findEle = (parent, type) => {
      return parent.tagName.toLowerCase() === type
        ? parent
        : parent.querySelector(type)
    }
    
    const trigger = (el, type) => {
      const e = document.createEvent(&#39;HTMLEvents&#39;)
      e.initEvent(type, true, true)
      el.dispatchEvent(e)
    }
    
    const inputFilter = {
      mounted(el, binding, vnode) {
        const bindV = binding.value
        const regRule = bindV.regRule ? bindV.regRule : /[^\a-zA-Z0-9\u4E00-\u9FA5]+$/g
        const length = bindV.length ? bindV.length : 30
        const $inp = findEle(el, &#39;input&#39;)
        el.$inp = $inp
        $inp.handle = () => {
          const val = $inp.value
          $inp.value = val.replace(regRule, &#39;&#39;).substring(0, length)
    
          trigger($inp, &#39;input&#39;)
        }
        $inp.addEventListener(&#39;keyup&#39;, $inp.handle)
      },
      unmounted(el) {
        el.$inp.removeEventListener(&#39;keyup&#39;, el.$inp.handle)
      }
    }
    
    export default inputFilter

    7、longpress.js

    场景: longpress 自定义指令可以应用于需要长按触发事件的场景,例如:

    按钮长按:当我们需要在按钮上长按触发某个事件时,可以使用 longpress 自定义指令,例如长按删除按钮可以删除某个元素。 图片预览:当我们需要在图片上长按触发预览事件时,可以使用 longpress 自定义指令,例如长按图片可以弹出预览框。 列表操作:当我们需要在列表中长按触发某个操作时,可以使用 longpress 自定义指令,例如长按列表项可以弹出操作菜单。

    总之,longpress 自定义指令可以帮助我们实现长按触发事件的功能,提升用户体验和操作效率。

    // 在 bind 钩子函数中绑定了 mousedown、touchstart、click、mouseout、touchend 和 touchcancel 事件。
    // 当用户按下鼠标或触摸屏时,我们会启动一个定时器,如果在指定的时间内没有松开鼠标或手指,则执行指令的回调函数。
    // 如果用户在指定的时间内松开了鼠标或手指,则取消定时器。
    const longpress = {
      bind: function(el, binding) {
        let pressTimer = null
        const duration = binding.value || 500 // 默认长按时间为 500ms
    
        const start = function(event) {
          if (event.type === &#39;click&#39; && event.button !== 0) {
            return
          }
    
          if (pressTimer === null) {
            pressTimer = setTimeout(() => {
              handler()
            }, duration)
          }
        }
    
        const cancel = function() {
          if (pressTimer !== null) {
            clearTimeout(pressTimer)
            pressTimer = null
          }
        }
    
        const handler = function() {
          binding.value()
        }
    
        el.addEventListener(&#39;mousedown&#39;, start)
        el.addEventListener(&#39;touchstart&#39;, start)
    
        el.addEventListener(&#39;click&#39;, cancel)
        el.addEventListener(&#39;mouseout&#39;, cancel)
        el.addEventListener(&#39;touchend&#39;, cancel)
        el.addEventListener(&#39;touchcancel&#39;, cancel)
      }
    }
    
    export default longpress

    8、resize-height.js

    场景: resize-height 自定义指令可以应用于需要根据内容自适应高度的场景,例如:

    • 文本框自适应高度:当我们需要在文本框中输入多行文本时,可以使用 resize-height 自定义指令,使文本框根据内容自适应高度,避免内容溢出或留白。

    • 评论框自适应高度:当我们需要在评论框中输入多行文本时,可以使用 resize-height 自定义指令,使评论框根据内容自适应高度,提升用户体验和操作效率。

    • 动态列表自适应高度:当我们需要在动态列表中展示不同高度的内容时,可以使用 resize-height 自定义指令,使列表项根据内容自适应高度,避免内容溢出或留白。

    总之,resize-height 自定义指令可以帮助我们实现根据内容自适应高度的功能,提升用户体验和界面美观度。

    const resizeHeight = {
      // 绑定时调用
      bind(el, binding) {
        let height = &#39;&#39;
        function isResize() {
          // 可根据需求,调整内部代码,利用 binding.value 返回即可
          const style = document.defaultView.getComputedStyle(el)
          if (height !== style.height) {
            // 此处关键代码,通过此处代码将数据进行返回,从而做到自适应
            binding.value({ height: style.height })
          }
          height = style.height
        }
        // 设置调用函数的延时,间隔过短会消耗过多资源
        el.__vueSetInterval__ = setInterval(isResize, 100)
      },
      unbind(el) {
        clearInterval(el.__vueSetInterval__)
      }
    }
    
    export default resizeHeight

    9、resize-width.js

    场景: resize-width 自定义指令可以应用于需要根据内容自适应宽度的场景,例如:

    • 图片自适应宽度:当我们需要在页面中展示不同宽度的图片时,可以使用 resize-width 自定义指令,使图片根据内容自适应宽度,避免图片变形或溢出。

    • 表格自适应宽度:当我们需要在页面中展示不同宽度的表格时,可以使用 resize-width 自定义指令,使表格根据内容自适应宽度,避免表格变形或溢出。

    • 动态列表自适应宽度:当我们需要在动态列表中展示不同宽度的内容时,可以使用 resize-width 自定义指令,使列表项根据内容自适应宽度,避免内容变形或溢出。

    总之,resize-width 自定义指令可以帮助我们实现根据内容自适应宽度的功能,提升用户体验和界面美观度。

    const resizeWidth = {
      // 绑定时调用
      bind(el, binding) {
        let width = &#39;&#39;
        function isResize() {
          // 可根据需求,调整内部代码,利用binding.value返回即可
          const style = document.defaultView.getComputedStyle(el)
          if (width !== style.width) {
            // 此处关键代码,通过此处代码将数据进行返回,从而做到自适应
            binding.value({ width: style.width })
          }
          width = style.width
        }
        // 设置调用函数的延时,间隔过短会消耗过多资源
        el.__vueSetInterval__ = setInterval(isResize, 100)
      },
      unbind(el) {
        clearInterval(el.__vueSetInterval__)
      }
    }
    
    export default resizeWidth

    原理

    Vue2 自定义指令的原理可以简单概括为:通过 Vue.directive() 方法注册指令,当指令被绑定到元素上时,Vue 会创建一个指令实例,该实例包含指令的钩子函数和其他配置项,然后根据指令的生命周期钩子函数,依次执行相应的逻辑,例如 bind、inserted、update、componentUpdated 和 unbind 等。

    具体来说,Vue2 自定义指令的原理包括以下几个方面:

    • 注册指令:通过 Vue.directive() 方法注册指令,该方法接收两个参数,第一个参数是指令名称,第二个参数是一个对象,包含指令的钩子函数和其他配置项。

    • 创建指令实例:当指令被绑定到元素上时,Vue 会创建一个指令实例,该实例包含指令的钩子函数和其他配置项。

    • 指令钩子函数执行:当指令实例被创建后,Vue 会根据指令的生命周期钩子函数,依次执行相应的逻辑,例如 bind、inserted、update、componentUpdated 和 unbind 等。

    • 操作 DOM:在指令钩子函数中,我们可以通过 el 参数获取到指令绑定的元素,然后对元素进行操作,例如修改元素的样式、属性或内容等。

    • 注销指令:当指令被解绑或元素被销毁时,Vue 会调用指令的 unbind 钩子函数,我们可以在该函数中清除指令创建的事件监听器、定时器或其他资源。

    总之,Vue2 自定义指令的原理是通过注册指令、创建指令实例、执行指令钩子函数、操作 DOM 和注销指令等步骤来实现的,通过这些步骤,我们可以实现各种自定义指令的功能。

    小结

    最后,就是想通过这一系列自定义指令的使用,理解 Vue 开放这个 API 的意义,以及我们使用的意义。

    Vue 使用自定义指令的意义在于可以扩展 Vue 的功能,让我们可以通过自定义指令来实现一些特定的需求,例如:

    • 操作 DOM:通过自定义指令,我们可以直接操作 DOM 元素,例如修改元素的样式、属性或内容等。

    • 封装组件:通过自定义指令,我们可以封装一些常用的组件功能,例如滚动加载、拖拽排序、表单验证等,使得我们可以在多个组件中复用这些功能。

    • 提高可读性:通过自定义指令,我们可以将一些常用的操作封装成指令,使得代码更加简洁易懂,提高了代码的可读性。

    • 解耦逻辑:通过自定义指令,我们可以将一些逻辑与组件解耦,使得组件更加专注于视图的渲染,而逻辑则由指令来处理。

    总之,Vue 使用自定义指令的意义在于可以扩展 Vue 的功能,使得我们可以更加方便地实现一些特定的需求,提高了代码的可读性和可维护性。

    (学习视频分享:vuejs入门教程编程基础视频

위 내용은 vue에서 사용자 정의 명령어 사용에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 掘金社区에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
vue.js Virtual Dom이 변경을 감지하면 어떻게됩니까?vue.js Virtual Dom이 변경을 감지하면 어떻게됩니까?May 14, 2025 am 12:12 AM

whenthevue.jsvirtualdomdetectsachange, itupdatesthevirtualdom, diffsit 및 apppliesminimalchangestotherealdom.이 기능성이 높은 성능 byavoidingunnecessarydommomanipulations.

Vue.js의 가상 Dom을 실제 Dom의 거울로 생각하는 것이 얼마나 정확합니까?Vue.js의 가상 Dom을 실제 Dom의 거울로 생각하는 것이 얼마나 정확합니까?May 13, 2025 pm 04:05 PM

vue.js의 가상은 모두 진짜 돔의 거울이며 정확히 아닙니다. 1. 생성 및 업데이트 : vue.js는 구성 요소 정의를 기반으로 가상 트리를 생성하고 상태가 변경 될 때 먼저 가상을 업데이트합니다. 2. 차이 및 패치 : Diff 작업을 통한 기존 및 새로운 가상의 비교 및 ​​실제 DOM에 최소 변경 사항 만 적용합니다. 3. 효율성 : 가상도는 배치 업데이트를 허용하고 직접 DOM 운영을 줄이며 렌더링 프로세스를 최적화합니다. Virtualdom은 vue.js가 UI 업데이트를 최적화 할 수있는 전략적 도구입니다.

vue.js vs. React : 확장 성과 유지 가능성vue.js vs. React : 확장 성과 유지 가능성May 10, 2025 am 12:24 AM

vue.js와 반응은 각각 확장 성과 유지 가능성에 고유 한 장점이 있습니다. 1) vue.js는 사용하기 쉽고 소규모 프로젝트에 적합합니다. Composition API는 대규모 프로젝트의 유지 보수성을 향상시킵니다. 2) RECT는 크고 복잡한 프로젝트에 적합하며, 후크와 가상 DOM은 성능과 유지 관리를 향상시킬 수 있지만 학습 곡선은 더 가파릅니다.

vue.js and React의 미래 : 트렌드와 예측vue.js and React의 미래 : 트렌드와 예측May 09, 2025 am 12:12 AM

vue.js 및 React의 미래 추세와 예측은 다음과 같습니다. 1) vue.js는 엔터프라이즈 레벨 애플리케이션에서 널리 사용되며 서버 측 렌더링 및 정적 사이트 생성에서 획기적인 결과를 얻었습니다. 2) RECT는 서버 구성 요소 및 데이터 수집에서 혁신하고 동시성 모델을 더욱 최적화합니다.

Netflix의 프론트 엔드 : 기술 스택에 대한 깊은 다이빙Netflix의 프론트 엔드 : 기술 스택에 대한 깊은 다이빙May 08, 2025 am 12:11 AM

Netflix의 프론트 엔드 기술 스택은 주로 React 및 Redux를 기반으로합니다. 1. 반응은 고성능 단일 페이지 응용 프로그램을 구축하는 데 사용되며 구성 요소 개발을 통해 코드 재사용 성 및 유지 보수를 향상시킵니다. 2. Redux는 상태 변경이 예측 가능하고 추적 할 수 있도록 국가 관리에 사용됩니다. 3. 도구 체인에는 코드 품질과 성능을 보장하기위한 웹 팩, 바벨, 농담 및 효소가 포함됩니다. 4. 성능 최적화는 코드 세분화, 게으른로드 및 서버 측 렌더링을 통해 사용자 경험을 향상시킵니다.

vue.js 및 프론트 엔드 : 대화식 사용자 인터페이스 구축vue.js 및 프론트 엔드 : 대화식 사용자 인터페이스 구축May 06, 2025 am 12:02 AM

vue.js는 대화 형 사용자 인터페이스를 구축하는 데 적합한 점진적인 프레임 워크입니다. 핵심 기능에는 응답 시스템, 구성 요소 개발 및 라우팅 관리가 포함됩니다. 1) 응답 시스템은 Object.DefineProperty 또는 프록시를 통한 데이터 모니터링을 실현하고 인터페이스를 자동으로 업데이트합니다. 2) 구성 요소 개발을 통해 인터페이스를 재사용 가능한 모듈로 분할 할 수 있습니다. 3) Vuerouter는 단일 페이지 응용 프로그램을 지원하여 사용자 경험을 향상시킵니다.

vuejs의 단점은 무엇입니까?vuejs의 단점은 무엇입니까?May 05, 2025 am 12:06 AM

vue.js의 주요 단점은 다음과 같습니다. 1. 생태계는 비교적 새롭고 타사 라이브러리와 도구는 다른 프레임 워크만큼 풍부하지 않습니다. 2. 학습 곡선은 복잡한 기능에서 가파르게됩니다. 3. 지역 사회 지원과 자원은 반응과 각도만큼 광범위하지 않다. 4. 대규모 응용 프로그램에서 성능 문제가 발생할 수 있습니다. 5. 버전 업그레이드 및 호환성 문제가 더 큽니다.

Netflix : 프론트 엔드 프레임 워크를 공개합니다Netflix : 프론트 엔드 프레임 워크를 공개합니다May 04, 2025 am 12:16 AM

Netflix는 React를 프론트 엔드 프레임 워크로 사용합니다. 1. 반응의 구성 요소 개발 및 가상 DOM 메커니즘은 성능 및 개발 효율성을 향상시킵니다. 2. Webpack 및 Babel을 사용하여 코드 구성 및 배포를 최적화하십시오. 3. 성능 최적화를 위해 코드 세분화, 서버 측 렌더링 및 캐싱 전략을 사용하십시오.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.