Vue输入框状态切换&自动获取输入框焦点的实现方法

 更新时间:2023年05月30日 10:54:50   作者:名字都没了~  
这篇文章主要介绍了Vue输入框状态切换&自动获取输入框焦点的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

场景:

点击button按钮展示输入框,并自动获取对话框焦点,失去焦点时展示button按钮

实现:

1.点击button按钮展示输入框,失去焦点时展示button按钮

  • 在data中定义visibility,确定输入框的展示状态,默认为false
  • 定义changeVisibility方法,并给button绑定点击事件@click="changeVisibility",实现点击按钮展示输入框,给输入框绑定失去焦点事件@blur="changeVisibility"
  • 定义inputbutton元素,绑定条件渲染指令v-if,当visibilityfalse时展示按钮,反之展示输入框

代码实现:

<template>
	<div>
        <label for="input">
            <input type="text" ref="inputRef" v-if="visibility" @blur="changeVisibility">
            <button @click="changeVisibility" v-else>展示文本框</button>
    	</label>
    </div>
</template>
<script>
	export default {
        data() {
            return {
                visibility: false
            }
        },
        methods: {
            changeVisibility() {
                this.visibility = !this.visibility // 切换 visibility,控制输入框的显示状态
            }
        }
    }
</script>

2.自动获取对话框焦点

文本框的焦点可以通过.focus()获取,因此我们可以通过this.$refs.inputRef.focus()获取到显示的输入框的焦点(inputRef是创建文本框时添加的ref引用)。但是方法定义在组件渲染之前,因此直接在方法中添加会导致控制台报错:Error in v-on handler: "TypeError: Cannot read properties of undefined (reading 'focus')"。这是由于浏览器执行到this.$refs.inputRef.focus()

时,input元素还没有被渲染到页面上,此时DOM中还不存在指定的input元素。为了避免这种情况,可以使用以下三种方法推迟焦点的获取

  • 设置定时器, 推迟焦点的获取
setTimeout(()=> {
    this.$refs.inputRef.focus()
},0)

设置一个0ms的定时器,当浏览器执行到定时器时,会将定时器内部的函数放入延迟队列中,当定时器的等待事件结束后,会将函数放入消息队列的末尾,消息队列的执行按照先进先出原则,当前面的任务执行完成后,浏览器会自动执行this.$refs.inputRef.focus()实现焦点的获取

  • 使用 $nextTick 方法, 将获取焦点推迟到下一个 DOM 更新周期
this.$nextTick(()=> {
	this.$refs.inputRef.focus()
})

组件的$nextTick(cb)方法,会把 cb 回调推迟到下一个 DOM 更新周期之后执行。

通俗的理解是:等组件的 DOM 更新完成之后,再执行 cb 回调函数。从而能保证 cb 回调函数可以操作到最新的 DOM 元素。

将获取焦点放到updated生命周期中执行(不推荐
使用这个方法时,需要加上if判断,否则每一次this.visibility发生变化时,都会执行一次更新,增加服务器的负担

updated() {
    if (this.visibility){
        this.$refs.inputRef.focus()
    }
}

当组件处于updated时,页面已经根据最新的数据渲染完成了,此时我们执行this.$refs.inputRef.focus()就可以正常获取输入框的焦点

到此这篇关于Vue输入框状态切换&amp;自动获取输入框焦点の实现的文章就介绍到这了,更多相关Vue动获取输入框焦点内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于vue组件的更新机制 resize() callResize()

    关于vue组件的更新机制 resize() callResize()

    这篇文章主要介绍了关于vue组件的更新机制 resize() callResize(),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue使用axios(Ajax)+ElementUI实现登录实践

    Vue使用axios(Ajax)+ElementUI实现登录实践

    本文介绍了如何使用Vue和ElementUI框架创建一个登录页面,并实现前后端交互,同时,还讨论了跨域问题的解决方案以及ES6中的箭头函数
    2026-03-03
  • Vue element实现权限管理业务流程详解

    Vue element实现权限管理业务流程详解

    目前本人再使用vue-element-admin项目时都是通过直接删除一些用不上的路由来进行侧边栏的清除,但是其实有一个更加好的办法来对项目的侧边栏显示的内用进行管理,就是权限管理,其实也不知道这个方法好不好,原理上来说时跟直接删除该路由的方式时一样的
    2022-08-08
  • vue中v-bind与v-model的区别举例详解

    vue中v-bind与v-model的区别举例详解

    这篇文章主要给大家介绍了关于vue中v-bind与v-model区别的相关资料,v-model和v-bind是Vue.js框架中的两个常用指令,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 解决vue ui报错Couldn‘t parse bundle asset“C:\Users\Administrator\vue_project1\dist\js\about.js“. Analyzer

    解决vue ui报错Couldn‘t parse bundle asset“C:

    这篇文章主要介绍了解决vue ui报错Couldn‘t parse bundle asset“C:\Users\Administrator\vue_project1\dist\js\about.js“. Analyzer问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • vue组件属性(props)及私有数据data解析

    vue组件属性(props)及私有数据data解析

    这篇文章主要介绍了vue组件属性(props)及私有数据data解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue--点击当前增加class,其他删除class的方法

    vue--点击当前增加class,其他删除class的方法

    今天小编就为大家分享一篇vue--点击当前增加class,其他删除class的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • 如何通过Vue自带服务器实现Ajax请求跨域(vue-cli)

    如何通过Vue自带服务器实现Ajax请求跨域(vue-cli)

    从A页面访问到B页面,并且要获取到B页面上的数据,而两个页面所在的端口、协议和域名中哪怕有一个不对等,那么这种行为就叫跨域,这篇文章给大家介绍如何通过Vue自带服务器实现Ajax请求跨域(vue-cli),感兴趣的朋友一起看看吧
    2023-10-10
  • 前端vue+element使用SM4国密加密解密的详细实例

    前端vue+element使用SM4国密加密解密的详细实例

    国密即国家密码局认定的国产密码算法,主要有SM1,SM2,SM3,SM4,下面这篇文章主要给大家介绍了关于前端vue+element使用SM4国密加密解密的相关资料,需要的朋友可以参考下
    2023-03-03
  • 解决element ui cascader 动态加载回显问题

    解决element ui cascader 动态加载回显问题

    这篇文章主要介绍了element ui cascader 动态加载回显问题解决方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08

最新评论