2021年7月2日星期五

vue中$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" @click="handerClick">显示input</div>  <input v-else ref="inputRef" /> </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:因此只要让页面能够获取元素就行;使用setTimeoutsetTimeout(()=>{  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" @click="handerClick">显示input</div>  <input v-show="!flag" ref="inputRef" /> </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" @click="handerClick">显示input</div> <input v-show="!flag" ref="inputRef" /> </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 @click="handerClick">改变值</div> </div></template><script>export default { data(){ ......

原文转载:http://www.shaoqun.com/a/843141.html

跨境电商:https://www.ikjzd.com/

asiabill:https://www.ikjzd.com/w/1014

四海商舟:https://www.ikjzd.com/w/1516

网上1号店:https://www.ikjzd.com/w/2263


1.功能描述今天我们要实现这个一个小功能;页面渲染完成后展示一个div元素;当点击这个div元素后;div元素消失;出现一个input元素;并且input元素聚焦想必大家我觉得简单,我们一起来看看~创建一个组件,组件名称NextTick.vue;在页面中引入注册2.父组件<template><div><next-tick></next-tick>&l
点通:https://www.ikjzd.com/w/1913
【荆门马拉松】2021荆门国际马拉松报名费-时间-地点-路线:http://www.30bags.com/a/434233.html
【景区门票涨与否须听证】 - :http://www.30bags.com/a/408821.html
【净土喀纳斯 雪都阿勒泰】天鹅与童话边城共舞冬日恋歌:http://www.30bags.com/a/223743.html
【镜泊湖冬季捕鱼节】2018镜泊湖冬捕时间、地点、活动 :http://www.30bags.com/a/436141.html
口述:公公竟然偷听我和丈夫爱爱公公老公爱爱:http://lady.shaoqun.com/a/33727.html
女班主任在我胯间喘息 掀开超短裙老师裙子挺进去:http://lady.shaoqun.com/m/a/247547.html
老师把腿张大点我要进去 老师你夹得我好紧好爽:http://lady.shaoqun.com/m/a/247511.html
再也不怕收不到短信验证码了!Facebook双重验证备用验证码设置攻略:https://www.ikjzd.com/articles/146330
深入运营之百万美金销售额(一):https://www.ikjzd.com/articles/146327
运价"疯了"!现在运送300个集装箱运费可以买一艘船?黄牛搅局航运市场!外贸物流苦不堪言:https://www.ikjzd.com/articles/146322
深圳7月免费展览汇总:http://www.30bags.com/a/467629.html