zoukankan      html  css  js  c++  java
  • Vue computed参数与各生命周期关系(主要是异步的时候)

    前面聊了vue生命周期与路由的先后顺序,现在聊聊computed与各生命周期。先聊一下需求背景,我在做一个图表的时候遇到了,我将图表样式封装为一个组件,然后各个地方需要的时候将数据通过props传入到组件自动画图。因为我这个数据会变化,我的方法里面又有比较多的方法了,就像弄到计算属性里面去,这样在data里面也可以少定义一个属性,然后问题就来了。我在子组件里面读取的props竟然是未定义!!这个问题留到后面解释。

    上次我们知道了父组件子组件生命周期的关系,同理我在computed当中定义了一个属性

    computed:{
    
      test:function(){
    
        return '我是test'
      }
    
    }

    然后我在父组件和子组件生命周期当中都打印出来了。当然我们的computed肯定是有一定的逻辑代码才对的,所以我有写下了这样的测试

    data:{
        a:23,
        b:32
    },
    computed:{
      test(){
        return this.a+this.b;
       }      
    }

    结果与上面一致,那么说明computed的属性是在created之前就已经执行了。

    好这个时候回到我们的问题,我在computed里面定义的为什么在子组件props里面未定义呢。

    基于上面的结论我在父级打印我的test发现未定义,那么这个时候子组件的未定义就可以理解了。先贴上我的代码吧

    computed:{
      test(){
      this.ajax.get('url').then((res)=>{
    return res.data;
    })      
        }  
    }

    相信很多人已经明白了,我这是一个异步操作,然而computed在beforeCreate的时候就已经执行了。这个时候我的test相当于没有东西,当然是未定义了。所以导致我整个结构崩盘。

    后来我的做法

    在data里面定义好test,然后在方法里面建一个_test方法获取数据以后去修改test。然后在子组件的watch里面定义一个监听,监听这个test,test变化就绘图。

    其实在computed里面我也尝试过用watch去监听,然后发现问题。computed里面的属性是没有直接的双向数据绑定的。我在<input v-model='test'>直接修改是没用的,只能修改它依赖的data属性。官方也解释了计算属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。

    总结computed是严重依赖data属性的,如果computed里面没有依赖data里面的属性,那就不要用computed了,真心没用后面都没办法去修改。

    写的好像有些乱啊,反正我看了,不用吃枪吃毒了。

  • 相关阅读:
    第六章实验报告
    第三次实验报告
    循环结构课后反思
    分支结构试验
    第七组509寝室课后习题4.34
    c语言实验报告
    第九章 结构体与共用体
    第八章实验报告(指针)
    第7章 数组实验报告
    函数与宏定义实验报告(2)
  • 原文地址:https://www.cnblogs.com/axl-study/p/7098169.html
Copyright © 2011-2022 走看看