第二节:指令的使用(6)——自定义指令

1、指令定义的钩子函数:(这些钩子函数都是可选的)

  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用,即模版更新完成的调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

2、钩子函数的参数(参数可选)

  • 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 }
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

3、自定义指令的例子

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="vue.js"></script>
    <style>
        #app {
            width: 900px;
            height: 800px;
            border: 1px black solid;
        }
    </style>
</head>

<body>
    <div id="app">
        <input id="num" type="text" v-validate-number:aa.bb.cc="num" v-model="num">
    </div>
</body>
<script type="text/javascript">
    Vue.directive("validateNumber", { /*验证输入框中是否是数字,如果不是则边框变红*/
        bind: function(el, binding, vnode) {
            console.info("钩子函数bind的参数列表如下(v-validate-number:aa.bb.cc=‘num‘):");
            console.info("绑定的dom元素标签,el.nodeName:" + el.nodeName);
            console.info("绑定的dom元素id,el.id:" + el.id);
            console.info("指令的整行名(包括参数和修饰符), binding.rawName:" + binding.rawName);
            console.info("指令的名字,binding.name:" + binding.name);
            console.info("指令的参数,binding.arg:" + binding.arg);
            console.info("指令的修饰符(以json格式字符串输出),binding.modifiers:" + JSON.stringify(binding.modifiers));
            console.info("指令的表达式,binding.expression:" + binding.expression);
            console.info("指令的值,binding.value:" + binding.value);
            if (el.getAttribute("type").toLowerCase() == "text") {
                if (typeof binding.value != "number") {
                    el.setAttribute("style", "border-color:red;"); //不是数字,设置边框为红色
                }

            } else {
                console.log("bind failed!");
            }
        },
        inserted: function(el, binding, vnode) {

        },
        update: function(el, binding, vnode, oldVnode) {
            if (binding.value == "" || !isNaN(Number(binding.value))) { //判断是不是为空,或者是不是数字
                el.setAttribute("style", "border-color:initial;"); //是数字改回默认值
            } else {
                el.setAttribute("style", "border-color:red;"); //不是数字,设置边框为红色
            }
        },
        componentUpdated: function(el, binding, vnode, oldVnode) {

        },
        unbind: function() {
            console.log("unbind directive -- validateNumber");
        }
    });
    new Vue({
        el: "#app",
        data: {
            msg: "自定义的指令",
            num: "11"
        },
        methods: {
        }
    });
</script>

</html>

4、自定义指令的注意问题

  • 自定义指令的名字 "validateNumber" 其中有大写,则在绑定的时候,要用‘-‘分开大写变小写:v-validate-number:aa.bb.cc="num"
  • 如果指令需要多个值,可以传入对象字面量的参数:v-validate-number:aa.bb.cc="{a:1,b:2}"  调用的时候用对象方式:binding.value.a
  • 如果只有一个update方法的指令,可以简写Vue.directive("name",function(value){});
时间: 2025-01-18 13:19:41

第二节:指令的使用(6)——自定义指令的相关文章

Vue2.0笔记——自定义指令

自定义指令 自定义指令主要用于,除系统提供外,自己对DOM的底层操作.例如当页面加载时需要将一个文本框为自动获得焦点.只要你在打开这个页面后还没点击过任何内容,这个输入框就应当还是处于聚焦状态. 我们通过全局自定义指令和局部自定义指令来讲解autofouce案例. 全局自定义指令 在全局API中通过Vue.directive( id, [definition] )来注册或获取全局指令.参数: id表示自定义的指令名称 definition为自定义指令的定义,一般可以含有几个生命周期钩子函数 bi

vue指令03---自动获取焦点(自定义指令)和过滤器的学习

1.1 自动获取焦点 在自动获取焦点的学习中涉及到了一个钩子函数 mounted(),它表示页面一加载进来就执行函数里面的内容,(和window.onload相似,这样有助于理解),mounted 钩子函数的名字不能随便更改,而且不能写在 methods 属性里面    方法1:  在vue中 通过操作 dom 元素来实现自动获取焦点(即使用原生JS实现) 代码如下: 1 <html lang="en"> 2 <head> 3 <title>自动获取

快速掌握vue中的自定义指令

自定义指令 注册全局的自定义指令 Vue.directive(), 其中,传递两个参数,第一个参数传递的是指令的名字,第二个参数是一个对象. 详细的例子 // 第一个参数是指令的名称,第二个参数是一个对象. Vue.directive('focus', { bind: function (el) { // 注意:每个函数中呢,第一个参数永远是el, 表示被绑定了指令的那个元素,这个el参数,是一个原生的js对象 el.focus() }, // 在元素刚绑定指令的时候,元素还没有放到dom中去,

vue自定义指令directive

vue中指令分为全局指令和局部指令 先来看全局自定义指令: 第一个参数是指令的名字,第二个参数可以是函数也可以是对象,先来看函数: 函数中接收三个参数: el在这里是input元素 bindings里是一些绑定信息: 其中expression是指绑定的变量名字,这里是content name是指令名字 value是绑定数据的值,上面content为空,所以目前value为空 v-slice上还可以写修饰符 还可以传参: vnode虚拟节点: vnode中contex是vue实例,其中的conte

带你走近AngularJS - 创建自定义指令

为什么使用AngularJS 指令? 使用过 AngularJS 的朋友应该最感兴趣的是它的指令.现今市场上的前端框架也只有AngularJS 拥有自定义指令的功能,并且AngularJS 是目前唯一提供Web应用可复用能力的框架. 目前有很多JavaScript 产品提供插件给Web开发人员.例如, Bootstrap 就是当前比较流行的提供样式和JavaScript插件的前端开发工具包.但是开发人员在使用Booostrap中的插件时, 必须切换到JavaScript 模式来写 jQuery

AngularJs学习笔记(4)——自定义指令

对指令的第一印象:它是一个自定义标签! 先来看一个简单的指令: <!doctype html> <html ng-app="myApp"> <head> <title> 自定义指令</title> <script type="text/javascript" src="http://localhost:10100/angular.min.js" charset="utf-

vue.js自定义指令入门

Vue.js 允许你注册自定义指令,实质上是让你教 Vue 一些新技巧:怎样将数据的变化映射到 DOM 的行为.你可以使用Vue.directive(id, definition)的方法传入指令id和定义对象来注册一个全局自定义指令.定义对象需要提供一些钩子函数(全部可选): bind: 仅调用一次,当指令第一次绑定元素的时候. update: 第一次是紧跟在 bind 之后调用,获得的参数是绑定的初始值:以后每当绑定的值发生变化就会被调用,获得新值与旧值两个参数. unbind:仅调用一次,当

【AngularJS】—— 8 自定义指令

AngularJS支持用户自定义标签属性,在不需要使用DOM节点操作的情况下,添加自定义的内容. 前面提到AngularJS的四大特性: 1 MVC 2 模块化 3 指令 4 双向数据绑定 下面将会介绍如下的内容: 1 如何自定义指令 2 自定义指令的使用 3 自定义指令的内嵌使用 如何自定义指令: Angular是基于模块的框架,因此上来肯定要创建一个自己的模块: var myAppModule = angular.module("myApp",[]); 然后在此模块基础上创建指令d

angular创建自定义指令的四种方式

angular除了内置的部分指令,还可以通过.directive来自定义指令.要调用自定义指令,HTML 元素上需要添加自定义指令名.使用驼峰法来命名一个指令:nsHeader,在调用时使用需要-来分割:ns-header.自定义指令调用的的方式有四种,如下: 元素名 属性 类名 注释 1.使用元素名调用: 1 <!DOCTYPE html> 2 <html ng-app="myApp"> 3 <head> 4 <meta charset=&q