第13集丨Vue 江湖 —— 自定义指令

news/2024/6/15 14:44:17 标签: vue.js, javascript, 前端

目录

  • 一、自定义v-big指令(函数式写法)
    • 1.1 实现
    • 1.2 效果
  • 二、自定义v-fbind指令(对象式写法)
    • 2.1 实现
  • 三、定义驼峰指令
  • 四、定义全局指定
  • 五、总结
    • 5.1 定义语法:
    • 5.2 配置对象中常用的3个回调
    • 5.3 备注

Vue中,所谓的指令,其实就是把原生操作dom的过程进行了封装。

一、自定义v-big指令(函数式写法)

需求:定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。

1.1 实现

所定义的big()函数何时会被调用?

  • 指令与元素成功绑定时
  • 指令所在的模板被重新解析时

证明如何是element真实的dom元素?

  • console.dir(element)
  • console.log(element instanceof HTMLElement)
<div id="root">
    <h2>{{name}}</h2>
    <h2>当前的n值是: <span v-text="n"></span></h2>
    <h2>放大10倍后n值是: <span v-big="n"></span></h2>
    <button @click="n++">点我n++</button>
    <button @click="name='Vue2'">修改name值</button>
</div>
<script>javascript">
    new Vue({
        el:'#root',
        data:{
            name:'Vue',
            n:1
        },
        directives:{
            big(element,binding){
            	// console.dir(element)
                // console.log(element instanceof HTMLElement)
                console.log("big被调用了!");
                element.innerText = binding.value * 10;
            }
        }
        
    })
</script>

1.2 效果

  • 在浏览器中打开,可以看到big函数被调用了

在这里插入图片描述

  • 当改变n值时,big函数被调用了

在这里插入图片描述

  • 修改name值时,big函数也被调用了

在这里插入图片描述

二、自定义v-fbind指令(对象式写法)

需求:义一个v-fbind指令,和v-bind功能类似,但可以让其所绑定的input元素默认获取焦点。

2.1 实现

下面案例中,我们将fbind指令用对象指定处理过程,其中有三个函数:bindinsertedupdate,这三个函数里面的this指向的是window对象,不再是vm对象了.

  • bind:指令与元素成功绑定时(一上来)
  • inserted:指令所在的元素被插入页面时
  • update:指令所在的模板被重新解析时
<div id="root">
    <h2>{{name}}</h2>
    <h2>当前的n值是: <span v-text="n"></span></h2>
    <h2>放大10倍后n值是: <span v-big="n"></span></h2>
    <button @click="n++">点我n++</button>
    <button @click="name='Vue2'">修改name值</button>
    <hr>
    <input type="text" v-fbind:value="n">
</div>
<script>javascript">
    new Vue({
        el:'#root',
        data:{
            name:'Vue',
            n:1
        },
        directives:{
            big(element,binding){
                // console.dir(element)
                // console.log(element instanceof HTMLElement)
                console.log("big被调用了!");
                element.innerText = binding.value * 10;
            },
            fbind:{
                // 指令与元素成功绑定时(一上来)
                bind(element,binding){
                   element.value = binding.value; 
                },
                // 指令所在的元素被插入页面时
                inserted(element,binding){
                    element.focus();
                },
                // 指令所在的模板被重新解析时
                update(element,binding){
                    element.value = binding.value; 
                }
            }
        }
        
    })
</script>

三、定义驼峰指令

定义的指令不能使用驼峰形式,例如:bigNumber,要使用-连接,即要定义成v-big-number

<div id="root">
	 <h2>{{name}}</h2>
    <h2>当前的n值是: <span v-text="n"></span></h2>
    <h2>放大10倍后n值是: <span v-big-number="n"></span></h2>
    <button @click="n++">点我n++</button>
    <button @click="name='Vue2'">修改name值</button>
</div>
<script>javascript">
    new Vue({
        el:'#root',
        data:{
            name:'Vue',
            n:1
        },
        directives:{
            "big-number"(element,binding){
                element.innerText = binding.value * 10;
            }
        }
        
    })
</script>

四、定义全局指定

我们是用Vue.directive()方式来定义全局指令。

javascript">//对象式
Vue.directive('fbind',{
    bind(element,binding){
        element.value = binding.value; 
    },
    inserted(element,binding){
        element.focus();
    },
    update(element,binding){
        element.value = binding.value; 
    }
})

//函数式
Vue.directive('fbind',function(element,binding){
	element.value = binding.value; 
})

五、总结

5.1 定义语法:

局部指令:

  • 对象式:new Vue({directives:{指令名:配置对象})
  • 函数式:new Vue({directives(){})

全局指令:

  • 对象式:vue.directive(指令名,配置对象)
  • 函数式:Vue.directive(指令名,回调函数)

5.2 配置对象中常用的3个回调

这三个函数里面的this指向的是window对象,不再是vm对象了.

  1. bind:指令与元素成功绑定时调用。
  2. inserted:指令所在元素被插入页面时调用。
  3. update:指令所在模板结构被重新解析时调用。

5.3 备注

  1. 指令定义时不加v-,但使用时要加v-
  2. 指令名如果是多个单词,要使用kebab-cas命名方式,不要用camelCase命名。

http://www.niftyadmin.cn/n/4937034.html

相关文章

JAVA多线程和并发基础面试问答(翻译)

JAVA多线程和并发基础面试问答(翻译) java多线程面试问题 1. 进程和线程之间有什么不同&#xff1f; 一个进程是一个独立(self contained)的运行环境&#xff0c;它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序…

C语言atoi函数将字符串类型转换为整型

atoi() 是C标准库中的一个函数&#xff0c;用于将字符串转换为整数。函数原型如下&#xff1a; int atoi(const char *str); 参数 str 是一个指向要转换的字符串的指针。atoi() 函数会尝试将字符串中的数字部分转换为整数&#xff0c;并返回转换后的整数值。如果字符串中不仅包…

433. 最小基因变化

基因序列可以表示为一条由 8 个字符组成的字符串&#xff0c;其中每个字符都是 A、C、G 和 T 之一。 假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。 例如&#xff0c;"AACCGGTT" -->…

el-carousel加载缓慢问题

el-carousel加载缓慢&#xff0c;如果点击下一个或者上一个按钮时&#xff0c;加载速度很快&#xff0c;否则需要等2秒左右才能显示。已经确定不是接口问题&#xff0c;后来各种百度才知道el-carousel会自动添加了一个空的数据 解决办法 在el-carousel上添加一个if语句&#…

开学触控笔买哪个牌子好?ipad可以用的电容笔推荐

随着开学时间的临近&#xff0c;各大学院的学生们也都陆陆续续为走进校园而做准备了。那么开学自然需要买一些必要的数码电子产品&#xff0c;比如搭配iPad使用的电容笔。我们究竟要不要买苹果原装电容笔&#xff1f;事实上&#xff0c;如果只是为了写字记录东西的话&#xff0…

【Linux】创建普通用户以及Linux问题解决

创建普通用户 ❓可以看到我们现在是一个root用户&#xff0c;并不是一个普通用户&#xff0c;我们要如何创建普通用户呢&#xff1f; adduser 你的用户名passwd 你的用户名&#x1f525;注意这里passwd设置密码的时候&#xff0c;你输入密码电脑不会显示 删除普通用户 userd…

VictoriaMetrics部署及vmalert集成钉钉告警

1、部署VictoriaMetrics cd /usr/local wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.65.0/victoria-metrics-amd64-v1.65.0.tar.gz mkdir victoria-metrics && tar -xvzf victoria-metrics-amd64-v1.65.0.tar.gz && \ mv …

管理者应该编码,但不是在工作时

管理者应该编码吗?这个问题似乎没有一个明确的答案。这场辩论有支持者也有反对者&#xff0c;每一方都有自己的论点。我最近在工作中编写了一个副业项目&#xff0c;这让我重新评估了我在这个问题上的立场。经历了这些之后&#xff0c;我可以说&#xff0c;我的立场已经从管理…