最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 七日打卡-Vue中$nextTick()用法解析

    正文概述 掘金(LXX5785)   2021-01-11   494

    应用场景

    有一个div,默认用了v-if隐藏,点击按钮之后,改变v-if的值让他显示出来,并且取到div中的值:

    <div id=app>
      <div id="div" v-if="showDiv">我是显示文本</div>
      <button @click="showAndGetText">获取内容</button >
    </div>
    <script>
    var app = new Vue({
      el: '#app',
      data () {
        return {
          showDiv : false
        },
        methods: {
          showAndGetText () {
            this.showDiv  = true
            let text = document.getElementById('div').innerHTML
            console.log(text)
          }
        }
      }
    })
    </script>
    

    这段代码并不难理解,但是控制台回抛出一个'innerHTML' of null的错误,因为此时页面并未完成渲染,它并没有获取到div元素,这里涉及到一个Vue的重要概念:异步更新队列

    Vue在观察到数据变化时并不是直接更新DOM,而是开启一个队列,并缓冲同一事件循环中发生的所有数据改变。

    在缓冲时会去除重复的数据,这样避免了不必要的计算和DOM操作。然后,在下一个时间循环Tick中,Vue刷新队列并执行已去重的工作。

    所以,如果你用一个for循环来动态改变数据100次,其实它只会应用最后一次改变,如果没有这种机制,DOM就要重绘100次,这是我们不愿意看到的。

    知道了Vue异步更新DOM的原理之后,上面的现象就不难理解了,事实上在this.showDiv = true时,div仍然是没有被创建出来的,下面的

    let text =document.getElementById('div').innerHTML console.log(text)
    

    仍然读取的是这一次事件循环的DOM,而实际上在这一次事件循环中,DOM并没有更新,所以是读取不到的。

    我们需要等下一个Vue事件循环,DOM更新完成后再读取,就可以读取到了。

    那么这时就是$nextTick闪亮登场的时候:

    <div id=app>
      <div id="div" v-if="showDiv">我是显示文本</div>
      <button @click="showAndGetText">获取内容</button >
    </div>
    <script>
    var app = new Vue({
      el: '#app',
      data () {
        return {
          showDiv : false
        },
        methods: {
          showAndGetText () {
            this.showDiv  = true
            this.$nextTick(function () {
         	   let text = document.getElementById('div').innerHTML
        	   console.log(text)
            })
          }
        }
      }
    })
    </script>
    

    这样就取到我们想要的文本数据了。

    理论上,我们不应主动去操作DOM,因为Vue的核心思想就是数据驱动DOM,但在很多业务里,我们避免不了会操做一些DOM,这时我们就有可能用到$nextTick

    Vue.js 通常鼓励开发人员沿着“数据驱动”的方式思考,避免直接接触 DOM。

    this.$nextTick()官方介绍: 将回调延迟到下次 DOM 更新循环之后执行。 在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。


    起源地下载网 » 七日打卡-Vue中$nextTick()用法解析

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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