Vue2基础 14:自定义指令

自定义指令

  • 1 函数式
    • 1.1 案例--v-text放大10倍
  • 2 对象式
    • 2.1 案例--v-fbind默认获取焦点(函数式)
    • 2.2 案例--v-fbind默认获取焦点(对象式)
  • 3 自定义指令容易犯的错
  • 4 全局指令写法(参考过滤器写法):

1 函数式

1.1 案例–v-text放大10倍

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

<script type="text/javascript">
    new Vue({
        el:'#root',
        data:{
            n:1,
        },
        
        // --------定义一个全新的配置项----------
        directives:{
            //big:function(){} 简写如下
            big(element,binding ){
                element.innerText = binding.value * 10
            }
            //big函数被调用的情况:
            //1.指令与元素成功绑定时(初次)
            //2.指令所在的模板(div id ="root")重新解析时
        }
    })
</script>

innerText: 返回或设置元素中的纯文本内容,只适用于IE/Chrome

  • big函数收到的是两个参数:第一个是真实DOM
  1. 判断方法一
    big(a,b){ console.dir(a) }
    控制台输出了真实DOM身上所有的属性和方法
    在控制台的输出

补充:

  1. console.dir()console.log()的区别
  2. MDN上console:dir() 静态方法的介绍
  1. 判断方法二
    big(a,b){ console.log(a instanceof HTMLElement) }
    检测a是不是HTMLElement的实例,输出为true

MDN上instanceof的定义instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
即:
在左边的检测对象的原型链上面查找右边的构造函数的prototype属性是否出现,这个过程会沿着原型链一直找,直到找到原型链的最顶端Object.prototype还没找到,那就只能返回null了,说明该对象不是这个构造函数的实例.

  • big函数收到的是两个参数:第二个是个对象,且含有指令后面代数式的值、指令的名字、使用时指令的名字
    console.log(b)

2 对象式

2.1 案例–v-fbind默认获取焦点(函数式)

先通过案例来看一下,函数式写法会有什么问题。

<body>
    <div id="root">
        <h2>当前的n值是:<span v-text="n"></span></h2>
        <input type="text" v-fbind:value="n">
        <button @click="n++">点我n+1</button>
    </div>
</body>

<script type="text/javascript">
    new Vue({
        el:'#root',
        data:{
            n:1,
        },
        //--------定义一个全新的配置项-----------
        directives:{
            fbind(element,binding ){
                element.value = binding.value
                element.focus()
            }
        }
    })
</script>

存在问题:
运行后没有获取焦点,点击按钮才有焦点。
原因:

  1. 按照顺序 指令与元素绑定页面编译 之前。
  2. 那么函数的第一次调用是指令与元素成功绑定时,是在页面上呈现input之前。
  3. 但是模板是经过vue编译才放在页面上的,绑定在编译之前,而在input出现在页面之前是无法获取焦点的。

点击按钮,n值修改,模板重新解析,重新调用指令fbind,现在input元素已在页面上,所以获取焦点。

此时fbind指令是函数形式,调用只存在以下两个时机:

  1. 指令与元素成功绑定时(初次)
  2. 指令所在的模板重新解析时

区分: span.innerText | input.value

2.2 案例–v-fbind默认获取焦点(对象式)

<body>
    <div id="root">
        <h2>当前的n值是:<span v-text="n"></span></h2>
        <input type="text" v-fbind:value="n">
        <button @click="n++">点我n+1</button>
    </div>
</body>

<script type="text/javascript">
    new Vue({
        el:'#root',
        data:{
            n:1,
        },
        //--------------定义一个全新的配置项-------------
        directives:{
            fbind:{
            //以下函数都是固定的且常用的:
                //指令与元素成功绑定时调用
                bind(element,binding){
                    //此时可以写:样式、value值、绑定事件
                    input.value = binding.value
                },
                //指令所在元素被插入页面时
                inserted(element,binding){
                    element.focus()
                },
                //指令所在的模板重新解析时
                update(element,binding){
                     input.value = binding.value
                     element.focus()
                }
            }
        }
    })
</script>

bind和update函数的逻辑往往是一致的,所以也就有了函数式指令,因此如果没有其他特殊要求(获取焦点、拿到父元素),可以用函数式。

3 自定义指令容易犯的错

  1. 指令命名多个词用-连接(kebab-case),而不是写成驼峰命名法(camelCase),且directives配置项需要加‘’,定义时不加v-,但是使用时需要加。
    例如定义一个input元素的指令
    <input type="text" v-bigNumber:value="n">
    应写成
    <input type="text" v-big-number:value="n">
    对应Vue实例中配置项的函数式:
    'big-number'(){}
    实际上big-number为directives对象里的key,当出现-时不可简写
  2. 指令相关的回调函数的this不是vm而是Window
    console.log('fbind',this)
    输出为window
  3. 自定义指令为局部指令,只给有定义的vue实例使用
    即使用的模板的<div>中的id 和Vue实例中的el相对应
<script type="text/javascript">
    //对象式
    new Vue({
        directives:{
            指令名:{配置对象}
        }
    })//函数式
    new Vue({
        directives:{
            指令名(参数1,...){
                回调函数
            }
        }
    })
</script>

4 全局指令写法(参考过滤器写法):

  • 对象式:
<script type="text/javascript">
Vue.directive('fbind',{
     bind(element,binding){
        input.value = binding.value
     },
    inserted(element,binding){
        element.focus()
    },
    update(element,binding){
        input.value = binding.value
        element.focus()
    }
})
</script>
  • 函数式
<script type="text/javascript">
Vue.directive('fbind',function(element,binding){
    element.value = binding.value
    element.focus()
})
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C51单片机程序及仿真(加减器)

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

AndroidKille更新apktool插件-cnblog

AndroidKiller不更新插件容易报错 apktool插件更新 网址 Releases iBotPeaches/Apktool (github.com) 找到apktool管理器 填入apktool位置&#xff0c;并输入apktool名字 选择默认的apktool版本 x掉&#xff0c;退出重启 可以看到反编译完成了 dex2jar 更新 网址 Release…

数据库-多表设计 多表查询

多表设计 一对多 一对多关系实现&#xff1a;在数据库表中多的一方&#xff0c;添加字段&#xff0c;来关联一的一方的主键 外键约束 -- 创建表时指定 create table 表名(字段名 数据类型,...[constraint] [外键名称] foreign key (外键字段名) references 主表…

帕金森患者饮食小贴士 满满的爱与关怀哦!

&#x1f34e; 首先&#xff0c;要多吃水果和蔬菜&#xff01;新鲜蔬果富含维生素和矿物质&#xff0c;对神经系统有很好的保护作用。&#x1f966; 特别是绿叶蔬菜&#xff0c;比如菠菜、生菜&#xff0c;它们都是健康的小天使&#xff01;&#x1f49a; &#x1f372; 其次&a…

vue2-vue3响应式原理

我们先来看一下响应式意味着什么&#xff1f;我们来看一段代码&#xff1a; m有一个初始化的值&#xff0c;有一段代码使用了这个值&#xff1b;那么在m有一个新的值时&#xff0c;这段代码可以自动重新执行&#xff1b; let m 20 console.log(m) console.log(m * 2)m 40上…

政策护航新能源助推绿色经济腾飞

随着全球气候变化问题日益严重&#xff0c;新能源行业的发展成为推动绿色经济腾飞的重要引擎。近年来&#xff0c;各国政府纷纷出台政策支持新能源产业&#xff0c;旨在激发行业活力&#xff0c;促进经济可持续发展。本文将从政策红利的角度&#xff0c;探讨新能源行业发展的现…

lnmp php7 安装ssh2扩展

安装ssh2扩展前必须安装libssh2包 下载地址: wget http://www.libssh2.org/download/libssh2-1.11.0.tar.gzwget http://pecl.php.net/get/ssh2-1.4.tgz &#xff08;这里要换成最新的版本&#xff09; 先安装 libssh2 再安装 SSH2: tar -zxvf libssh2-1.11.0.tar.gzcd libss…

【Linux进阶】ext2文件系统(inode)

1.再谈inode (1) 理解inode&#xff0c;要从文件储存说起。 文件储存在硬盘上&#xff0c;硬盘的最小存储单位叫做"扇区"&#xff08;Sector&#xff09;。每个扇区储存512字节&#xff08;相当于0.5KB&#xff09;。操作系统读取硬盘的时候&#xff0c;不会一个个…

方法引用 异常 file

一.方法引用 1.方法引用概述 eg: 表示引用run1类里面的sxxxx方法 把这个方法当做抽象方法的方法体 &#xff1a;&#xff1a;是方法引用符 //方法引用Integer[] arr{4,3,1,6,2,7,8,5};Arrays.sort(arr,run1::subtraction);System.out.println(Arrays.toString(arr));}publi…

算法金 | 平均数、众数、中位数、极差、方差,标准差、频数、频率 一“统”江湖

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 抱个拳&#xff0c;送个礼 更多内容&#xff0c;见微*公号往期文章&#xff0c;阅读人数已破 10, 000&#xff1a;协方差、方差、标准…

vue3自定义全局指令和局部指令

1.全局指令 el&#xff1a;指令绑定到的DOM元素&#xff0c;可以用于直接操作当前元素&#xff0c;默认传入钩子的就是el参数&#xff0c;例如我们开始实现的focus指令&#xff0c;就是直接操作的元素DOM binding&#xff1a;这是一个对象&#xff0c;包含以下属性&#xff1a;…

vue项目打包部署后 浏览器自动清除缓存问题(解决方法)

vue打包部署后 浏览器缓存问题&#xff0c;导致控制台报错ChunkLoadError: Loading chunk failed的解决方案 一、报错如下&#xff1a; 每次build打包部署到服务器上时&#xff0c;偶尔会出现前端资源文件不能及时更新到最新&#xff0c;浏览器存在缓存问题&#xff0c;这时在…

怎么做外贸推广:10个详细教程和工具

1. 介绍 1.1 什么是外贸推广 外贸推广指的是将产品或服务推广到国际市场的过程。它的主要目的是吸引海外客户&#xff0c;增加销售额&#xff0c;并扩大企业的全球影响力。外贸推广不仅仅是销售产品&#xff0c;它还包括品牌建设、市场研究和客户关系管理。 谷歌外贸推广案例…

WPF 实现 移动带/旋转带 效果

先来看看效果&#xff1a; 接下来说明下实现步骤&#xff1a; 1.定义个背景 <Grid Background"#ffffff"><Border Background"#7f8b99" /></Grid> 2.定义平行四边形 定义一个 宽40 高21的 四边形。然后定义四个点的起始位置 Points …

el-table实现固定列,及解决固定列导致部分滚动条无法拖动的问题

一、el-table实现固定列 当数据量动态变化时&#xff0c;可以为 Table 设置一个最大高度。 通过设置max-height属性为 Table 指定最大高度。此时若表格所需的高度大于最大高度&#xff0c;则会显示一个滚动条。 <div class"zn-filter-table"><!-- 表格--…

zdppy+vue3+antd 实现表格数据渲染

基本用法 <template><a-table :columns"columns" :data-source"data"><template #headerCell"{ column }"><template v-if"column.key name"><span>xxx Name</span></template></temp…

2024年中国陶瓷轴承用氮化硅粉体市场发展现状及重点竞争企业研究

2024年中国陶瓷轴承用氮化硅粉体市场发展现状及重点竞争企业研究 氮化硅是一种硬度高、结构稳定、热膨胀系数小&#xff0c;抗氧化和抗侵蚀性能好的一种的陶瓷材料&#xff0c;可用于制造高性能氮化硅陶瓷结构件、坩埚涂层等。近年来&#xff0c;伴随着机械制造行业进一步向高精…

Google重大更新--解读Android Auto认证4.3

Google在今年五月更新了Android Auto 4.2.2版本&#xff0c;而在2024年7月他们推出了Android Auto 4.3版本&#xff0c;这是自2023年9月以来对Android Auto 4.2版本的一次重大更新。 为了确保合规性和顺利认证&#xff0c;OEM和Tire1必须确保PDK组件版本与正在认证的主机的Rece…

昇思25天学习打卡营第18天 | 基于MobileNetv2的垃圾分类

内容介绍&#xff1a; MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络&#xff0c;相比于传统的卷积神经网络&#xff0c;MobileNet网络使用深度可分离卷积&#xff08;Depthwise Separable Convolution&#xff09;的思想在准确率小…