除了默认设置的核心指令( v-model 和 v-show ),Vue 也允许注册自定义指令。注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而,有的情况下,你仍然需要对纯 DOM 元素进行底层操作,这时候就会用到自定义指令。下面这个例子将聚焦一个 input 元素,像这样:
当页面加载时,元素将获得焦点。事实上,你访问后还没点击任何内容,input 就获得了焦点。现在让我们完善这个指令:
// 注册一个全局自定义指令 v-focus
Vue.directive("focus", {
// 当绑定元素插入到 DOM 中。
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
也可以注册局部指令,组件中接受一个 directives 的选项:
directives: {
focus: {
// 指令的定义---
}
}
然后你可以在模板中任何元素上使用新的 v-focus 属性:
<input v-focus>
指令定义函数提供了几个钩子函数(可选):
接下来我们来看一下钩子函数的参数 (包括 el,binding,vnode,oldVnode) 。
钩子函数被赋予了以下参数:
除了 el 之外,其它参数都应该是只读的,尽量不要修改他们。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。
一个使用了这些参数的自定义钩子样例:
<div id="hook-arguments-example" v-demo:hello.a.b="message"></div>
Vue.directive("demo", {
bind: function (el, binding, vnode) {
var s = JSON.stringify
el.innerHTML =
"name: " + s(binding.name) + "<br>" +
"value: " + s(binding.value) + "<br>" +
"expression: " + s(binding.expression) + "<br>" +
"argument: " + s(binding.arg) + "<br>" +
"modifiers: " + s(binding.modifiers) + "<br>" +
"vnode keys: " + Object.keys(vnode).join(", ")
}
})
new Vue({
el: "#hook-arguments-example",
data: {
message: "hello!"
}
})
结果:
name: "demo"
value: "hello!"
expression: "message"
argument: "hello"
modifiers: {"a":true,"b":true}
vnode keys: tag, data, children, text, elm, ns, context, functionalContext, key, componentOptions, child, parent, raw, isStatic, isRootInsert, isComment, isCloned, isOnce
大多数情况下,我们可能想在 bind 和 update 钩子上做重复动作,并且不想关心其它的钩子函数。可以这样写:
Vue.directive("color-swatch", function (el, binding) {
el.style.backgroundColor = binding.value
})
如果指令需要多个值,可以传入一个 JavaScript 对象字面量。记住,指令函数能够接受所有合法类型的 Javascript 表达式。
<div v-demo="{ color: "white", text: "hello!" }"></div>
Vue.directive("demo", function (el, binding) {
console.log(binding.value.color) // => "white"
console.log(binding.value.text) // => "hello!"
})
需要服务端渲染(SSR)吗?在开始服务端渲染前,我们先看看它能给我们带来什么,以及什么时候需要用它。SEO(搜索引擎优化)谷歌...
监听事件可以用v-on指令监听 DOM 事件来触发一些 JavaScript 代码。示例:div id="example-1"button v-on:click="counter += 1"...
稳定性: 2 - 不稳定流用于处理Node.js中的流数据的抽象接口,在Node里被不同的对象实现。例如,对HTTP服务器的请求是流,process...
稳定性: 2 - 不稳定Node.js域包含了能把不同的IO操作看成单独组的方法。如果任何一个注册到域的事件或者回调触发error事件,或者...
MongoDB是一种文档导向数据库管理系统,由C++撰写而成。本章节我们将为大家介绍如何使用 Node.js 来连接 MongoDB,并对数据库进...
关于术语的一点说明:请务必注意一点,TypeScript 1.5里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块...
简介这篇指南的目的是教你如何书写高质量的TypeScript声明文件。 我们在这里会展示一些API的文档,还有它们的使用示例, 并且阐...
TypeScript是由微软开发的自由和开源的编程语言。TypeScript是JavaScript的一个超集,从今天数以百万计的JavaScript开发者所熟悉...
1. RegExp 构造函数在 ES5 中, RegExp 构造函数的参数有两种情况。第一种情况是,参数是字符串,这时第二个参数表示正则表达式...