Vue.js 初步入门
功能简介
我们在前端编程时,有些功能vue并没有进行封装,我们需要这些功能的时候,就需要自己进行手动封装了,vue提供了自定义指令的功能,让我们可以随心所欲进行自定义指令的封装。
举个简单的例子,如果我写了一个简单的表单,我想在一开始加载这个页面的时候就能第一时间聚焦到第一个输入账号的框上,解决方案有两种,第一种就是利用HTML5中input标签自带的属性autofocus
来自动聚焦到框上,第二种就用调用该标签的DOM中的.focus()
方法也能做到同样的效果。
这时候本着不用DOM的思想理所当然的将第二种方式进行改进,就是进行自定义指令的封装。
全局自定义指令:
Vue.directive("指令名",{钩子函数:function(el){用原生js操作el}});
局部自定义指令:directives:{指令名:{钩子函数:function(el){用原生js操作el}}
其中,el表示指令所绑定的元素,可以用来直接操作 DOM
一个指令定义对象可以提供如下几个钩子函数 (均为可选):
bind
:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
inserted
:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
update
:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
使用详情
上面的三个是常使用的钩子函数,自定义全局指令具体用法如下:
Vue.directive("focus",{
inserted:function(el){
el.focus();
}
});
<input id="inin" type="text" placeholder="我的输入框" v-focus/>
我们用v-指令名
来调用自定义的属性,效果和调用DOM时一模一样,局部指令用法如下:
new Vue({
el:"#app",
data:{
msg:'hello world'
},
directives:{focus:{
inserted:function(el){
el.focus();
}
}}
});
钩子函数还包含许多参数,比如(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 中,参数为 “foo”。modifiers
:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对- 象为 { foo: true, bar: true }。
其他指令为高级阶段,不再赘述。
函数简写
在很多时候,你可能想在 bind
和 update
时触发相同行为,而不关心其它的钩子。比如这样写:
Vue.directive("focus",{
function(el,binding){
el.focus();
console.info(binding.expression);
}
});