Vue2.0开发之——ref引用实例-文本框和按钮的按需展示(42)

一 概述

  • 文本框和按钮按需展示功能实现
  • 了解this.$nextTick的应用场景
  • updated为啥不行

二 文本框和按钮按需展示功能实现

2.1 布局文件

<template>
  <div class="app-container">

    <input type="text" v-if="inputVisible" @blur="showButton">
    <button v-else @click="showInput">展示输入框</button>

  </div>
</template>

2.2 逻辑文件

export default {
  methods:{
    showInput(){
      this.inputVisible=true
    },
    showButton(){
      this.inputVisible=false
    }
  },
  data() {
    return {
      //控制输入框和按钮的按需切换;
      //默认值为false,表示默认展示按钮,隐藏输入框
      inputVisible: false
    }
  },

}

2.3 效果图

三 了解this.$nextTick的应用场景

3.1 当文本框显示时,自动获取焦点

布局文件(给input添加ref属性)

<input type="text" v-if="inputVisible" @blur="showButton" ref="iptRef">
<button v-else @click="showInput">展示输入框</button>

代码文件(input添加focus方法)

showInput(){
    //1.切换布尔值,把文本框显示出来
     this.inputVisible=true
     //2.让展示出来的文本框,自动获取焦点
     this.$refs.iptRef.focus()
 },

结果

vue.runtime.esm.js?c320:4605 [Vue warn]: Error in v-on handler: "TypeError: Cannot read properties of undefined (reading 'focus')"

found in

---> <App> at src/App.vue
       <Root>
vue.runtime.esm.js?c320:3049 TypeError: Cannot read properties of undefined (reading 'focus')
    at VueComponent.showInput (App.vue?11c4:41:1)
    at invokeWithErrorHandling (vue.runtime.esm.js?c320:3017:1)
    at HTMLButtonElement.invoker (vue.runtime.esm.js?c320:1815:1)
    at original_1._wrapper (vue.runtime.esm.js?c320:7473:1)

原因:

iptRef为空,导致focus方法出错

3.2 this.$nextTick(cb) 方法

组件的 $nextTick(cb) 方法,会把 cb 回调推迟到下一个 DOM 更新周期之后执行。通俗的理解是:等组件的
DOM 更新完成之后,再执行 cb 回调函数。从而能保证 cb 回调函数可以操作到最新的 DOM 元素

3.3 使用this.$nextTick(cb) 方法修改后

代码

showInput(){
      //1.切换布尔值,把文本框显示出来
      this.inputVisible=true
      //2.让展示出来的文本框,自动获取焦点
      this.$nextTick(()=>{
        this.$refs.iptRef.focus()
      })
    }

四 updated为啥不行

4.1 updated修改

updated(){
    this.$refs.iptRef.focus()
  },

4.2 现象

创建时正常,销毁时出错,错误现象如下:

vue.runtime.esm.js?c320:4605 [Vue warn]: Error in updated hook: "TypeError: Cannot read properties of undefined (reading 'focus')"

found in

---> <App> at src/App.vue

4.3 原因

  • 第一次(创建时),input展示获取焦点—正常
  • 第二次(销毁时),input不展示,又获取焦点—失败

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值