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动获取输入框焦点内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • animate.css在vue项目中的使用教程

    animate.css在vue项目中的使用教程

    在vue项目中使用动画其实有多种方式,可以使用vue中的过渡transition,可以使用animate动画与transition配合使用,也可以单独使用animate动画库,下面我们开始介绍在vue中单独使用animate动画,感兴趣的朋友一起看看吧
    2018-08-08
  • 前端vue按1920*1080设计图的页面适配屏幕缩放并适配4K屏详解

    前端vue按1920*1080设计图的页面适配屏幕缩放并适配4K屏详解

    最近在做一个数据可视化的项目,整个项目全是大屏展示,期间也是遇到很多问题,最令人头疼的就是大屏的适配,下面这篇文章主要给大家介绍了前端vue按1920*1080设计图的页面适配屏幕缩放并适配4K屏的相关资料,需要的朋友可以参考下
    2022-11-11
  • Vue vee-validate插件的简单使用

    Vue vee-validate插件的简单使用

    这个插件可以用来在未使用组件库,没有自带好的校验规则时使用,进行表单校验,非常的实用,感兴趣的朋友可以参考下本文,了解该插件的使用方法
    2021-06-06
  • 深入理解vue-router之keep-alive

    深入理解vue-router之keep-alive

    本篇文章主要介绍了深入理解vue-router之keep-alive。keep-alive使被包含的组件保留状态,或避免重新渲染,有兴趣的可以了解一下
    2017-08-08
  • 浅谈vuex actions和mutation的异曲同工

    浅谈vuex actions和mutation的异曲同工

    这篇文章主要介绍了浅谈vuex actions和mutation的异曲同工 ,详细的介绍了actions和mutation的使用和区别,非常具有实用价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • vue中如何使用唯一标识uuid(uuid.v1()-时间戳、uuid.v4()-随机数)

    vue中如何使用唯一标识uuid(uuid.v1()-时间戳、uuid.v4()-随机数)

    这篇文章主要给大家介绍了关于vue中如何使用唯一标识uuid(uuid.v1()-时间戳、uuid.v4()-随机数)的相关资料,当使用Vue.js生成UUID时,我们可以使用uuid库来帮助我们生成通用唯一标识符(UUID),需要的朋友可以参考下
    2023-12-12
  • vue3+vue-cli4中使用svg的方式详解(亲测可用)

    vue3+vue-cli4中使用svg的方式详解(亲测可用)

    最近在做个vue的项目,从各种github上的开源库上借鉴开发方法,给大家分享下,这篇文章主要给大家介绍了关于vue3+vue-cli4中使用svg的相关资料,需要的朋友可以参考下
    2022-08-08
  • vuex新手进阶篇之actions的使用方法

    vuex新手进阶篇之actions的使用方法

    actions用来处理mutations中的异步操作,触发mutations中的函数,下面这篇文章主要给大家介绍了关于vuex新手进阶篇之actions的使用方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • Ant Design_Form表单上传文件组件实现详解

    Ant Design_Form表单上传文件组件实现详解

    这篇文章主要为大家介绍了Ant Design_Form表单上传文件组件实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • vue自定义指令实现方法详解

    vue自定义指令实现方法详解

    这篇文章主要介绍了vue自定义指令实现方法,结合实例形式分析了vue.js自定义指令相关定义、注册、使用方法及操作注意事项,需要的朋友可以参考下
    2019-02-02

最新评论