Vue的自定义控件
来源:互联网 发布:proteus怎么仿真单片机 编辑:程序博客网 时间:2024/06/07 06:40
简介
除了默认设置的核心指令( v-model
和 v-show
),Vue 也允许注册自定义指令。注意,在 Vue2.0 里面,代码复用的主要形式和抽象是组件——然而,有的情况下,你仍然需要对纯 DOM 元素进行底层操作,这时候就会用到自定义指令。下面这个例子将聚焦一个 input 元素,像这样:
当页面加载时,元素将获得焦点 (注意:在手机 Safari 上自动聚焦无效)。事实上,你访问后还没点击任何内容,input 就获得了焦点。现在让我们完善这个指令:
// 注册一个全局自定义指令 v-focusVue.directive('focus', {// 当绑定元素插入到 DOM 中。inserted: function (el) {// 聚焦元素el.focus()}})
也可以注册局部指令,组件中接受一个 directives
的选项:
directives: {focus: {// 指令的定义---}}
然后你可以在模板中任何元素上使用新的 v-focus
属性:
<input v-focus>
钩子函数
指令定义函数提供了几个钩子函数(可选):
bind
: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。inserted
: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。update
: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。componentUpdated
: 被绑定元素所在模板完成一次更新周期时调用。unbind
: 只调用一次, 指令与元素解绑时调用。
接下来我们来看一下钩子函数的参数 (包括 el
,binding
,vnode
,oldVnode
) 。
钩子函数参数
钩子函数被赋予了以下参数:
- el: 指令所绑定的元素,可以用来直接操作 DOM 。
- binding: 一个对象,包含以下属性:
- name: 指令名,不包括
v-
前缀。 - value: 指令的绑定值, 例如:
v-my-directive="1 + 1"
, value 的值是2
。 - oldValue: 指令绑定的前一个值,仅在
update
和componentUpdated
钩子中可用。无论值是否改变都可用。 - expression: 绑定值的字符串形式。 例如
v-my-directive="1 + 1"
, expression 的值是"1 + 1"
。 - arg: 传给指令的参数。例如
v-my-directive:foo
, arg 的值是"foo"
。 - modifiers: 一个包含修饰符的对象。 例如:
v-my-directive.foo.bar
, 修饰符对象 modifiers 的值是{ foo: true, bar: true }
。
- name: 指令名,不包括
- vnode: Vue 编译生成的虚拟节点,查阅 VNode API 了解更多详情。
- oldVnode: 上一个虚拟节点,仅在
update
和componentUpdated
钩子中可用。
除了 el
之外,其它参数都应该是只读的,尽量不要修改他们。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。
一个使用了这些参数的自定义钩子样例:
<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
Vue.directive('demo', {bind: function (el, binding, vnode) {var s = JSON.stringifyel.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!'}})
value: "hello!"
expression: "message"
argument: "foo"
modifiers: {"a":true,"b":true}
vnode keys: tag, data, children, text, elm, ns, context, functionalContext, key, componentOptions, componentInstance, 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!"})
原文:http://vuejs.org/guide/custom-directive.html
- Vue的自定义控件
- vue的自定义主键
- Vue的表单控件绑定
- Vue自定义指令的使用
- Vue-基本标签和自定义控件(简化官方文字描述)
- vue自定义form控件,解决vue+layui组合时checkbutton和radiobutton事件被覆盖问题
- 自定义控件的自定义属性
- 自定义控件的自定义属性
- 自定义控件--自定义控件的属性
- Vue表单控件绑定的思考
- vue与自定义元素的关系
- vue自定义指令(扩展的HTML)
- vue加载自定义的js文件
- Vue的elementUI实现自定义主题
- 自定义vue全局组件use的使用
- Petshop的自定义控件
- Petshop的自定义控件
- 自定义控件的拖动
- 从单例模式挖到内存模型(四)----java内存模型
- memset 、ZeroMemory和 “={0}” 三者区别
- PHP YII框架开发安全基本准则
- zzuli 2130 hipercijevi bfs + 链式前向星 + 输入外挂
- 先中序构建二叉树
- Vue的自定义控件
- Maven 实战系列之在Windows上安装Maven
- iOS导航控制器——UINavigationController使用详解
- join(long)与sleep(long)的区别
- LSH︱python实现MinHash-LSH及MinHash LSH Forest——datasketch(四)
- QT问题:Failed to start program. Path or permissions wrong?已经解决
- 商人的诀窍 (sdut oj)
- ios加载本地html,css样式失效问题
- 贝叶斯