【Vue】输入框状态切换&自动获取输入框焦点の实现

这篇具有很好参考价值的文章主要介绍了【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()就可以正常获取输入框的焦点文章来源地址https://www.toymoban.com/news/detail-524491.html

到了这里,关于【Vue】输入框状态切换&自动获取输入框焦点の实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包