vue 生命周期钩子的理解 watch computed
一 理解vue的生命周期,首先需要注意几个关键字
1. el :选择器
2. $el:对应选择器的template模板(html代码)
3. render:也是vue实例中的一项,其参数更接近vue解析器,按优先级,render参数 > vue实例对象中有template > 外部的HTML模板 后面两个也是将其编译成render函数
【注意】render选项参数比template更接近Vue解析器!所以优先级如下:
render函数选项 > template参数 > 外部HTML
4. $mount :当Vue实例没有el属性时,则该实例尚没有挂载到某个dom中,假如需要延迟挂载,可以在之后手动调用vm.$mount()方法来挂载。例如:
new Vue({内部无el项}).$mount('#app')是延迟加载,同下面的语句相同
new Vue({el:"#app",***})
二 各个生命周期 beforecreate》created》beforeMount》mounted》beforeDestroy
1. beforecreate:el 和 data 并未初始化;
案例:可以在这加个loading事件 及获取路由参数,但是this.(data|computed|methods)参数均为undefind(无法访问到 el 属性和 data 属性等),看不到页面的任何内容
2. 在beforeCreate和created之间:在这个生命周期之间,进行初始化事件,进行数据的观测,可以看到在created的时候数据已经和data属性进行绑定(放在data中的属性当值发生改变的同时,视图也会改变),页面内容如弹框等都存在了,也能被看到;
3. created:组件实例创建完成,属性已绑定,但 DOM 还未生成,$el 属性还不存在(this.$refs.XXX===undfined)。
案例:在这结束loading,还做一些初始化,如根据父组件props计算当前组件数据
4. created和beforeMount之间:首先会判断对象是否有el选项。如果有的话就继续向下编译,如果没有el选项,则停止编译,也就意味着停止了生命周期,直到在该vue实例上调用vm.$mount(el)。再次判断template参数选项的有无(因为vue需要通过el找到对应的outer template):
(1)如果vue实例对象中有template参数选项,则将其作为模板编译成render函数。
(2)如果没有template选项,则将外部HTML作为模板编译。
(3)可以看到template中的模板优先级要高于outer HTML的优先级。
如果没有template,则通过render传人的createElement编译
5. beforeMount:完成了 el 和 data 初始化 。
坑:如果直接使用{{msg}} 在生命周期beforeMount期间,此刻的msg数据尚未编译至{{msg}}中,用户能看到一瞬间的{{msg}} v-cloak可解决
6. beforeMount和mounted之间:给vue实例对象添加$el成员,并且替换掉挂在的DOM元素
7. mounted :完成挂载
案例: 在这发起后端请求,拿回数据,配合路由钩子做一些事情
8. beforeUpdate:可以监听到data的变化但是view层没有被重新渲染,view层的数据没有变化
9. beforeUpdate和update之间:当vue发现data中的数据发生了改变,会触发对应组件的重新渲染(重新渲染虚拟 dom,并通过 diff 算法对比 vnode 节点差异更新真实 dom (virtual DOM re-render and patch)),先后调用10. beforeUpdate和updated钩子函数(beforeUpdate:可以监听到data的变化但是view层没有被重新渲染,view层的数据没有变化,updated: view层才被重新渲染,数据更新。此处可回顾下react对更新函数。
11. updated:候 view层才被重新渲染,数据更新
12. beforeDestroy 组件销毁之前
案例:你确认删除XX吗?第二个:比如走马灯文字,路由跳转之后,因为组件已经销毁了,但是setInterval还没有销毁,还在继续后台调用,控制台会不断报错,如果运算量大的话,无法及时清除,会导致严重的页面卡顿。解决办法:在组件生命周期beforeDestroy停止setInterval
13. destroyed :当前组件已被删除,清空相关内容 。实例销毁后虽然 dom 和属性方法都还存在,但改变他们都将不再生效!
### 注意
> 1. vue实例中没有el时钩子,仅仅执行到了created ;有el时将可以按顺序执行beforeCreate created beforeMount mounted几个钩子,没有el选项,则停止编译,也意味着暂时停止了生命周期,直到vm.$mount(el)
> 2. beforeUpdate 和 updated两个钩子会在data数据发生变化时进行调用,也就是说可以监听data里面的所有数据,只有要变化就执行钩子函数,重渲染(调用这两个钩子函数)的前提是被更改的数据已经被写入模板中!!
eg {{number}}在模板中显示,当只在js中对数据进行修改而没有显示在页面上时将不会进行重渲染调用对应的钩子函数
1. 对比watch:针对某一个数据进行监听实时的;
2. 对比computed:当依赖项不变化时不会进行重新的执行,只有变化时才会再次执行
> 3. 在各个钩子里面引用的this指向 vm 实例,即使在没有mounted挂载在具体元素上时mounted之前的钩子中打印this仍然有$el属性,而在其后包括mounted钩子里面单独打印this.$el时是未定义的,但是断点调试是符合的(此处有点不理解,希望有大神可以讨论下)
分别在不同的钩子函数里面打印data里面的变量和method里面的方法;
一定注意 var _self = this ;的操作
console.log('mounted-'+typeof _self.showTopTip);
console.log('mounted-'+typeof _self.showTip)
beforeCreate-undefined
beforeCreate-undefined
created-boolean
created-function
beforeMount-boolean
beforeMount-function
mounted-boolean
mounted-function
参考学习连接 :
https://www.cnblogs.com/penghuwan/p/7192203.html
http://www.zhi-jie.net/vue2-study-mount/
https://www.zhoulujun.cn/html/webfront/ECMAScript/vue/8125.html
vue 生命周期钩子的理解 watch computed的更多相关文章
- Vue生命周期 钩子函数和组件传值
Vue生命周期 钩子函数 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等. 同时在这个过程中也会运行一 ...
- Vue 2.0 生命周期-钩子函数理解
Vue 2.0 + 生命周期钩子在项目过程中经常用到,所以闲下来整理了下,直接复制下面的实例运行: <!DOCTYPE html> <html lang="en" ...
- 对vue生命周期/钩子函数的理解
对于实现页面逻辑交互等效果,我们必须知晓vue的生命周期,才能愉快的玩耍,知道我们写的东西应该挂载到哪里,vue官方给出的api讲解的那叫一个简单啊,如下: 所有的生命周期钩子自动绑定this上下文到 ...
- vue生命周期钩子
转载自:https://segmentfault.com/a/1190000008010666?utm_source=tag-newest https://segmentfault.com/a/119 ...
- vue生命周期 钩子函数
首先,1.x和2.x的生命周期钩子对比: 钩子函数的树状图,红色的是我们可以利用的函数,绿色的是函数解析,蓝色的是函数执行时机 <!DOCTYPE html> <html> & ...
- vue 生命周期钩子
每个vue实例被创建时都会经历一系列初始化的过程,像是一个生命从无到有的过程,所以叫生命周期,而这个过程都有对应的不同阶段,也就对应了生命周期不同的钩子函数,这些生命周期函数,作为vue实例的属性使用 ...
- vue 生命周期钩子 过滤器 计算属性
每一个Vue实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测.编译模板.挂载实例到DOM,然后在数据变化时更新DOM,在这个过程中,实例也会调用一些生命周期钩子,这就给我们提供了 ...
- Vue生命周期钩子---3
vue生命周期流程图:4张图 : 生命周期的解析和应用: Vue 实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom→渲染.更新→渲染.卸载等一系列过程,我们称这是 Vue ...
- Vue生命周期钩子---2
vue生命周期简介 咱们从上图可以很明显的看出现在vue2.0都包括了哪些生命周期的函数了. 生命周期探究 对于执行顺序和什么时候执行,看上面两个图基本有个了解了.下面我们将结合代码去看看钩子函数的执 ...
随机推荐
- Unity3D加密保护案例分享(一)
Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎.通过u ...
- Java通过POI生成Excel
import java.io.FileOutputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; impo ...
- Python 命名笔记
类名开头大写,驼峰命名 函数名,变量名都小写, 全局常量 如COUNT, 使用全部大写 https://www.cnblogs.com/lytwajue/p/7324724.html 这个是全局变量关 ...
- bat/cmd将命令执行的结果赋值给变量
比如我想把git代码的commitid获取以后加到文件夹上来标记文件夹中的包是哪个git 节点构建得到的. git 命令是git rev-parse --short HEAD 再linux系统下,只需 ...
- 一个简单的sel server 函数的自定义
创建自定义函数:use 数据库名gocreate function 函数名(@pno int)returns intasbegin declare @a int if not exists(se ...
- 第三章Div水平居中
1.div居中 text-align:center可以让元素里面的文字内容居中,但并不能让div居中.要让div水平居中必须设置div宽度,外边距设置为margin:0 auto <%@ Pag ...
- Locust性能测试
https://www.cnblogs.com/yoyoketang/p/9638151.html https://www.cnblogs.com/yoyoketang/p/9642242.html ...
- selenium自定义find_element
智能轮询元素是否显示: def isDisplayTimeOut(self,element,timeSes): """ 在指定时间内,轮询元素是否显示 :param el ...
- php实现记住密码下次自动登陆
这篇博客里面还写到 实现“记住我的登录状态”的功能方法,简言之,就是对首先对session进行用户信息赋值,检测session,失效后,利用cookie对其赋值: 在实现过程中,根据网上一些代码贴,整 ...
- rsync+inotify磁盘数据实时同步
一.rsync+inotify主服务器部署 1.1安装rsync [root@nginx ~]# cd /usr/src/ [root@nginx src]# tar zxvf rsync-3.0.9 ...