nexttick和$nexttick,$nexttick的使用场景

  nexttick和$nexttick,$nexttick的使用场景

  我们用vue的时候,经常用这个。$nextTick,相信你用过。我常见的场景是,当我们获取数据后需要对新视图进行下一步操作或其他操作时,发现无法获取dom。本文主要向大家介绍关于$nextTick的相关信息,有需要的可以参考一下。

  :

目录

   1.功能描述2。父组件3。子组件NextTick.vue4为什么未定义5。把v-if改成v-show可以获得焦点吗?6.实际结果7。把一个组件变成页面可以获得焦点吗?8.为什么$nextTick9有区别?Vue.nextTick还有这个。$nextTick 10。使用nextTick的提示摘要

  

1.功能描述

  今天我们想实现这个小功能;在页面呈现后显示div元素;单击此div元素后;Div元素消失;出现输入元素;并且输入元素被聚焦。我想大家都觉得很简单。来看看吧~

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

  在页面中介绍注册

  

2.父组件

  模板

  差异

  下一滴答/下一滴答

  /div

  /模板

  脚本语言

  从导入下一刻度./components/NextTick.vue

  导出默认值{

  名称:“关于”,

  组件:{

  下一滴答

  },

  }

  /脚本

  

3.子组件NextTick.vue

  模板

  差异

  我是一个组件/div。

  div-if= flag class= sun @ click= hander click 显示输入/div

  输入v-else ref= input ref class= yue Laing /

  /div

  /模板

  脚本

  导出默认值{

  data(){

  返回{

  flag:真的,

  }

  },

  方法:{

  handerClick(){

  this.flag=false

  这个。$ refs . input ref . focus();

  },

  },

  }

  /脚本

  

4为什么是undefined

  this.flag=false

  这个。$ refs . input ref . focus();

  这个。执行页面操作时的$ refs . input ref . focus();

  需要时间(还没刷新;或旧页面)

  此时,尚未获得dom元素。

  所以会报错。

  解决方案1:

  所以只要让页面获取元素;使用setTimeout

  setTimeout(()={

  这个。$ refs . input ref . focus();

  },100)

  这样处理这个问题是可能的;

  但是很不专业;

  解决方案2:

  //当组件根据最新的数据data再次在视图上完成渲染时,就会执行里面的函数。

  这个。$nextTick(()={

  这个。$ refs . input ref . focus();

  })

  

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

  有人说:因为v-if是动态创建和销毁的;在创造和毁灭的过程中,是需要时间的!这就是为什么用v-if无法得到元素节点,用v-show可以避免的原因。

  有道理,你知道吗?

  我们试试把v-if改成v-show。

  模板

  差异

  我是一个组件/div。

  div-Show= flag class= sun @ click= hander click 显示输入/div

  输入v-show=!flag ref= input ref class= yue Laing /

  /div

  /模板

  脚本

  导出默认值{

  data(){

  返回{

  flag:真的,

  }

  },

  方法:{

  handerClick(){

  this.flag=false

  console.log(这个。$ refs . input ref);

  这个。$ refs . input ref . focus();

  },

  },

  }

  /脚本

  

6.实际结果

  我们发现虽然页面没有报错,但是没有焦点。换成v秀显然解决不了这个问题。

  出现此问题是因为在子组件中设置this.flag=false后立即执行了以下代码。

  这个。$ refs . input ref . focus();

  在执行的时候,视图还没来得及刷新;还是旧的一页。这个时候我们无法获取dom元素,所以未定义;出现。这就是为什么我们可以在加入延时后对焦;

  当组件根据最新的数据data再次在视图上完成渲染时,它执行其中的函数。

  这是$nextTick的基本用法

  这个。$nextTick(()={

  这个。$ refs . input ref . focus();

  })

  

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

  还有人说:因为是子组件,所以子组件比父组件渲染的晚。所以没有获得元素节点。

  也是这个原因。

  感觉不如上一个朋友对,为了解惑。我们决定将子组件变成页面来看看。

  模板

  差异

  我是一个组件/div。

  div-Show= flag class= sun @ click= hander click 显示输入/div

  输入v-show=!flag ref= input ref class= yue Laing /

  /div

  /模板

  脚本

  导出默认值{

  data(){

  返回{

  flag:真的,

  }

  },

  方法:{

  handerClick(){

  this.flag=false

  这个。$ refs . input ref . focus();

  },

  },

  }

  /脚本

  我们发现我们仍然不能;这充分说明在更新了data的数据后,vue并没有实时更新。

  更新数据和在页面上显示数据之间存在时间差。我们调用时差内的页面数据,当然是取不到的。

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

  

8.为什么会有$nextTick

  之所以有$ next tick因为vue中数据变化后;视图上的dom不会立即更新;dom需要时间来跟上新的。

  我们通过一个小实验来看看。

  模板

  差异

  div ref=unique

  h1{{ cont }}/h1

  /div

  更改值/div

  /div

  /模板

  脚本

  导出默认值{

  data(){

  返回{

  Cont:我是默认值

  }

  },

  方法:{

  handerClick(){

  This.cont=我更改了默认值;

  console.log(1==,this。$ refs . unique . innertext);

  这个。$nextTick(()={

  console.log(2==,this。$ refs . unique . innertext);

  })

  },

  },

  }

  /脚本

  我们发现第一次的值和第二次的值不一样。因为视图上dom的更新是必要的;我们得到这个差内的元素值;仍然是旧值;所以第一个值是初始值;第二个值是更改后的值;

  因为我们希望在跟踪新数据后立即获得dom上的值。

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

  

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

  Vue.nextTick是一个全局方法。

  这个。$nextTick( [callback])是实例方法。

  我们都知道一个页面可以有多个实例,这意味着。$nextTick可以精确到某个实例。其实两者本质上是一样的。

  只有一个是全局的,另一个是精确到某个实例的。只是准确度不同而已。

  

10.使用 nextTick的一个小技巧

  我们都知道,在挂载渲染的生命周期中,我们不能100%保证所有子组件都能渲染出来,所以可以用这个。$nextTick in已安装,以确保所有子组件都可以呈现。

  在服务器端呈现期间不调用挂载的挂钩。

  已安装:函数(){

  这个。$nextTick(function () {

  //当数据改变时,

  //再次完成对视图的渲染后,执行里面的方法。

  //这句话相当于:

  //将回调延迟到下一个DOM更新周期之后

  //相当于:修改数据后,再等待DOM更新后再执行

  })

  }

  

总结

  关于$nextTick的这篇文章到此为止。有关$nextTick的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: