指南
基础
- 安装
- 介绍
- Vue 实例
- 模板语法
- 计算属性和侦听器
- 类和样式绑定
- 条件渲染
- 列表渲染
- 事件处理
- 表单输入绑定
- 组件基础
组件深入
- 组件注册
- Props
- 自定义事件
- 插槽
- 动态和异步组件
- 处理边缘情况
过渡和动画
- 进入/离开和列表过渡
- 状态过渡
可复用性和组合
- 混入
- 自定义指令
- 渲染函数和 JSX
- 插件
- 过滤器
工具
- 单文件组件
- 测试
- TypeScript 支持
- 生产部署
扩展
- 路由
- 状态管理
- 服务器端渲染
- 安全
内部机制
- 深入响应性
迁移
- 从 Vue 1.x 迁移
- 从 Vue Router 0.7.x 迁移
- 从 Vuex 0.6.x 迁移到 1.0
- 迁移到 Vue 2.7
元数据
- 与其他框架的比较
- 加入 Vue.js 社区!
- 认识团队
自定义指令
简介
除了核心提供的默认指令集 (v-model
和 v-show
) 之外,Vue 还允许您注册自己的自定义指令。请注意,在 Vue 2.0 中,代码复用和抽象的主要形式是组件 - 但是,在某些情况下,您可能需要对普通元素进行一些低级 DOM 访问,而这正是自定义指令仍然有用的地方。例如,将焦点设置到输入元素,就像这样
当页面加载时,该元素将获得焦点(注意:autofocus
在移动 Safari 上不起作用)。事实上,如果您自访问此页面后没有点击任何其他内容,上面的输入框现在应该处于焦点状态。现在让我们构建一个实现此功能的指令
|
如果您想在本地注册指令,组件也接受 directives
选项
|
然后在模板中,您可以在任何元素上使用新的 v-focus
属性,就像这样
|
钩子函数
指令定义对象可以提供多个钩子函数(所有函数都是可选的)
bind
:仅在指令首次绑定到元素时调用一次。您可以在此处执行一次性设置工作。inserted
:当绑定元素已插入其父节点时调用(这仅保证父节点存在,不一定在文档中)。update
:在包含组件的 VNode 更新后调用,但可能在其子节点更新之前。指令的值可能已更改也可能未更改,但您可以通过比较绑定的当前值和旧值来跳过不必要的更新(请参阅下面关于钩子参数的内容)。
componentUpdated
:在包含组件的 VNode 及其子节点的 VNode 更新后调用。unbind
:仅在指令从元素解除绑定时调用一次。
我们将在下一节中探讨传递给这些钩子的参数(即 el
、binding
、vnode
和 oldVnode
)。
指令钩子参数
指令钩子传递以下参数
el
:指令绑定的元素。这可用于直接操作 DOM。binding
:包含以下属性的对象。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
中,arg 为"foo"
。modifiers
:包含修饰符(如果有)的对象。例如,在v-my-directive.foo.bar
中,修饰符对象为{ foo: true, bar: true }
。
vnode
:由 Vue 编译器生成的虚拟节点。有关完整详细信息,请参阅 VNode API。oldVnode
:先前虚拟节点,仅在update
和componentUpdated
钩子中可用。
除了 el
之外,您应该将这些参数视为只读,并且永远不要修改它们。如果您需要在钩子之间共享信息,建议通过元素的 dataset 进行共享。
使用某些这些属性的自定义指令示例
|
|
动态指令参数
指令参数可以是动态的。例如,在 v-mydirective:[argument]="value"
中,argument
可以根据我们组件实例中的数据属性进行更新!这使得我们的自定义指令在整个应用程序中灵活使用。
假设您想创建一个自定义指令,允许您使用固定定位将元素固定到页面上。我们可以创建一个自定义指令,其中值以像素更新垂直定位,就像这样
|
|
这将使元素固定在页面顶部 200 像素处。但是,如果我们遇到需要从左侧而不是顶部固定元素的情况,该怎么办?这时,动态参数非常有用,它可以根据每个组件实例进行更新
|
|
结果
我们的自定义指令现在足够灵活,可以支持几种不同的用例。
函数简写
在许多情况下,您可能希望在 bind
和 update
上具有相同的行为,但并不关心其他钩子。例如
|
对象字面量
如果您的指令需要多个值,您也可以传入 JavaScript 对象字面量。请记住,指令可以接受任何有效的 JavaScript 表达式。
|
|