三个案例掌握this.$nextTick()方法的使用/Vue中的$nextTick()

news2025/1/21 12:08:31

        this.$nextTick() 解释为在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM.  也就是说,当dom元素发生改变,重新渲染dom树后,再执行vue.$nextTick()里面的内容。

        其实用方法一般为 this.$nextTick( ()=>{} ), 为了不影响this指向,一般为箭头函数。

案例一

 点击修改dom元素按钮,使字体变红,背景变蓝(设置为两次修改dom元素)

<template>
    <div>
      <div :id="myid" class="" ref="str">123456789</div>
      <button @click="changeColor()">修改dom元素</button>
    </div>
</template>
<script>
  export default {
    data() {
      return {
        myid:''
      };
    },
    methods: {
      changeColor(){
          this.myid = 'color'
          if (this.$refs.str.id == 'color') {
              this.$refs.str.className = 'background'
          }
      }
    }
  }
</script>
<style scoped>
  #color{color:red;}
  .background{background: green;}
</style>

       点击事件发生时,id属性值发生改变,改为color, 字符串变红,这个时候dom元素进行更新,但是条件判断并不是等到更新结束后才执行,判断结果为false,不会执行第二次修改dom元素。

        (只有第一次修改dom元素,dom更新结束之后,条件判断结果才为true)

 案例一未使用 this.$nextTick() 结果演示:

第一次点击事件后只有字体颜色改变。(第二次点击背景颜色才改变)

将第二次修改dom元素放入 this.$nextTick() 中:

    methods: {
      changeColor(){
          this.myid = 'color'
          
          this.$nextTick( () =>{
              if (this.$refs.str.id == 'color') {
                    this.$refs.str.className = 'background'
              }
          })
      }
    }

 案例一使用 this.$nextTick()后 结果演示

 点击事件后,两个修改dom元素都得到更新 (第一次字体变红,第二次背景为绿)

 案例二

  点击编辑,按照理来讲,应该自动获取焦点出现光标。 

<template>
    <div>
      <!-- :disabled='isDisabled'最初设置禁止输入属性 -->
      <input ref="inputTitle" type="text" value='' :disabled='isDisabled' placeholder="请输入内容">
      <button @click="getedit()">编辑</button>
    </div>
</template>
<script>
  export default {
    data() {
      return {
        isDisabled:true,
      };
    },
    methods: {
      getedit(){
          this.isDisabled = false
          this.$refs.inputTitle.focus() //获取焦点
      }
    }
  }
</script>
<style scoped>
    div{
      height: 40px;
      width:260px;
      background: gray;
    }
    input{
      margin:10px 10px 10px 10px ;
    }
</style>

        input输入框 必须得先设置为可编辑状态,才可以获取焦点, 但是我执行 this.isDisabled=false后,并不会等到dom元素更新结束,就会执行  ...focus()来获取焦点,因为设置为可编辑状态还未结束,所以一定获取不到焦点

 案例二未使用 this.$nextTick() 结果演示:

 点击编辑 ,并不会获取到焦点出现光标。

将获取焦点放入 this.$nextTick() 中:

    methods: {
      getedit(){
          this.isDisabled = false
          this.$nextTick(function(){
					  this.$refs.inputTitle.focus() //获取焦点
				})
      }
    }

案例二使用 this.$nextTick()后 结果演示:

 点击编辑,获取焦点。

案例三 

        首先要明白,vue声明周期函数中,在created阶段vue实例已经创建,但是还不能获取DOM元素。所以在这个阶段要修改dom元素,一般都是要放在this.$nextTick()

案例:

        在created阶段将vue实例中input标签的value属性更改为苹果 ,因为要等到dom树更新渲染完成之后,所以要用this.$nextTick() 否则控制台会报错(啥啥啥 is not definded in 啥啥啥 ...)

<template>
    <div><input ref="str" type="text" :value="string"></div>
</template>
<script>
  export default {
    data() {
      return {
        string:'苹果',
      };
    },
    created() {
      this.$nextTick(()=>{
        this.$refs.str.value = '西瓜'
        }
      )
    },
    mounted(){
       console.log(this.$refs.str.value);
    }
  }
</script>

演示结果:

        当dom元素更新后 控制台已经打印了苹果,之后执行this.$nextTick()里面的内容

         ...其实,用定时器也可以实现:

    created() {
      setTimeout(()=>{
        this.$refs.str.value = '西瓜'
      },10)
    },

定时器时间哪怕设置为0,也是异步加载,也没关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

讲讲vue3下会造成响应式丢失的情况

题引&#xff1a; 在我们从vue2过渡到vue3的时候&#xff0c;对于数据响应式的变化其实是懵懵懂懂的。从以往直接在data函数里面定义变量到每一次都要使用ref/reactive时&#xff0c;是有些不适应的。但问题不大&#xff0c;毕竟在大前端时代中&#xff0c;如果不及时跟上时代…

TS中快速定义一个对象数组以及处理async await的异常

定义一个对象数组&#xff08;即数组成员为对象&#xff0c;对象的属性为我们所约束&#xff09; 方法一&#xff1a;接口字面量形式 export type Resource {_id: string,personID: {_id: stringage: stringidentifier: stringname: stringnation: stringgrade: stringscheme…

contentEditable属性

前言 我们最常用的输入文本内容便是input与textarea&#xff0c;但是有一个属性&#xff0c;可以让我们在很多标签中&#xff0c;如div,table,p,span,body等&#xff0c;可以像input输入框一样&#xff0c;实现文本编辑&#xff0c;这便是contentEditable属性 contentEditabl…

【vue2】近期bug收集与整理01

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;记录博主在vue2中遇到过的坑&#xff0c;本文是博主的学习使用总结 目录 1登陆token的问…

【学姐面试宝典】前端基础篇Ⅴ——JS深浅拷贝、箭头函数、事件监听等

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【前端面试专栏】 今天继续学习前端面试题相关的知识&#xff01; 感兴趣的小伙伴一起来看看吧~&#x1f91e; 文章目录什么是事件监听事件委托以及冒泡原理介绍一下 promise&#x…

uniapp 小程序嵌套H5开发总结

项目需求是在uniapp小程序项目中嵌套H5页面&#xff0c;H5返回小程序需要传值给小程序进行通信。 好,百度一查确实可以实现 用的uniapp提供的web-view&#xff08;https://uniapp.dcloud.io/component/web-view.html#web-view经验证实&#xff0c;做功能之前先看官网&#xff…

一天时间迅速准备前端面试|JavaScript——异步进阶

&#x1f308;本系列文章是博主精心整理的面试热点问题&#xff0c;吸收了大量的技术博客与面试文章&#xff0c;总结多年的面试经历&#xff0c;带你快速建立前端面试知识体系。抓住每一场面试的机会&#xff0c;知己知彼才能百战百胜&#xff01; 上期回顾 JS基础–异步 本系…

【中秋快乐】如何用three.js实现我的太空遐想3D网页

目录 创作背景 功能分解 创建3d地球 创建3d月球 创建3d小火箭

解决element-ui动态加载级联选择器默认选中问题(Cascader)

前言 最近在开发任务中碰到需要在新增和修改时使用动态加载级联选择器&#xff0c;但是当在修改时设置默认选中项&#xff0c;出现了后端数据返回较慢&#xff0c;导致无法选中和级联框选中了但input框不显示的问题&#xff0c;网上找到的方法也不是很有效&#xff0c;还得使用…

Vue - v-for 循环渲染多个 “重复“ 子组件(仅 ref 不同,this.$refs.xx 使用时依然能准确找到子组件)将子组件 ref 设为动态,这样每个子组件都是 “独立“ 的!详细教程

前言 本教程更多版本:uni-app | 微信小程序 我们会通过给组件绑定 ref 值,然后通过 this.$refs.xx 来获取这个组件上的方法和变量。 如果 在 v-for 中循环渲染组件(绑定固定 ref),那么这个 ref 就会 “一摸一样”,导致根本无法找到(this.$refs.xx 谁?), 要解决这个问…

【前端】vue模板语法知识了解一下,是不是只知道用element-ui组件?

vue写在前面Vue模板语法文本原始HTML属性开源Vue模板和主题框架集合BootstrapVueelement-ui最后总结写在前面 上一篇总结了在实操过程中如果遇到了nodejs版本的问题&#xff0c;我们该如何去解决的&#xff0c;还有就是总结了vue2和vue3生命周期的区别&#xff0c;如果感兴趣的…

【JavaScript】JS实用案例分享:动态生成分页组件 | 通过按键实现移动控制

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 &#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&am…

React 路由v6 - 超全详解

React router v6 路由 已经习惯了 v5 版本的路由 &#xff0c;那么 v6 版本的路由 该怎么应用呢&#xff1f; 文章目录React router v6 路由Ⅰ、路由 v6 (两种形式)Ⅱ、 动态路由Ⅲ、路由重定向Ⅳ、路由跳转 (两种形式)Ⅴ、路由懒加载Ⅰ、路由 v6 (两种形式) 方案一 &#xff…

JS原生——编写简易计算器

一个非常适合新手练习的小案例&#xff01;&#xff01;&#xff01; 使用JS的ES5语法HTMLCSS及企业级代码规范&#xff0c;方便后续良好的代码习惯养成&#xff01;&#xff01;&#xff01; 先来看一下样式吧&#xff01;&#xff01;&#xff01;&#xff08;后附代码&…

组件通信的6种方式

什么是组件通信 vue组件中关系说明: 如上图所示, A与B、A与C、B与D、C与E组件之间是父子关系&#xff1b; B与C之间是兄弟关系&#xff1b;A与D、A与E之间是隔代关系&#xff1b; D与E是堂兄关系&#xff08;非直系亲属&#xff09; 针对以上关系我们归类为&#xff1a; 父…

前端跨域解决方案

文章目录1.同源政策2.跨域解决方案2.1 CORS普通跨域请求&#xff1a;只需服务端设置Access-Control-Allow-Origin即可携带cookie跨域请求&#xff1a;前后端都需设置2.2 JSONP原理缺点数据格式jsonp跨域实现2.3 postMessage跨域2.4 WebSocket属性&#xff1a;事件&#xff1a;使…

vue3+vite:本地代理,配置proxy

一、项目&#xff1a;uniappvue3vitets 二、配置文件在vite.config.ts proxy: {/snow: { // 匹配请求路径&#xff0c;localhost:3000/snowtarget: https://www.snow.com/, // 代理的目标地址changeOrigin: true, // 开发模式&#xff0c;默认的origin是真实的 origin:localh…

压缩gltf/glb模型踩坑与解决 three.js DRACOLoader

前言 使用前端three.js加载3d模型过程中&#xff0c;往往会出现模型大小过大导致前端加载时间过长&#xff0c;降低用户体验。 本文所记录的是笔者在使用gltf-pipeline压缩3d模型中踩坑DRACOLoader与解决的一个过程。 所采用的three库版本为 ^0.138.2 解决方案与介绍 通过g…

31.JavaScript数组进阶,一网打尽数组操作函数slice、filter、map、reduce、some、every、find、splice

文章目录数组进阶元素删除&#xff08;对象方式&#xff09;splice()删除一个元素删除多个元素截断数组元素替换元素插入返回值负索引slice()concat()forEach()indexOf、lastIndexOf、includesfind、findIndexfiltermapsortreversestr.split()和arr.join()reduce、reduceRightA…

vue在html标签 {{}} 中调用函数的方法

目录 一、问题 1&#xff09;实现上述需求&#xff1a;有两种方式 2&#xff09;两种实现方式对比&#xff1a; 二、解决方法&#xff08;在html渲染时调用函数&#xff09; 三、总结 注&#xff1a;不想仔细看的&#xff0c;可以直接看有颜色的及代码哟 一、问题 1.在ht…