最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Vue 追踪数据变化

    正文概述 掘金(用户3111253633426)   2021-04-08   531

    背景

    工作中时不时就会遇到这种情况:页面上显示的数据不对,需要前端同事进行定位。

    在一个使用 Vue 搭建的 SPA 应用上,页面最终展示的数据,从初始化,到最后的展示,过程可能很简单,也可能很复杂。遇到复杂的数据流,没有合适的方法,排查起来会很头疼。

    如果能够看到数据发生变化时的调用栈,就可以知道在错误的数据生成前,发生了什么,是哪一步的错误,导致了最终的错误。顺着调用栈给出的线索找下去,就能够快速定位到问题。

    例子

    <template>
      <div>
        <!-- 预期输出:hello,world -->
        <!-- 实际输出:hello,woold -->
        {{ msg }}
        <button @click="f1">change msg</button>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          msg: 'hello,',
        }
      },
      methods: {
        f1() {
          this.msg += 'w'
          this.f2();
        },
        f2() {
          this.msg += 'oo';
          this.f3();
        },
        f3() {
          this.msg += 'ld'
        }
      }
    };
    </script>
    

    误区 - 在 Watch 里打断点查看调用栈

    Vue 追踪数据变化

    我们可以在页面右边的 Call Stack 看到 f1msg 的回调,但是看不到 f2f3。也就是说 f2, f3 丢失了,但实际上正是 f2 导致数据发生了错误。

    为什么 f2f3 的调用信息会丢失?

    因为 f1, f2, f3 都修改了 msg,在同一个微任务里触发了 msgWatcher,因为 f1 最先触发,所以f2,f3 的触发无效。最终 Watcher 回调运行的时候,只记得是 f1 触发它的,所以此时的 Call Stack 只能看到 f1 的信息。

    正确的做法

    进入到 node_modules\vue\dist\vue.runtime.esm.js,在 defineReactive 函数的 set 方法里添加断点,这里的 key 就是要监听的变量的名字。

    Vue 追踪数据变化 在这里,就能够看到 msg 发生变化的完整过程,快速定位到是 f2 导致的问题。

    总结

    通过查看调用栈的方式,不需要对项目有多熟悉,就能够快速定位到数据发生错误的地方。相比于用 console.log 或者花很多时间去理清代码逻辑,数据流的方式,可以减少很多的工作量。


    起源地下载网 » Vue 追踪数据变化

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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