vue3项目如何在render函数中使用自定义指令

一、定义自定义指令

js 复制代码
// directives/inputQuantity.js
const inputQuantity = {
  mounted(el, binding) {
    el.addEventListener('input', (e) => {
      // 验证输入值
      const value = e.target.value
      const min = binding.value?.min || 0
      const max = binding.value?.max || Infinity
      
      if (/^\d*$/.test(value)) {
        let numValue = parseInt(value) || min
        
        // 限制范围
        if (numValue < min) numValue = min
        if (numValue > max) numValue = max
        
        // 更新模型值
        binding.instance[numValue] = numValue
        el.value = numValue
      } else {
        el.value = binding.value?.lastValid || min
      }
      
      binding.value.lastValid = el.value
    })
  }
}

export default inputQuantity

二、注册指令

全局注册(main.js):

js 复制代码
import { createApp } from 'vue'
import inputQuantity from './directives/inputQuantity'

const app = createApp(App)
app.directive('input-quantity', inputQuantity)

组件内注册:

js 复制代码
import inputQuantity from './directives/inputQuantity'

export default {
  directives: {
    'input-quantity': inputQuantity
  },
  // ...
}

三、在 render 函数中使用自定义指令

在 render 函数中使用指令需要用到vue的两个内部函数 resolveDirectivewithDirectives;

resolveDirective用于解析指令;

withDirectives函数把指令注册对应的VNode对象上

js 复制代码
import { h, withDirectives, resolveDirective } from 'vue'

export default {
  render() {
    // 解析自定义指令
    const vInputQuantity = resolveDirective('input-quantity')
    
    // 创建基础 input 节点
    const inputNode = h('input', {
      type: 'number',
      value: this.quantity,
      class: 'quantity-input'
    })
    
    // 应用自定义指令
    return withDirectives(inputNode, [
      [
        vInputQuantity, 
        { 
          min: 1, 
          max: 100,
          lastValid: 1
        }
      ],
      // 可同时添加其他指令
      ```
      [resolveDirective('focus'), { autoFocus: true }]
    ])
  }
}
相关推荐
Hilaku3 分钟前
这几个CSS和JS新特性,将在2026年变流行
前端·javascript·css
拾光拾趣录3 分钟前
如何高效判断DOM元素是否进入可视区域
前端·性能优化·dom
阿白的白日梦5 分钟前
为 Vue3 + TypeScript + Vite 项目配置 Prettier代码格式化
前端
外啫啫5 分钟前
基于n-scrollbar,滚动到列表指定位置
前端
好奇de悟空7 分钟前
复合二进制文档 - 文档结构提取(中篇)
前端·javascript
好奇de悟空8 分钟前
复合二进制文档 - msi文件信息提取(下篇)
前端·javascript
Running_C11 分钟前
深入理解 HTTP 缓存:从原理到实践
前端·面试
布兰妮甜11 分钟前
Vite:下一代前端构建工具的革命
前端·javascript·vite·构建工具
極光未晚12 分钟前
从 2.3MB 到 280KB:我是如何给前端 JS「瘦」身的
前端·javascript·性能优化
前端大卫13 分钟前
从一次线上问题聊聊 JS 事件循环
前端·javascript