Vue2.0 Vue自定义指令_对象式

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

不用自定义指令:

<input type="text" v-fbind:value="n" autofocus>

这样写自定义指令就玩不下去了,而且写这个不是什么浏览器都可以
方法有很多,但是现在还是自定义指令为主

fbind(element,binding){
    element.value = binding.value
    element.focus()
}

一开始没获取焦点,但是focus()是执行了,按下按键n+1又获取焦点了

写一个原生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>原生HTML写一个获取焦点</title>
    </head>
    <body>
        <button id="btn">点我创建一个输入框</button>
    </body>
    <script>
        const btn = document.getElementById('btn')
        btn.onclick = ()=>{
            const input = document.createElement('input')//创建input输入框
            document.body.appendChild(input)//在body中放入input
            input.focus()//focus API 获取焦点
        }
    </script>
</html>

可以点击就获取焦点。只能说input.focus()不是放在哪里都一样的

const input = document.createElement('input')
input.focus()
document.body.appendChild(input)

创建了元素、获取了焦点、放入body中然后呈现

就不行

有些元素得放入(document.body.appendChild(input))后才有效,有些元素在放入(document.body.appendChild(input))前就可以有效

不是代码错了,而是执行的时机有问题

所以就解释清楚了前面的element.focus() fbind,fbind只要一调用element.focus()就是在1.指令与元素成功绑定时这个问题上
指令: v-fbind
元素: input
成功绑定,没说放入页面
绑定仅仅代表了在内存里面建立了关系你的input并没有跑到页面
点击后element获取了input所以可以

在我们能够发现Vue不仅仅把指令和元素绑定成功了,而且Vue还把元素放入页面了后,在这个时候我们focus()就可以了,只要fbind写成函数,你就执行不来,只有俩个时候被调用,你根本拿不到那个时间点(就是vue把元素放到页面的时间点),所以得这样:

directives:{
    fbind:{
        
    }
}

在这个对象里面你可以准备很多的函数
Vue给你个承诺:Vue会在特殊的时刻去帮你调特殊的函数
这些函数都有Vue给你定义好的名字,不能写错
这里面常用的有三个:

bind()

当指令与元素成功绑定时(一上来)调用

inserted()

指令所在的元素被插入页面时调用

update()

指令所在的模板被重新解析时调用

这三个执行的顺序

fbind:{
            //当指令与元素成功绑定时(一上来)
            bind(){
                console.log('bind')
            },
            //指令所在的元素被插入页面时
            inserted(){
                console.log('inserted')
            },
            //指令所在的模板被重新解析时调用
            update(){
                console.log('update')
            }
        }

先是bind -> inserted -> update

input.className = 'back'
input.value = 99

这种情况就等于bind区域

bind(element,binding){
    //console.log('bind')
    element.value = binding.value
},
inserted(element,binding){
    //console.log('inserted')
    element.focus()
},
update(element,binding){
    //console.log('update')
    element.value = binding.value
}

若是点击按键(失去焦点)也不会失去焦点

update(element,binding){
    //console.log('update')
    element.value = binding.value
    element.focus()
}

我们现有个大概的印象:
bindinsertedupdate它们三个都是函数Vue在不同的时刻帮我调用不同的函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Vue 2.0 中可以通过自定义指令来扩展其功能。自定义指令可以用于在元素上添加特定的行为和交互。下面是自定义指令的基本用法: 1. 注册自定义指令: ```javascript Vue.directive('directiveName', { // 指令选项 }) ``` 2. 指令选项: - `bind`:指令第一次绑定到元素时调用,可以在这里进行初始化设置。 - `inserted`:被绑定元素插入父节点时调用。 - `update`:被绑定元素所在的组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。 - `componentUpdated`:被绑定元素所在的组件的 VNode 及其子 VNode 全部更新后调用。 - `unbind`:指令与元素解绑时调用,可以在这里进行清理工作。 3. 指令函数参数: - `el`:指令所绑定的元素。 - `binding`:一个对象,包含以下属性: - `name`:指令名,不包括 v- 前缀。 - `value`:指令的绑定值,例如 v-directiveName="value" 中的 value。 - `oldValue`:指令的前一个绑定值。 - `expression`:指令的表达,例如 v-directiveName="expression" 中的 expression。 - `arg`:传给指令的参数,例如 v-directiveName:arg。 - `modifiers`:包含修饰符的对象,例如 v-directiveName.modifier。 下面是一个简单的示例,演示了如何自定义一个简单的指令,使元素在绑定时自动获取焦点: ```javascript Vue.directive('focus', { inserted: function (el) { el.focus(); } }); ``` 然后,你可以在模板中使用这个指令: ```html <input v-focus> ``` 这样,在页面加载时该输入框就会自动获取焦点。 希望这能帮到你!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结城明日奈是我老婆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值