首页 > 其他分享 >Vue2入门之超详细教程十八-自定义指令

Vue2入门之超详细教程十八-自定义指令

时间:2024-06-13 09:32:36浏览次数:17  
标签:自定义 之超 binding focus value element 指令 Vue2

Vue2入门之超详细教程十四-自定义指令

1、简介

  • 定义语法
    • 分为局部自定义指令和全局自定义指令
  • 配置对象中常用的3个回调
    • bind:指令与蒜素被插入成功时调用
    • inserted:指令所在元素被插入页面时被调用
    • update:指令所在模板结构被重新解析时调用
  • 备注:
    • 指令定义时不加v-,但使用时要加v-
    • 指令名如果是多个单词,要使用kebab-case命名方式,不要用camelCase命名

学习Vue之前最后会一些HTML和CSS的基础知识,HTML基础知识 传送门,CSS基础知识 传送门

2、自定义指令

1. 局部自定义指令

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

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

需求1实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/development/vue.js"></script>
</head>
<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(){
            return {
                n:1,
            }
        }
    })
</script>
</html>

image-20240107155344516

该错误是因为我们用了一个不存在的指令v-big,v-big是原生Vue中不存在的质量,我们需要给它定义一个

directives:{
    big(element,binding){
        console.log(element,binding)
    }
}

image-20240107161620308

自定义指令接收两个参数,第一个是真实dom第二个是虚拟dom

directives:{
    big(element,binding){
        element.innerText = binding.value * 10
    }
}

image-20240107161821194

需求2实现

<input type="text" v-fbind:value="n">
directives:{
    fbind(element,binding){
        element.value = binding.value
        element.focus()
    }
}

image-20240107163141324

这样写有一个问题,即当页面刚渲染时,input输入框并不会获取焦点,只有当点击按钮后才会获取焦点

这是因为我们调用element.focus()时,input输入框还没有形成

fbind:{
    //指令与元素成功绑定时(一上来)
    bind(element,binding){
        element.value = binding.value
    },
    // 指令所在元素被插入页面时
    inserted(element,binding){ 
        element.focus()
    },
    // 指令所在模板被重新解析时
    update(element,binding){
        element.value = binding.value
        element.focus()
    }
}

2. 全局自定义指令


Vue.directive('fbind',{
    //指令与元素成功绑定时(一上来)
    bind(element,binding){
        element.value = binding.value
    },
    // 指令所在元素被插入页面时
    inserted(element,binding){ 
        element.focus()
    },
    // 指令所在模板被重新解析时
    update(element,binding){
        element.value = binding.value
        element.focus()
    }
})
Vue.directive('big',{
    big(element,binding){
        element.innerText = binding.value * 10
        console.log(element,binding)
    }
})

3、完整代码

1. 局部自定义指令完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/development/vue.js"></script>
</head>
<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>
        <br>
        <input type="text" v-fbind:value="n">
    </div>
</body>
<script type="text/javascript">
    new Vue({
        el:'#root',
        data(){
            return {
                n:1,
            }
        },
        directives:{
            big(element,binding){
                element.innerText = binding.value * 10
                console.log(element,binding)
            },
            fbind:{
                //指令与元素成功绑定时(一上来)
                bind(element,binding){
                    element.value = binding.value
                },
                // 指令所在元素被插入页面时
                inserted(element,binding){ 
                    element.focus()
                },
                // 指令所在模板被重新解析时
                update(element,binding){
                    element.value = binding.value
                    element.focus()
                }
                
            }
        }
    })
</script>
</html>

2. 全局自定义指令完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript" src="../js/development/vue.js"></script>
</head>
<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>
        <br>
        <input type="text" v-fbind:value="n">
    </div>
</body>
<script type="text/javascript">
    Vue.directive('fbind',{
        //指令与元素成功绑定时(一上来)
        bind(element,binding){
            element.value = binding.value
        },
        // 指令所在元素被插入页面时
        inserted(element,binding){ 
            element.focus()
        },
        // 指令所在模板被重新解析时
        update(element,binding){
            element.value = binding.value
            element.focus()
        }
    })
    Vue.directive('big',{
        big(element,binding){
            element.innerText = binding.value * 10
            console.log(element,binding)
        }
    })
    new Vue({
        el:'#root',
        data(){
            return {
                n:1,
            }
        }
    })
</script>
</html>

标签:自定义,之超,binding,focus,value,element,指令,Vue2
From: https://www.cnblogs.com/lirongyang/p/17951122

相关文章

  • 如何在Labview中添加自定义动态控件(旋转风扇控件)
     前言:    使用labview做了一个自定义的labview控件在Labview中添加自定义动态控件(旋转风扇控件)下面具体介绍步骤:1.打开Labview,新建VI项目,在前面板“文件”->“新建”->“自定义控件”2.接着,转到“新建”->“自定义控件”3.然后,右击添加一个布尔......
  • 使用自定义查询参数获取 fullcalendar api
    我正试图配置fullcalendar5从数据库中获取api。除了开始和结束之外,我还想向请求传递额外的查询参数。我已经尝试过这种方法,但发现请求总是忽略附加参数。events:{url:'http://localhost:4000/api/timesheet'、type:'GET'、......
  • Android中自定义Toast文字大小
    在Android开发中,Toast是一种轻量级的提示框,用于在屏幕上显示临时消息。一般情况下,Toast显示的文字大小是固定的,无法直接改变。但是,我们可以通过一些方法来实现在Toast中显示不同大小的文字。方法一:使用自定义布局创建custom_toast.xml布局文件,如:<?xmlversion="1.0"encoding......
  • uniapp vue3 实现自定义Switch效果
    <template><viewclass="container"@click="toggleSwitch"><label:class="isOn?'switch-checked':'switch-nochecked'"><viewclass="open">{{activ......
  • 下载使用nginx发布html自定义页面
    在浏览器搜索nginx.org,然后点击download,接着点击 stableandmainline选择自己所使用系统对应的信息后点击(我用的是CentOS,所以需要点击RHELandderivatives)vim/etc/yum.repos.d/nginx.repo[nginx-stable]name=nginxstablerepobaseurl=http://nginx.org/packages/ce......
  • 一文教你如何手写一个mybatis自定义框架
     本文主要介绍原始jdbc操作有哪些弊端等方面说明持久层框架出现的原因,另一方面介绍如何自己仿写一个mybatis框架。学习完本文相信你对日常使用的mybatis框架有更深的理解!简介说到持久层框架,我们很快能想到hibernate、mybatis。Hibernate是全自动的持久层框架,而mybatis则是半......
  • electron + vue3 自定义窗口:移动,缩放,置顶
    electronmain.jsconst{BrowserWindow,ipcMain}=require('electron');constpath=require("path")constCustomWindow=require('./CustomWindow')constwin=newBrowserWindow({frame:false,transparent:true,......
  • 利用自定义标签,实现select下拉列表默认选中
    //创建块函数方法,用于替换文本中的值functionsmarty_block_get_cates($params,$content,&$_sm,&$repeat){if(!$repeat){$ci=&get_instance();$cates=$ci->db->get('category')->result_array();$cates=get_dat......
  • 管理数据必备;侦听器watch用法详解,vue2与vue3中watch的变化与差异
    目录一、侦听器(watch)是什么?二、Vue2中的watch(OptionsAPI)2.1、函数式写法2.2、对象式写法    ①对象式基础写法    ②回调函数handler    ③deep属性        ④immediate属性三、Vue3中的watch3.1、向下兼容(Vue2)的Options API3.2......
  • python绘制词云图最全教程,查看文章关键词,自定义词云图形状等,看完就会
    ......