35.Vue自定义指令-总结

news2024/10/6 5:58:34

目录

1.自定义指令容易踩的坑

1.1 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名

1.2 指令回调函数中的this问题

1.3 局部指令与全局指令

2.自定义指令总结

2.1 定义语法:

(1).局部指令

(2).全局指令

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


前两节,我们讲了Vue自定义指令的函数式和对象式的用法。

33.Vue自定义指令(函数式)_vue自定义函数_未来@音律的博客-CSDN博客还有一种就是,我们去定义指令的时候,也不要去写v-前缀,定义指令的时候需要给指令起名字,那么这个指令的名字直接就叫big,而用的时候还是要规规矩矩的写v-big。像需求一这种问题,我们就使用函数的写法就能实现,需求二,我特意设置了一个细节问题,是函数实现不了的,我们就需要用对象的写法去实现。我们可以看到,当修改和v-big毫不相干的值name,都会引起big的调用,则充分说明了指令所在的模板被重新解析时,也会引起指令的重新调用。就靠big函数中收到的参数,它收到的参数中有两个比较常用,这里打印出来看一下。_vue自定义函数https://liufr.blog.csdn.net/article/details/12966714634.Vue自定义指令-对象式_未来@音律的博客-CSDN博客还有一种就是,我们去定义指令的时候,也不要去写v-前缀,定义指令的时候需要给指令起名字,那么这个指令的名字直接就叫big,而用的时候还是要规规矩矩的写v-big。像需求一这种问题,我们就使用函数的写法就能实现,需求二,我特意设置了一个细节问题,是函数实现不了的,我们就需要用对象的写法去实现。我们可以看到,当修改和v-big毫不相干的值name,都会引起big的调用,则充分说明了指令所在的模板被重新解析时,也会引起指令的重新调用。这个页面一进来,并没有获取焦点,但是在点击n+1以后,却又获取了焦点。https://liufr.blog.csdn.net/article/details/126836190那么这一小节,我们就来说说,自定义指令在真正应用的时候容易踩的坑。然后再把自定义指令相关的东西做一个总结。

1.自定义指令容易踩的坑

1.1 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名

我们之前举的自定义指令的例子,都是一个单词,比如v-big,v-fbind

但有时候我们会用多个单词,这个时候就会有人想用驼峰命名,比如使用v-bigNumber

我们可以去试试这样的写法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 准备好一个容器 -->
    <div id="root">
       <h2>{{name}}</h2>
       <h2>当前的n值是:<span v-text="n"></span></h2>
       <h2>放大10倍的n值是:<span v-bigNumber="n"></span></h2>
       <button @click="n++">点我n+1</button>

    </div>

</body>
<script>

    Vue.config.productionTip = false;

    new Vue({
        el:'#root',
        data:{
            name:'zhangsan',
            n:1
        },
        directives:{

            bigNumber(element,binding){
                console.log('big被调用');
                element.innerText = binding.value * 10;

            }

        }
    })

</script>
</html>

实现效果:

我们在定义及使用的时候都是使用的大写的N,但这里给出错误提示的时候都变成小写了。说明它根本就不认大小写。但如果我们都写成小写,也不好区分,所以Vue推荐我们多个单词之间使用横杠分隔。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 准备好一个容器 -->
    <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+1</button>

    </div>

</body>
<script>

    Vue.config.productionTip = false;

    new Vue({
        el:'#root',
        data:{
            name:'zhangsan',
            n:1
        },
        directives:{

            'big-number'(element,binding){
                console.log('big被调用');
                element.innerText = binding.value * 10;

            }

        }
    })

</script>
</html>

实现效果:

1.2 指令回调函数中的this问题

我们曾经说过,所有由Vue管理的函数,里面的this,不用我们操心,直接就是实例对象vm,那自定义函数中的this也是这样嘛?我们可以输出看看。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 准备好一个容器 -->
    <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+1</button>

    </div>

</body>
<script>

    Vue.config.productionTip = false;

    new Vue({
        el:'#root',
        data:{
            name:'zhangsan',
            n:1
        },
        directives:{

            'big-number'(element,binding){
                console.log('big',this);
                element.innerText = binding.value * 10;

            }

        }
    })

</script>
</html>

输出效果:

我们可以看到自定义函数中的this都是window,也就是说,自定义指令中的this,Vue压根就没有帮我们维护。这是为什么呢?

因为指令本来就是让我们操作元素的,指令函数中已经给了我们元素,以及元素绑定的信息,剩下的事情,我们就可以直接干了

1.3 局部指令与全局指令

我们前面所讲的都是局部指令,如果我们想使用全局指令,就需要用到Vue.directive

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 准备好一个容器 -->
    <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+1</button>

       <hr>
       <input type="text" v-fbind:value="n">
    </div>

    <div id="root2">
       
        <input type="text" v-fbind:value="x">
     </div>

</body>
<script>

    Vue.config.productionTip = false;
    Vue.directive('fbind',{
                //指令与元素成功绑定时
                bind(element,binding){
                    element.value = binding.value;
                },
                //指令所在元素被插入页面时
                inserted(element,binding){
                    element.focus();
                },
                //指令所在模板被重新解析时
                update(element,binding){
                    element.value = binding.value;
                    element.focus();
                }
            })


    new Vue({
        el:'#root',
        data:{
            name:'zhangsan',
            n:1
        },
        directives:{

            big(element,binding){
                console.log('big被调用');
                element.innerText = binding.value * 10;

            },
            

        }
    })

    new Vue({
        el:'#root2',
        data:{
            x:1
        }
       
    })

</script>
</html>

实现效果: 

 

 从上面可以看到,使用了全局指令以后,两个容器就可以使用同一个指令了。

上面的例子中,我们的全局指令使用的是对象式,下面我们再写一下函数式的全局指令

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 准备好一个容器 -->
    <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+1</button>

       
    </div>

    <div id="root2">
       
        <h2>放大10倍的n值是:<span v-big="x"></span></h2>
        <button @click="x++">点我x+1</button>
     </div>

</body>
<script>

    Vue.config.productionTip = false;
    Vue.directive('big',function(element,binding){
                console.log('big被调用');
                element.innerText = binding.value * 10;

            })


    new Vue({
        el:'#root',
        data:{
            name:'zhangsan',
            n:1
        },

    })

    new Vue({
        el:'#root2',
        data:{
            x:1
        }
       
    })

</script>
</html>

实现效果:

 

 

2.自定义指令总结

2.1 定义语法:

(1).局部指令

        new Vue({

                directives:{指令名:配置对象}

        })

        new Vue({

                directives:{指令名:回调函数}

        })

(2).全局指令

        Vue.directive(指令名,配置对象)

        Vue.directive(指令名,回调函数)

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

(1).bind:指令与元素成功绑定时调用

(2).inserted:指令所在元素被插入页面时调用

(3).update:指令所在模板结构被重新解析时调用

2.3 备注:

1.指令定义时不加v-,但使用时要加v-

2.指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/768172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.14 Bootstrap 缩略图

文章目录 Bootstrap 缩略图添加自定义的内容 Bootstrap 缩略图 本章将讲解 Bootstrap 缩略图。大多数站点都需要在网格中布局图像、视频、文本等。Bootstrap 通过缩略图为此提供了一种简便的方式。使用 Bootstrap 创建缩略图的步骤如下&#xff1a; 在图像周围添加带有 class …

ChatGPT | 修改RetrievalQA推荐答案的数量

知识库经常遇到一个问题会在一个文件的多处或者多个文件出现&#xff0c;这时候如果只回答一个结果就欠佳&#xff0c;最理想的做法是模仿推荐功能&#xff0c;把合适的多个答案及其出处汇总给用户。 如图&#xff0c;一个接口文档里面提到多处“http请求URL”&#xff1a; 使…

vue项目如何部署?有遇到布署服务器后刷新404问题吗?

一、如何部署 前后端分离开发模式下,前后端是独立布署的,前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可 我们知道vue项目在构建后,是生成一系列的静态文件

Minecraft 1.20.x Forge模组开发 01.Idea开发环境配置

我们本次来进行Minecraft 1.20.x 模组开发环境配置教程的介绍。 效果演示 效果演示 效果演示 1.首先我们需要下载Java17和1.20模组开发包: Java17下载官网

csdn新星计划vue3+ts+antd赛道——利用inscode搭建vue3(ts)+antd前端模板

文章目录 ⭐前言⭐利用inscode免费开放资源&#x1f496; 在inscode搭建vue3tsant项目&#x1f496; 调整配置&#x1f496; antd 国际化配置&#x1f496; 用户store&#x1f496; 路由权限&#x1f496; 预览 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享…

【字节流】读数据(一次读一个字节数组数据)

字节流读数据&#xff08;一次读一个字节数组数据&#xff09; 1.需求&#xff1a; 把文件fos.txt中的内容读取出来在控制台输出 2.思路&#xff1a; 创建字节输入流对象调用字节输入流对象的读数据方法释放资源 package com.bytestream; import java.io.FileInputStream; …

TCP/IP网络编程 第十五章:套接字和标准I/O

标准I/O函数的优点 标准I/O函数的两个优点 将标准I/O函数用于数据通信并非难事。但仅掌握函数使用方法并没有太大意义&#xff0c;至少应该 了解这些函数具有的优点。下面列出的是标准I/O函数的两大优点: □标准I/O函数具有良好的移植性(Portability) □标准I/O函数可以利用缓…

stable diffusion windows本地搭建的坑

刚刚2小时前&#xff0c;我搭好了&#xff0c;欣喜若狂&#xff0c;开放端口&#xff0c;同事也尝试了。我的配置 16G内存&#xff0c;AMD卡&#xff0c;有gpu但是没有用。这里不说具体步骤&#xff0c;只说坑点。 首先就是安装gfpgan、clip、openclip问题&#xff0c;我参考…

短视频seo矩阵系统源码开发部署

目录 短视频矩阵源码部署步骤简单易懂&#xff0c;开发者只需按照以下几个步骤进行操作&#xff1a; 代码展示---seo关键词分析 开发要点&#xff1a; 代码展示如下&#xff1a; 开发部署注意事项&#xff1a; 说明&#xff1a;本开发文档适用于短视频seo矩阵系统源码开发…

如何理解 dutu输光定理

解决问题 1 dutu 拿100是赌一次好&#xff0c;还是100次1元的好&#xff1f; 一般的地方&#xff0c;如果不是公平赌局&#xff0c;而期望是负数的话 其实du次数越多越亏 2 1%就基本能决定胜负 了 3 千万不要陷入常人思维&#xff0c;用筹码数量思考&#xff0c;输光为止&am…

Windows与Linux取证分析

目录 一、电子数据取证基本概念 1.电子取证学 2.常规取证 3.洛卡德物质交换原理 4.电子数据范围 5.电子数据取证的概念和目的 6.电子数据取证过程 二、Linux系统取证 1.基本信息获取 &#xff08;1&#xff09;获取系统基础信息 &#xff08;2&#xff09;用户/用户…

centos 安装pyzbar

需求&#xff1a; 运行程序报错 ImportError: Unable to find zbar shared library 进程&#xff1a; 直接使用yum 安装 yum install python-devel && yum install zbar-devel 有时候会能成功&#xff0c;大多数时候python-devel 能成功但是 zbar-devel 会失败 下载…

数据代码分享|R语言基于逐步多元回归模型的天猫商品流行度预测

全文链接&#xff1a;https://tecdat.cn/?p33212 本文通过利用回归模型对天猫商品流行度进行了研究&#xff0c;确定了决定天猫商品流行度的重要因素。并讲述、论证了预测天猫商品流行度是天猫商品交易的至关重要的环节。通过对天猫商品流行度预测技术的发展和探讨&#xff0c…

ModuleNotFoundError: No module named ‘neobolt.packstream._packer‘解决办法

python打包完成后运行报下述错误 在打包得python文件加入以下包&#xff0c;重新打包&#xff0c;问题解决 代码如下&#xff1a; import neobolt.packstream.packer import neobolt.packstream.unpacker import neobolt.bolt.io

PostgreSQL 的就业前景如何?

PostgreSQL的就业前景非常广阔&#xff0c;它是一种功能强大、可靠且开源的关系型数据库管理系统。以下是说明PostgreSQL就业前景的几个关键点&#xff1a; 1.高需求&#xff1a;随着企业和组织对数据存储和管理的需求不断增长&#xff0c;对数据库专业人员的需求也在持续上升…

基于linux下的高并发服务器开发(第二章)- 2.11 匿名管道概述

03 / 匿名管道 04 / 管道的特点 05 / 为什么可以使用管道进行进程间的通信 管道对应一个读端&#xff0c;一个写端。比如说往父进程的文件描述符5 往管道里面写数据&#xff0c;子进程的文件描述符6读出数据。 06 / 管道的数据结构 07 / 匿名管道的使用

win10下解决git报错 Permission denied(publickey)

今天在csdn的GitCode新建了一个项目&#xff0c;然后在windows下git clone时出现错误 gitgitcode.net: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 完整…

transforms

batch norm是列标准化&#xff0c;layer norm是行标准化 transforms的encoder&#xff0c;这里省略了一些东西。每一个block都是输入一段向量&#xff0c;然后输出一段向量。每一个block不仅仅是一层layer。每一个block所做的事情&#xff0c;大概是先输出一段向量&#xff0c…

Elasticsearch 集群某一节点修改 IP 后无法启动问题复盘

1、集群环境及问题描述 集群版本&#xff1a;6.8.X集群节点&#xff1a;5节点&#xff08;三个节点为主数据节点&#xff0c;另外两个独立数据节点&#xff09;。问题描述&#xff1a;由于IP冲突&#xff0c;修改了一台服务器的IP&#xff0c;然后5台配置改了一下一次重启&…

导入虚拟机指定NAT模式 IP地址

选vmx扩展名的文件 然后设置IP 选择你自定义的那个网段 大功告成