最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Vue实战时用到的API(二):$nextTick

    正文概述 掘金(白马过平川吉吉)   2020-12-30   471

    什么是$nextTick


    老规矩先来看下官方文档对它的介绍:

    在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

    用途


    首先我们来讲解一些常见的场景:

    1. 假设我们修改了一个Dom里的数据,又要马上获取这个数据。上个代码加深理解
    <div id="demo" @click="getText($event)">{{text}}</div>
    <script>
     new Vue({
      el:'#demo',
      data:{
        text:'修改前的数据'
      },
      methods:{
        getText(event){
          this.text='修改后的数据'
          console.log(event.target.innerText)
        }
      }
    })
    </script>
    

    在上面提供的代码里,当我们点击 div 时,会调用方法去改变 div 内部的值,此时我们想输出这个 div 内部的值会是什么呢? Vue实战时用到的API(二):$nextTick

    结果依然是修改前的值,这跟我们想要的需求不大一样,加上$nextTick试试:

    <div id="demo" @click="getText($event)">{{text}}</div>
    <script>
      new Vue({
        el:'#demo',
        data:{
          text:'修改前的数据'
        },
        methods:{
          getText(event){
            this.text='修改后的数据'
            this.$nextTick(function(){
              console.log(event.target.innerText)
            })
    
          }
        }
      })
     </script>
    

    在这里我们将输出放在了 $nextTick 的回调函数里,这保证了里面的输出会在DOM更新之后再调用,此时的输出应该是什么呢? Vue实战时用到的API(二):$nextTick

    这个时候我们的需求才算达成。

    1. 当我们想要在Vue生命周期的 created() 钩子函数进行的DOM操作一定要放在 $nextTick() 的回调函数中,因为在 created() 时DOM还没开始渲染,此时对它的操作自然都是徒劳的,当我们将操作放在 $nextTick() 的回调函数后,就能保证当操作执行时已经存在DOM结构

    实战遇到的一个问题


    我想实现的需求类似是:在父组件的下拉框选择一个值,通过props传递给子组件。同时触发子组件的函数去获取这个值作为一些接口的参数,代码如下:

    <div id="blog-post-demo" class="demo">
      <select  v-model="fatherTitle" @change="change">
        <option :value="post" v-for="post in posts" :key="post">{{post}}</option>
      </select>
      <blog-post : ref="child"></blog-post>
    </div>
    <script>
      Vue.component("blog-post", {
        props: ["title"],
        template: "<h3>{{ title }}</h3>",
        methods:{
          getResult(){
            console.log(this.title)
          }
        }
      });
      new Vue({
        el: "#blog-post-demo",
        data: {
          posts: [1,2,3],
          fatherTitle:''
        },
        methods:{
          change(){
            this.$refs.child.getResult()
          }
        }
      });
    </script>
    

    如上我先打印出这个值,但出现了很奇怪的情况,每次获取到的值都是上一次选中的选项,如第一次是 undefined ,第二次是第一次选中的值。改了很久,最终还是用了上文提到的 $nextTick 去解决,在 change 方法中修改了点,如下:

    change(){
      this.$nextTick(function(){
        this.$refs.child.getResult()
      })   
    }
    

    这样我们就能准确的获取每次选中的结果了,但是我还是觉得没解决到点上,如果有大佬看出的话,可以帮我解惑下谢谢!


    起源地下载网 » Vue实战时用到的API(二):$nextTick

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元