一切的一切都是因为封装一个简单的进度条组件而引发的血案

起初的思路

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

 <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.clientWidthreturn{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.clientWidththis.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执行时机是在页面更新/渲染前 和页面更新/渲染 之间执行的。二者都拿不到最新的模板。

关于watch和computed的执行时机相关推荐

  1. python array赋值_从踩坑学Python内部原理(5):执行时机的差异

    (给Python开发者加星标,提升Python技能) 英文:Satwik Kansal,翻译:暮晨 Python开发者整理自 GitHub [导读]:Python 是一个设计优美的解释型高级语言,它提 ...

  2. js延时函数_JS 函数的执行时机

    JS 函数的执行时机 下面将有这段JS 代码,来理解JS 函数的执行时机 let 目录 解释为什么上面代码会打印 6 个 6 写出让上面代码打印 0.1.2.3.4.5 的方法 除了使用 for le ...

  3. JAVA构造器、静态上下文的执行时机与代码执行顺序详解

    先看代码案例 package com.exemple.demo.test.preciate;public class Father {private int i = test();private st ...

  4. C++析构函数的执行时机

    析构函数的执行时机 析构函数在对象被销毁时调用,而对象的销毁时机与它所在的内存区域有关. 在所有函数之外创建的对象是全局对象,它和全局变量类似,位于内存分区中的全局数据区,程序在结束执行时会调用这些对 ...

  5. springMVC中拦截器执行时机和执行顺序分析

    1. 拦截器的作用时机 和过滤器一样,拦截器也可以拦截请求. 过滤器是在DispatcherServlet处理之前拦截,拦截器是在DispatcherServlet处理请求然后调用控制器方法(即我们自 ...

  6. Spring源码学习:BeanPostProcessor注册和执行时机

    目录 前言 1 BeanPostProcessors作用 2 源码分析 2.1 BeanPostProcessors注册时机 2.1.1 注册beanPostProcessorChecker 2.1. ...

  7. js for循环_JS 函数的执行时机(深入理解6个6)

    定时器:setTimeout() setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式 提示: 1000 毫秒= 1 秒. 提示: 如果你只想重复执行可以使用 setInterval ...

  8. Golang中defer的执行时机

    1.defer的执行顺序 底层是采用栈 func func1() {fmt.Println("A") }func func2() {fmt.Println("B" ...

  9. js 等待某个函数执行完_JS 函数的执行时机

    JS函数在不同的时候运行,会有不同的运行结果,本文将分别举例分析 案例一 let a = 1 function fn(){ console.log(a) } 注意:这里不会打印任何东西,因为函数只是声 ...

最新文章

  1. 2017 ACM-ICPC 亚洲区(西安赛区)网络赛
  2. Android简易音乐播放器实现代码
  3. Nginx URL重写(rewrite)配置及信息详解
  4. android 剪贴板管理器,安卓剪贴板管理(Clipper Plus)
  5. python逐行读取字符串_python3.4.3下逐行读入txt文本并去重的方法
  6. 以人为本、用“简”驭“繁”……统统都是新华三物联网的关键词儿!
  7. python实现qq登录界面_使用Python编写一个QQ办公版的图形登录界面!
  8. 共享充电宝“脱贫”:打脸王思聪 眼红了“负翁”ofo
  9. drools 7.11.0.Final使用
  10. 你会想待下去吗?世界上25个最惊险的屋顶
  11. 博文视点大讲堂第24期:PPT演示之道
  12. ansible 建 kubernetes 证书签名请求_Kubernetes 两步验证 - 使用 Serverless 实现动态准入控制
  13. 勒索病毒免费解密工具都在这里!
  14. 万字详解加拿大央行CBDC分析报告
  15. Facebook_scraper:Python获取FB用户的公开发帖【FaceBook系列 一】
  16. nginx配置路径、跨域、本机自定义server_name
  17. ZDM2004工具式绘图软件v1.7 for AutoCAD2004 1CD(水电版)
  18. 【Android】SingleTask与SingleInstance的区别
  19. element之el-scrollbar
  20. 信息学奥赛一本通:1168:大整数加法

热门文章

  1. 如何使用我们的“激活码”激活我们的在线EPF帐户? –第3部分
  2. DeathStarBench-Running the social network application
  3. OpenGL蓝宝书第九章学习笔记:片段着色器和帧缓存
  4. 回顾HTML5省技能大赛(html5交互融媒体内容设计与制作)
  5. 做影视后期需要学习哪些行业软件?
  6. JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(上)(各种乱码、验证码、重定向和转发)
  7. 【Windows】一款优秀的CMD替代软件-cmder
  8. MySQL 笛卡尔集
  9. oracle列转行 多个字段_oracle 列转行、行转列
  10. VIM 用正则表达式,非贪婪匹配,匹配竖杠,竖线, 匹配中文,倒数第二列, 匹配任意一个字符 :...