-
Notifications
You must be signed in to change notification settings - Fork 137
Open
Description
全局定义
我们可以用Vue.directive来全局定义一个指令,定义完之后我们就可以在对应html结构前缀v-加上directive名字来激活这个指令
- bind:只调用一次,在指令第一次绑定到元素上时调用。
- update: 在 bind 之后立即以初始值为参数第一次调用,之后每当绑定值变化时调用,参数为新值与旧值。
- unbind:只调用一次,在指令从元素上解绑时调用。
Vue.directive('cclick', {
//bind就是先帮我们绑定,但不去执行这个test()函数,而updata则是绑定完后执行一次,后面每次更新都去执行一次
bind: function(value) {
var self = this;
//指令的名字,不包含前缀 v-cclick:click="test()"中的cclick
console.log(this.name)
//指令的表达式,不包括参数和过滤器 v-cclick:click="test()"中的test()
console.log(this.expression)
//指令的参数 v-cclick:click="test()"中的click
console.log(this.arg)
this.el.addEventListener(this.arg, function(e) {
self.expression.substring(0, self.expression.length - 2);
//把test()转化为test,方便我们后面调用
//console.log(self.expression.substring(0, self.expression.length - 2));
//如果v-cclick:click="test",注意test没有加括号的时候我们就可以这样写
//self.vm[self.expression]()
self.vm[self.expression.substring(0, self.expression.length - 2)]()
});
},
})
var demo = new Vue({
el: '#demo',
data: {
name: 'wsscat'
},
methods: {
test: function() {
console.log("test test")
}
},
})
视图如下
<body id="demo">
<button v-cclick:click="test()">Ok</button>
</body>
注意这里我们该指令对应的标签受demo构造器控制,我们可以用this.expression获取函数的名字,然后用this.vm来拿到构造器里面的数据进而触发我们想要触发的方法
在这里要注意的是如果把逻辑放在了update里面定义的话test()会首先先自执行一次
当然其实我们直接这样写<button v-cclick:click="test">Ok</button>
_test_没有了两个大括号,我们获取这个函数名再去执行就更加方便了,我们就可以直接这样来执行函数了self.vm[self.expression]()
局部定义
我们还可以在构造起里面定义指令,这样就不会担心影响到其他构造器的指令了,只要在加上属性directives就可以对它进行定义了
var demo = new Vue({
el: '#demo',
data: {
msg: 'hello!',
name: 'wsscat'
},
directives: {
wsscat: {
bind: function() {
console.log("wsscat")
},
update: function(newValue, oldValue) {
console.log('new:' + newValue);
console.log('old:' + oldValue);
this.el.style.color = 'blue';
if(newValue == 'red') {
this.el.style.color = 'red';
} else if(newValue == 'yellow') {
this.el.style.color = 'yellow';
} else {
this.el.style.color = 'green';
}
}
}
}
})
视图如下
<input v-model="name" />
<p v-wsscat="name">{{name}}</p>
上面的代码我们把逻辑写在update里面,因为我们这里的name值会一直变化,第一次进来先触发一次update里面的逻辑,后面每一次name的变化都会触发update里面的逻辑,我们这里在输入框对应输入red,yellow都会有颜色的变化,所以这里update符合需求
Metadata
Metadata
Assignees
Labels
No labels