指令使用的几种方式:
// -- 实例化一个没有参数的指令
v-xxx
// -- 将值传到指令中
v-xxx="value"
// -- 将字符串传入到指令中,如`v-html="'<p>内容</p>'"`
v-xxx="'string'"
// -- 传参数(`arg`),如`v-bind:class="className"`
v-xxx:arg="value"
// -- 使用修饰符(`modifier`)
v-xxx:arg.modifier="value"
无参数指令
最基本的自定义指令只有一个名称,不接受任何参数也没有任何修饰符。示例:
<template>
<div class="demo-content">
<p v-blue>This is a demo!</p>
</div>
</template>
<script>
export default {
name: 'demo',
data () {
return {
}
},
directives: {
blue: {
bind: (el, binding, vnode) => {
el.style.color = "blue"
}
}
},
methods: {
}
}
</script>
<style lang='less'>
.demo-content {
width: 600px;
height: 200px;
}
</style>
页面效果:
将值传入指令中
上面的例子中看到,无参数指令不是很通用,如果需要两个样式不一样,则需要编写另一个自定义指令,这种做法显然不够灵活。
所以,创建一个新的自定义指令,此自定义指令将采用传递给它的值。
示例:
<template>
<div class="demo-content">
<p v-demo="'red'">This is a demo 1!</p>
<p v-demo="'yellow'">This is a demo 2!</p>
</div>
</template>
<script>
export default {
name: 'demo',
data () {
return {
}
},
directives: {
demo: {
bind: (el, binding) => {
el.style.background = binding.value
}
}
},
methods: {
}
}
</script>
<style lang='less'>
.demo-content {
width: 600px;
height: 200px;
}
</style>
页面效果:
参数
自定义指令也可以在指令名称后面加上冒号表示参数。示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 自定义指令demo</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<p v-demo:top>This is a demo at top.</p>
<p v-demo:bottom>This is a demo at bottom.</p>
</div>
<script>
Vue.directive('demo', {
bind: (el, binding) => {
const loc = binding.arg === "bottom" ? "bottom" : "top";
el.style.position = "fixed";
el.style[loc] = 0;
if (loc === "bottom") {
el.style.background = "yellow";
} else {
el.style.background = "pink";
}
}
})
// 创建根实例
new Vue({
el: '#app'
})
</script>
</body>
</html>
页面效果:
修饰符
修饰符是由 xxx.
表示的特殊后缀,表示指令应该以某种特殊方式被绑定,修饰符控制指令的行为。示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 自定义指令demo</title>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<p v-demo.underline>This is a demo 1!</p>
<!-- 可以使用链式指令在指令上使用***多个修饰符 -->
<p v-demo.bold.highlight.underline>This is a demo 2!</p>
</div>
<script>
Vue.directive('demo', function(el, binding, vnode) {
const modifiers = binding.modifiers;
if (modifiers.underline) {
el.style.textDecoration = "underline";
}
if (modifiers.bold) {
el.style.fontWeight = "bold";
}
if (modifiers.highlight) {
el.style.background = "pink";
}
})
// 创建根实例
new Vue({
el: '#app'
})
</script>
</body>
</html>
如上所示,可以根据需要向自定义指令添加任意数量的修饰符。
上面创建一个名为 demo
的新自定义指令,此自定义指令将接受以下一个或多个修饰符:
-
underline
-
bold
-
highlight
v-demo
的绑定参数是一个对象,该对象包含自定义指令的所有修饰符。 绑定上的修饰符实际上也是一个对象, 该对象将包含已应用的每个修改器的键。
页面效果: