我的编程空间,编程开发者的网络收藏夹
学习永远不晚

让你一看就明白的$nextTick讲解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

让你一看就明白的$nextTick讲解

1.功能描述

今天我们要实现这个一个小功能;页面渲染完成后展示一个div元素;当点击这个div元素后;div元素消失;出现一个input元素;并且input元素聚焦,想必大家觉得简单,我们一起来看看~

创建一个组件,组件名称NextTick.vue;

在页面中引入注册

2.父组件


<template>
  <div>
    <next-tick></next-tick>
  </div>
</template>

<script lang="ts">
import NextTick from "../components/NextTick.vue"
export default {
  name:"About",
  components:{
    NextTick
  },
}
</script>

3.子组件NextTick.vue


<template>
    <div>
        <div>我是组件</div>
        <div v-if="flag" class="sun" @click="handerClick">显示input</div>
        <input v-else ref="inputRef" class="yuelaing"/>
    </div>
</template>
<script>
export default {
    data(){
        return{
            flag:true,
        }
    },
    methods: {
        handerClick(){
            this.flag=false;
            this.$refs.inputRef.focus();
        },
    },
}
</script>

4为什么是undefined


this.flag=false;
this.$refs.inputRef.focus();

当执行页面操作的时候,this.$refs.inputRef.focus();

是需要消耗时间的(还没有还得及刷新;还是旧的页面)

此时还没有获取到dom元素。

所以会报错。

解决方式1:

因此只要让页面能够获取元素就行;使用setTimeout


setTimeout(()=>{
      this.$refs.inputRef.focus();
},100)

这样来处理这个问题,是可以的;

但是显得非常的不专业;

解决方式2:


//当组件根据最新的data数据,重新在视图上完成渲染后,在执行里面的函调函数
this.$nextTick(()=>{
    this.$refs.inputRef.focus();
})

5.将v-if更改为v-show可以获取焦点吗?

有人说:因为v-if是动态创建和销毁;在创建和销毁的过程中,是需要时间的!所以才会使用v-if获取不到元素节点,用v-show就可以避免。

感觉说的有点道理?

我们尝试一下将v-if换成v-show


<template>
    <div>
        <div>我是组件</div>
        <div v-show="flag" class="sun" @click="handerClick">显示input</div>
        <input v-show="!flag" ref="inputRef" class="yuelaing"/>
    </div>
</template>
<script>
export default {
    data(){
        return{
            flag:true,
        }
    },
    methods: {
        handerClick(){
            this.flag=false;
            console.log( this.$refs.inputRef);
            this.$refs.inputRef.focus();
        },
    },
}
</script>

6.实际结果

我们发现虽然是页面没有报错,但是还没有聚焦;改为v-show明显也不能够解决这个问题

之所以会出现这个问题,是因为子组件中将this.flag=false后,立刻去执行了下面的代码

this.$refs.inputRef.focus();

而在执行的时候,视图还没没有来得及刷新;还是旧的页面,此时还不能够获取到dom元素,因此出现了undefined;也就是为什么我们加上延时后就可以聚焦了;

当组件根据最新的data数据,重新在视图上完成渲染后,在执行里面的函调函数

这就是$nextTick的基本用法


this.$nextTick(()=>{
    this.$refs.inputRef.focus();
})

7.将组件变成页面可以获取焦点吗?

又有人说:因为是子组件,子组件比父组件后渲染。所以没有获取到元素节点。

这也是理由....

感觉还没有上一个小伙伴说的对,为了解决疑惑。我们决定将子组件变成页面在看看


<template>
  <div>
    <div>我是组件</div>
    <div v-show="flag" class="sun" @click="handerClick">显示input</div>
    <input v-show="!flag" ref="inputRef" class="yuelaing"/>
  </div>
</template>
<script>
export default {
  data(){
    return{
        flag:true,
    }
  },
  methods: {
      handerClick(){
        this.flag=false;
        this.$refs.inputRef.focus();
      },
  },
}
</script>

我们发现仍然不可以;这就充分说明了:更新data的数据后,vue并不是实时更新的。

数据更新到显示到页面有时间差,我们在时间差内调用页面数据,当然获取不到。

也就是说:Vue在更新 DOM 时是异步执行的

8.为什么会有$nextTick

之所以会有$nextTick;因为在vue中数据发生变化后;视图上的dom并不会立刻去跟新;dom的跟新是需要时间的

下面我们通过一个小实验来看一下


<template>
  <div>
    <div ref="unique">
      <h1>{{ cont }}</h1>
    </div>
    <div  class="sun" @click="handerClick">改变值</div>
  </div>
</template>
<script>
export default {
  data(){
    return{
      cont:'我是默认值'
    }
  },
  methods: {
      handerClick(){
        this.cont='我改变了默认值';
        console.log('1==>',this.$refs.unique.innerText);
        this.$nextTick(()=>{
          console.log('2==>',this.$refs.unique.innerText);
        })
      },
  },
}
</script>

我们发现,第一次的值和第二次的值,是不一样的;因为视图上dom的跟新是需要之间的;我们在这个之间差内去获取元素值;仍然是旧值;所以第一次的值是最初的值;第二次的值才是改变后的值;

由于我们希望跟新数据后,仍然可以立刻获取dom上的值

所以vue提供了$nextTick就可以解决这个问题

9.Vue.nextTick和this.$nextTick差别

Vue.nextTick是全局方法

this.$nextTick( [callback] ) 是实例方法。

我们都知道一个页面可以有多个实例,也就是说this.$nextTick可以精确到某个实例上。其实本质上两个是一样的。
只是一个是全局,一个是精确到某一个实例。精确度不一样而已。

10.使用 nextTick的一个小技巧

我们都知道在生命周期mounted渲染的时候,不能百分百保证所有的子组件都能够被渲染,因此我们可以在mounted里面使用 this.$nextTick,这样就能保证所有的子组件都能被渲染到。

mounted钩子在服务器端渲染期间不被调用。


mounted: function () {
  this.$nextTick(function () {
    //在数据发生变化,
    //重新在视图上完成渲染后,在执行里面的方法
    //这一句话等同与:
   //将回调延迟到下次 DOM 更新循环之后执行
   //等同于:在修改数据之后,然后等待 DOM 更新后在执行
  })
}

总结

到此这篇关于$nextTick的文章就介绍到这了,更多相关$nextTick讲解内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

让你一看就明白的$nextTick讲解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

网络工程|不懂域名解析?一个例子让你明白了解

  正在学习域名解析的朋友们或者都会有这样的一个感受,就是在网上搜索DNS等相关的概念的时候,各种各样的版本的解析让人眼花缭乱,最后看完介绍还是不懂什么是域名解析,本文将要为大家举例子来介绍一下什么是域名解析,有不懂的朋友们可以仔细的看看!  在网上看到的域名解析可能是这样的:  域名解析是把域名指向网站空间IP,让人
网络工程|不懂域名解析?一个例子让你明白了解
2024-04-17

一条命令让你明白shell中read命令的常用参数

我们知道,在Shell中接收传入的参数有两种方式。一种是通过脚本进行参数传递,另外一种是通过read来接收传入的参数。通过脚本来传递参数的简单示例如下:# 通过脚本来传递,这里$0指脚本名,$1为第一个参数,$2为第二个参数 [root@h
2022-06-04

软考一次过的概率大吗?看完软考通过率分析就明白了!

最近已经陆续有人拿到软考证书了,当然,也有不少人未能通过考试,只能下半年或者明年再战。而软考作为近些年的热门考试,每年的报考人数都不少,因此许多人十分好奇软考的通过率怎么样,是否有人一次就过。接下来小编就和大家分析一番软考通过率,一起来看看吧~
软考一次过的概率大吗?看完软考通过率分析就明白了!
2024-08-20

两分钟让你彻底明白Android Activity生命周期的详解(图文介绍)

大家好,今天给大家详解一下Android中Activity的生命周期,我在前面也曾经讲过这方面的内容,但是像网上大多数文章一样,基本都是翻译Android API,过于笼统,相信大家看了,会有一点点的帮助 ,但是还不能完全吃透,所以我今天特
2022-06-06

小白必看:解读2024年软考的9大关键词,让你轻松了解软考!

  用列关键词的方式,帮助大家了解软考。  24年软考即将拉开帷幕,对于那些希望了解和参与软考的同学,小编为您解读2024年软考的9大关键词,帮助你轻松了解软考。  01、国家级考试  计算机软件资格考试是由国家人力资源和社会保障部、工业和信息化部领导下的国家级考试,其目的是科学、公正地对全国计算机与软件专业技术人员进
小白必看:解读2024年软考的9大关键词,让你轻松了解软考!
2024-04-19

编程热搜

目录