首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 7 章 处理用户交互
7.1 事件的监听与处理
7.1.1 事件监听示例
7.1.2 多事件处理
7.1.3 事件修饰符
7.2 Vue中的事件类型
7.2.1 常用的事件类型
7.2.2 按键修饰符
7.3 实战一:随鼠标移动的小球
7.4 实战二:弹球游戏
第 8 章 组件基础
8.1 关于Vue应用与组件
8.1.1 Vue应用的数据配置选项
8.1.2 定义组件
8.2 组件中数据与事件的传递
8.2.1 为组件添加外部属性
8.2.2 处理组件事件
8.2.3 在组件上使用v-model指令
8.3 自定义组件的插槽
8.3.1 组件插槽的基本用法
8.3.2 多具名插槽的用法
8.4 动态组件的简单应用
8.5 实战:开发一款小巧的开关按钮组件
第 9 章 组件进阶
9.1 组件的生命周期与高级配置
9.1.1 生命周期方法
9.1.2 应用的全局配置选项
9.1.3 组件的注册方式
9.2 组件props属性的高级用法
9.2.1 对props属性进行验证
9.2.2 props的只读性质
9.2.3 组件数据注入
9.3 组件Mixin技术
9.3.1 使用Mixin来定义组件
9.3.2 Mixin选项的合并
9.3.3 进行全局Mixin
9.4 使用自定义指令
9.4.1 认识自定义指令
9.4.2 自定义指令的参数
9.5 组件的Teleport功能
第 10 章 Vue响应性编程
10.1 响应性编程原理与在Vue中的应用
10.1.1 手动追踪变量的变化
10.1.2 Vue中的响应性对象
10.1.3 独立的响应性值Ref的应用
10.2 响应式的计算与监听
10.2.1 关于计算变量
10.2.2 监听响应式变量
10.3 组合式API的应用
10.3.1 关于setup方法
10.3.2 在setup方法中定义生命周期行为
10.4 实战:支持搜索和筛选的用户列表示例
10.4.1 常规风格的示例工程开发
10.4.2 使用组合式API重构用户列表页面
当前位置:
首页>>
技术小册>>
TypeScript和Vue从入门到精通(三)
小册名称:TypeScript和Vue从入门到精通(三)
### 9.4 使用自定义指令 在Vue.js框架中,自定义指令(Custom Directives)是Vue提供的一种强大机制,允许开发者定义自己的DOM操作逻辑,并将其封装成可复用的单元。这种机制在Vue 2.x版本中尤为常见,用于处理那些Vue核心指令(如`v-model`、`v-for`等)无法直接实现的复杂DOM行为。随着Vue 3的发布,虽然Composition API等新特性让自定义指令的使用场景有所变化,但其作为直接操作DOM的有效手段,依然有着不可替代的地位。特别是在TypeScript与Vue结合的项目中,利用TypeScript的强类型特性,可以使自定义指令的开发更加严谨和高效。 #### 9.4.1 自定义指令基础 在Vue中,自定义指令以`v-`开头(但并非必须),但通常我们会遵循这一约定以保持一致性。自定义指令可以全局注册,也可以局部注册在组件内。全局注册的自定义指令可在任何组件中使用,而局部注册的则仅限于注册它的组件及其子组件。 **全局注册自定义指令** ```javascript // Vue 2.x 示例 Vue.directive('focus', { // 当被绑定的元素插入到DOM中时…… inserted: function (el) { // 聚焦元素 el.focus(); } }); // Vue 3.x 示例,通过app实例注册 const app = Vue.createApp({}); app.directive('focus', { mounted(el) { el.focus(); } }); ``` 注意:Vue 3中将`inserted`钩子重命名为`mounted`,以更好地反映其实际执行时机(即在元素被插入到DOM后)。 **局部注册自定义指令** ```vue <template> <div> <input v-focus> </div> </template> <script> export default { directives: { focus: { // 指令定义 mounted(el) { el.focus(); } } } } </script> ``` #### 9.4.2 自定义指令钩子 自定义指令可以包含几个钩子函数(对于Vue 3,钩子名称有所变化),这些钩子在指令的不同生命周期阶段被调用: - **bind / beforeMount(Vue 3)**:只调用一次,指令第一次绑定到元素上时调用。在这里可以进行一次性的初始化设置。 - **inserted / mounted(Vue 3)**:被绑定元素插入父节点时调用(保证父节点存在,但不一定已被插入文档中)。 - **update**:所在组件的VNode更新时调用,但是可能发生在其子VNode更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。 - **componentUpdated**:指令所在组件的VNode及其子VNode全部更新后调用。 - **unbind / unmounted(Vue 3)**:只调用一次,指令与元素解绑时调用。 #### 9.4.3 TypeScript与自定义指令的结合 在TypeScript项目中,定义自定义指令时可以利用TypeScript的类型系统来增强指令的健壮性和可维护性。这包括为钩子函数提供准确的参数类型,以及利用TypeScript的接口或类型别名来定义指令选项的结构。 **示例:使用TypeScript定义自定义指令** ```typescript // 定义指令选项的类型 interface FocusOptions { delay?: number; // 可选延迟聚焦的时间 } // 使用TypeScript的泛型来定义指令 const focusDirective: Vue.DirectiveOptions = { mounted(el: HTMLElement, binding: Vue.DirectiveBinding<FocusOptions>) { if (binding.value !== false) { // 如果指令的值不是false,则聚焦 setTimeout(() => { el.focus(); }, binding.arg ? parseInt(binding.arg, 10) : 0); // 使用binding.arg作为延迟时间,如果没有则立即聚焦 } } }; // 在Vue 3中注册 const app = Vue.createApp({}); app.directive('focus', focusDirective); // 或者在组件中局部注册 export default { directives: { focus: focusDirective } } ``` 在这个例子中,`focusDirective`是一个通用的自定义指令,它接受一个可选的`delay`参数作为聚焦前的延迟时间。通过TypeScript的泛型`Vue.DirectiveBinding<FocusOptions>`,我们能够为`binding`参数提供准确的类型信息,这包括了传递给指令的值(`value`)、参数(`arg`)、修饰符(`modifiers`)等。 #### 9.4.4 自定义指令的高级用法 自定义指令不仅可以用于简单的DOM操作,如自动聚焦,还可以扩展到更复杂的场景,如监听DOM事件、动态样式绑定、复杂的数据验证等。 **示例:监听DOM事件并动态更新数据** ```typescript const clickOutsideDirective: Vue.DirectiveOptions = { mounted(el: HTMLElement, binding: Vue.DirectiveBinding<() => void>, vnode: Vue.VNode) { function clickHandler(event: MouseEvent) { // 检查点击事件是否发生在元素外部 if (!(el === event.target || el.contains(event.target as Node))) { // 如果是,则执行绑定的函数 if (typeof binding.value === 'function') { binding.value(); } } } // 监听文档点击事件 document.addEventListener('click', clickHandler); // 清理工作 el.__vueClickOutside__ = clickHandler; }, unmounted(el: HTMLElement) { // 移除事件监听器 if (el.__vueClickOutside__) { document.removeEventListener('click', el.__vueClickOutside__); delete el.__vueClickOutside__; } } }; // 注册并使用 // ... ``` 这个自定义指令`v-click-outside`允许你监听元素外部的点击事件,并在事件发生时执行一个回调函数。这在实现如下拉菜单、模态框等组件时非常有用,可以轻松地关闭它们而不必担心内部元素的点击事件被误触发。 #### 9.4.5 小结 自定义指令是Vue中一项强大的功能,它允许开发者以声明式的方式将复杂的DOM逻辑封装成可复用的单元。在TypeScript与Vue结合的项目中,利用TypeScript的类型系统可以进一步提升自定义指令的健壮性和可维护性。无论是简单的自动聚焦,还是复杂的DOM事件监听和数据绑定,自定义指令都能提供灵活的解决方案。通过深入学习自定义指令的原理和使用方法,你可以更加灵活地控制Vue应用中的DOM行为,提升开发效率和代码质量。
上一篇:
9.3.3 进行全局Mixin
下一篇:
9.4.1 认识自定义指令
该分类下的相关小册推荐:
Vue.js从入门到精通(二)
Vue面试指南
TypeScript和Vue从入门到精通(二)
Vue.js从入门到精通(一)
Vue3技术解密
TypeScript和Vue从入门到精通(一)
vue项目构建基础入门与实战
Vue源码完全解析
VUE组件基础与实战
移动端开发指南
TypeScript和Vue从入门到精通(五)
Vue.js从入门到精通(四)