Vue2基础 14:自定义指令

news2024/11/28 10:54:21

自定义指令

  • 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.coloradmin.cn/o/1896999.html

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

相关文章

如何在 Odoo 16 中向新视图添加字段

例如,让我们看看如何在新视图或新操作窗口中创建“many2one”字段。 请考虑下面的屏幕截图,它表示不包含任何字段的新视图类型或客户端操作窗口。 我们现在可以将与“res.partner”关联的“多对一”字段引入到我们的新视图或客户端操作窗口中。 为了实现这一点,在 XML 模板…

趣玩双色球APP-PyQt5实现

开发环境及软件主要功能说明 开发环境 win10 Vscode Python10.5-64_bit 使用的python库 requests,bs4,pandas,PyQt5 主要功能说明&#xff1a; 数据库更新&#xff0c;保存&#xff0c;另存为功能过滤显示&#xff0c;根据期数&#xff0c;开奖日期&#xff0c;开间期号过…

如何利用Kimi解读Kimi的KVCache技术细节

最近Kimi公布了一篇Mooncake: Kimis KVCache-centric Architecture for LLM Serving的文章&#xff0c;详细介绍了Kimi背后的推理架构&#xff0c;因此笔者想到用Kimi解读Kimi&#xff0c;梳理相关技术要点如下&#xff0c;供大家参考&#xff1a; 文章 "Mooncake: A KVCa…

深入讲解C++基础知识(二)

目录 一、复合类型1.引用1.1 引用的定义和使用1.2 引用的注意事项 2. 指针2.1 指针的定义和使用2.2 指针的四种状态2.3 指针的注意事项2.4 其他指针操作2.5 void* 指针 3. 理解复合类型变量的声明4. const 限定符4.1 const 对象的注意事项4.2 const 和引用4.2.1 术语&#xff1…

MAS马氏数控制榫机控制面板维修显示屏MDK3113B

马氏数控榫头机触摸屏/显示面板维修型号&#xff1a;MX3810A&#xff1b;MDK3113B&#xff1b;MXK2815B MAS马氏数控开榫机触摸屏/显示面板维修型号&#xff1a; MX2108B&#xff1b;MD2108A&#xff1b;MJ105А 数控面板维修包括&#xff1a;马氏数控榫头机、开榫机、制榫机…

STM32自己从零开始实操07:电机电路原理图

一、LC滤波电路 其实以下的滤波都可以叫低通滤波器。 1.1倒 “L” 型 LC 滤波电路 1.1.1定性分析 1.1.2仿真实验 电感&#xff1a;通低频阻高频的。仿真中高频信号通过电感&#xff0c;因为电感会阻止电流发生变化&#xff0c;故说阻止高频信号 电容&#xff1a;隔直通交。…

Prometheus + Grafana 监控系统搭建使用指南-mysqld_exporter 安装与配置

使用mysqld_exporter 实现Prometheus 监控Mysql 系列文章目录 Prometheus 的安装部署Grafana的安装部署Linux服务器接入Prometheus监控-Node Exporter 安装指南Prometheus 接入SpringBoot微服务监控Mysql 接入 Prometheus RocketMQ 接入Prometheus 监控ElasticSearch 接入 Pr…

Renderless 思想正在影响前端开发

本文由前端小伙伴方长_beezen 原创。欢迎大家踊跃投稿。 原文链接&#xff1a;https://juejin.cn/post/7385752495535472655 前言 截止到 2024 年&#xff0c;跨端应用开发所需要考虑的兼容性&#xff0c;已经涵盖了框架、平台和设备类型等多个方面&#xff0c;例如&#xff1…

AI学习与实践6_AI解场景Agent应用预研demo

前言 学习大模型Agent相关知识&#xff0c;使用llama_index实现python版的Agent demo&#xff0c;根据AI解题场景知识密集型任务特点&#xff0c;需要实现一个偏RAG的Agent WorkFlow&#xff0c;辅助AI解题。 使用Java结合Langchain4j支持的RAG流程一些优化点以及自定义图结构…

基于工业互联网的智能制造:未来制造业的新引擎

随着科技的飞速发展&#xff0c;工业互联网通过提供强大的数据支撑和通信基础&#xff0c;成为智能制造的重要基石。智能制造的引入&#xff0c;不仅显著提升了制造业的生产效率、降低了成本&#xff0c;而且提高了产品质量&#xff0c;满足了市场的多样化、个性化需求。 智能制…

创建react的脚手架

Create React App 中文文档 (bootcss.com) 网址&#xff1a;creat-react-app.bootcss.com 主流的脚手架&#xff1a;creat-react-app 创建脚手架的方法&#xff1a; 方法一&#xff08;JS默认&#xff09;&#xff1a; 1. npx create-react-app my-app 2. cd my-app 3. …

(三十一)Flask之wtforms库【剖析源码下篇】

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

ESP32CAM物联网教学08

ESP32CAM物联网教学08 本地网页控制小车 小智制作的物联网小车,在与云台监控摄像头的PK中,一路攻城掠地、勇往直前。突然有一天,他觉得似乎忘了最开始时的初衷,忘了一路走来的首发站:这个不就是一辆遥控车吗?我能不能就做一辆快乐的、纯粹的遥控车。 CameraWebServer转换…

相关款式1111

一、花梨木迎客松 1. 风速打单 发现只有在兄弟店铺有售卖 六月份成交订单数有62笔 2. 生意参谋 兄弟店铺商品访客数&#xff1a;3548&#xff0c;支付件数&#xff1a;95件 二. 竹节茶刷&#xff08;引流&#xff09; 1. 风速打单 六月订单数有165笔 兄弟&#xff1a;…

【技术支持】console控制台输出美化(腾讯文档)

function style(color, size 12){return display:inline-block;background-color:${color};color:#fff;padding:2px 4px;font-size:${size}px; } const dataVersion 3.0.0 const codeVersion 3.0.28657969 const branchVersion release-20240617-f98487dc //注意此处%c后面…

CDC实时同步进行时遇到不可抗力中断了怎么办?

目录 一、CDC技术的概念 二、CDC技术的应用场景 1.数据复制和同步 2.实时数据仓库 3.业务过程监控和审计 4.ETL 进程优化 三、CDC与数据管道的关系 1.区别 CDC&#xff08;Change Data Capture&#xff09; 数据管道&#xff08;Data Pipeline&#xff09; 2.联系 CDC是数据管道…

【pycharm】 Virtualenv创建venv报错

一、背景 在启动django项目时&#xff0c;需要创建venv环境&#xff0c;有时候能顺利创建成功&#xff0c;当python版本换成3.8时&#xff0c;会报错 ImportError: DLL load failed while importing _ssl: 找不到指定的模块。 二、原因和解决措施 之所以执行这个报错&#…

六西格玛绿带培训如何告别“走过场”?落地生根

近年来&#xff0c;六西格玛绿带培训已经成为了众多企业提升管理水平和员工技能的重要途径。然而&#xff0c;不少企业在实施六西格玛绿带培训时&#xff0c;往往陷入形式主义的泥潭&#xff0c;导致培训效果大打折扣。那么&#xff0c;如何避免六西格玛绿带培训变成“走过场”…

前端面试项目细节重难点(十)(已工作|做分享)

面试官&#xff1a;现场出需求&#xff1a;我想让一个左侧盒子可以进行拉伸、缩小、展示或隐藏这些功能&#xff0c;你会如何实现&#xff1f; 答&#xff1a;&#xff08;1&#xff09;分析问题&#xff1a;其实&#xff0c;我听到这个问题后&#xff1a; 我的第一种想法&am…

化学合成水热釜 加热反应釜 实验室高温高压设备

水热釜&#xff0c;也称为高压消解罐或高压釜&#xff0c;是一种能够在高温高压条件下进行化学反应的实验室设备。它广泛应用于化学、地质、材料科学、环境科学等领域&#xff0c;特别是在需要在高压环境下加速化学反应或溶解难溶物质的实验中。以下是水热釜的一些关键特性和用…