关于watch和computed的执行时机

一切的一切都是因为封装一个简单的进度条组件而引发的血案
在这里插入图片描述

起初的思路

这个组件设计起来很简单,这是起初的思路

 <div class="bar" ref="bar">
   <div class="contianer" :style="barStyle"></div>
 </div>
</template>

   props:{
       progress:{
           type:Number,
           default:()=>0.3
       }
   },

   computed:{
       barStyle(){
           const w=this.$el.clientWidth
           return{
               background:'#0176FF',
               borderRadius:'4px',
               height: '18px' ,
               // width:'57px'
               width:`${w*this.progress}px`
           }
       }
   }

报错:
在这里插入图片描述
主要原因就是this.$el为undefined,也就是拿不到模板

新的改变

    export default {
    props:{
        progress:{
            type:Number,
            default:()=>0.3
        }
    },
    data(){
        return{
            offset:0
        }
    },
    computed:{
        barStyle(){
            return{
                background:'#0176FF',
                borderRadius:'4px',
                height: '18px' ,
                width:`${this.offset}px`
            }
        }
    },
    mounted(){
        this.setOffset(this.progress)
    },
    methods:{
        setOffset(progress){
            const w=this.$el.clientWidth
            this.offset=w*progress
        }
    }
}

解决思路也很简单,维护了一个offset变量,用来计算偏移量。
computed执行了两次,第一次offset为0 第二次是在mounted之后offset为1

思考

  • 为啥在computed中拿不到模板?computed执行时机是什么时候?
  • watch执行时机是什么时候呢?是否可以拿到模板呢?

1.watch不开起立即监听,
在这个例子中监听offset的变化

    watch:{
        offset:{
            handler(){
                console.log('watch')
            }
        }
    },

其他生命周期钩子也加上console
打印结果如下:
在这里插入图片描述
很明显 computed执行时机在页面首次渲染时是在beforeMount后 mounted之前
而watch是依赖发生变化才会执行(不开起立即监听情况),所以在mounted后offset改变了watch才会执行,而watch执行是优先于其他钩子的。computed也和初次渲染时执行情况类似,在beforeUpdate之后和updated之前,由此可见computed是永远拿不到最新的模板的。

2.watch开启立即监听

    watch:{
        offset:{
            handler(){
                console.log('watch')
            },immediate:true
        }
    },

在这里插入图片描述更加证明了之前的结论,watch执行时机是优先于其他钩子的,computed执行时机是在页面更新/渲染前 和页面更新/渲染 之间执行的。二者都拿不到最新的模板。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值