vue生命周期及使用 && 单文件组件下的生命周期
生命周期钩子
这篇文章主要记录与生命周期相关的问题。 之前,我们讲到过生命周期,如下所示:

根据图示我们很容易理解vue的生命周期:
- js执行到new Vue() 后,即进入vue的beforeCreate状态。
- 接着观察data下的数据,紧接着create。
- create之后,就会检测是否含有el属性,如果有,就直接检测是否含有模板属性; 如果没有,就当vm.$mount()调用之后再检测,vm.$mount()的作用就是将Vue实例挂载到某一个DOM元素上。
- 如果有template,那么我们就编译模板到render函数中,作用就是为了将模板中的元素渲染进去;如果没有template,我们就把el所在的HTML作为模板编译。
- 这样就进入了 beforeMount 状态。
- 在mounted 之前,就会创建一个 vm.$el 用来替代 实例中的el, ok! 这样就可以mouted了。
- 接着,如果data发生了变化,就会有beforeUpdata,在替换了之后,就是updated的状态啦! 这是一个循环的过程,因为updated是可以一直更新的嘛!
- 最后如果我们调用了 vm.$destroy() 就会进入 beforeDestory, 然后解除 watchers、child components 以及 listeners,最后就destroyed了, 那么他的生命也就结束了。
总结来说: 是 new Vue() 开启了vue实例的生命周期, vm.$destroy() 结束了vue实例的生命周期。
当然了,对于不同的生命周期,都对应着相应的钩子函数,且一共有8个钩子函数,如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue</title>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="example">
<p>朱振伟</p>
{{message}}
</div>
<script>
var example=new Vue({
el:'#example',
beforeCreate () {
alert("beforeCreate");
},
created () {
alert("created");
},
beforeMount () {
alert("beforeMount");
},
mounted () {
alert("mounted");
},
beforeUpdate () {
alert("beforeUpdate");
},
updated () {
alert("updated");
},
beforeDestroy () {
alert("beforeDestroy");
},
destroyed () {
alert("destroyed");
}
});
</script>
</body>
</html>
当我们运行之后,会发现,beforeCreate、created、beforeMount、mounted以此触发,如果我们在控制台输入 example.message = "JohnZhu"; 那么就又会依次触发 beforeUpdate 和 updated 对应的钩子函数, 如果我们在控制台输入 example.$destroy() 那么就会依次触发 beforeDestroy 和 destroyed 对应的钩子函数。
生命周期大概就是这样了。
补充:
除了在vue官网(上图)中提到的生命周期钩子之后,vue2中还添加了 activated 和 deactivated 钩子函数,当渲染的组件启用了 keep-alive 时,那么进入一个路由指定的组件时,就会调用 activated 钩子函数,如果一个组件没有设定 keep-alive ,那么就不会调用 activated 钩子函数, 而是调用 deactivated 钩子函数。
比如:
<div id="app">
<keep-alive>
<router-view></router-view>
</keep-alive>
</div>
这里的 router-view 是所有的页面都会在这里渲染的,而 keep-alive 又包裹在这之外,所以说这个app中的所有路由在切换时都会调用 activated 钩子函数。
单文件组件下的生命周期
先看下面这个例子:
<template>
<div class="personal-wrap">
<Personal></Personal>
<button v-on:click="exit" class="btn" v-if="loginBool">退出登录</button>
<button v-on:click="login" class="btn btn-login" v-else>现在登录</button>
<FooterMenu></FooterMenu>
</div>
</template> <script>
import FooterMenu from '@components/menu';
import Personal from '@components/personal';
import {mapState,mapMutations, mapActions} from 'vuex'
export default {
components: {
FooterMenu,
Personal
}, data () {
return {
loginBool: Boolean(sessionStorage.getItem("loginBool"))
}
}, methods: {
...mapMutations([
'UPDATE_PICTURES'
]),
...mapActions([
'loginWx'
]), exit: function () {
var result = confirm("确认注销登录?");
if (result == true) {
window.location.href = window.location.href.replace(window.location.search, "");
}
},
login: function () {
this.loginWx();
}
},
beforeCreate () {
document.title = "替换之后";
},
created () {
this.UPDATE_PICTURES();
alert( 'created' + JSON.stringify(document.querySelector('.btn')));
},
beforeMount () {
alert( 'beforeMounte' + JSON.stringify(document.querySelector('.btn')));
},
mounted () {
alert( 'mounted' + JSON.stringify(document.querySelector('.btn')));
} }
</script>
这是一个单文件组件,因为只是为了说明生命周期的使用,删去了一部分。
- beforeCreate 是在创建data之前的钩子,即这时刚刚创建完Vue实例,然后el,data这些还都没有,但是因为这是单文件组件,所以,document.title是可以访问到的,这点值得注意。并且由于这时候是没有data和method可以使用的,所以不能使用method下的方法。
- 接着在created之后,el仍然是没有挂载的,但是data已经初始化完成了,并且一些方法(methods)也已经可以使用了,没有挂载,所以访问不到单组件中的html元素。
- boforeMount 这时仍然没有挂载,只是开始调用了render函数,同样,没有挂载,也是访问不到vue单组件中的html元素的。
在mounted之后, 这时已经将vue和组件联系起来,挂载完成,所以就可以得到其中的html元素了。
常用的钩子
可以看出,我们可以在beforeCreate中使用一些操作document的方法。 在created中可以使用大部分的方法。 在 mounted中可以使用与挂载元素相关的一些方法,如操作dom。
补充: 当然,因为localStorage这种东西都是一直存在的,所以在任何生命周期下都是可以正常访问 localStorage 和 sessionStorage的。
vue生命周期及使用 && 单文件组件下的生命周期的更多相关文章
- 如何在vue && webpack 项目中的单文件组件中引入css
引入方式很简单,就是在script下使用require()即可. 因为import 是import...from 的形式,所以是不需要的. <script> import {mapStat ...
- Vue知识整理16:单文件组件
过程较为复杂,这里直接写出视频地址,可以直接查看 https://learning.dcloud.io/#/?vid=14
- vue 单文件组件最佳实践
vue 单文件组件最佳实践 生命周期 template <template> <section> <h1>vue single file components te ...
- webpack打包vue单文件组件
一.vue单文件组件 ①文件扩展名为 .vue 的 就是single-file components(单文件组件) ②参考文档:单文件组件 二.webpack加载第三方包 ①项目中,如果需要用到一些第 ...
- vue第七单元(vue的单文件组件形式-单文件组件的加载原理-vue-cli构建的开发环境以及生命周期)
第七单元(vue的单文件组件形式-单文件组件的加载原理-vue-cli构建的开发环境以及生命周期) #课程目标 掌握安装 vue-cli 命令行工具的方法,掌握使用命令行在本地搭建开发环境,使用命令行 ...
- Vue单文件组件基础模板
背景 相信大家在使用Vue开发项目时,基本都是以单文件组件的形式开发组件的,这种方式好处多多: 1.代码集中,便于开发.管理和维护 2.可复用性高,直接将vue文件拷贝到新项目中 我暂时就想到这两点, ...
- Vue系列(三):组件及数据传递、路由、单文件组件、vue-cli脚手架
上一篇:Vue系列(二):发送Ajax.JSONP请求.Vue生命周期及实例属性和方法.自定义指令与过渡 一. 组件component 1. 什么是组件? 组件(Component)是 Vue.js ...
- 基于VSCode的vue单文件组件模板设置---一次设置,可爽终生
第一步: 第二步: 第三步: 打开vue.json文件后,如果是初次设置,应该如下图所示,绿色注释部分不用管,注意那两个白色大括号 第四步:在大括号内全部粘贴如下代码,保存即可完成vue模板的设置 & ...
- webpack入坑之旅(五)加载vue单文件组件
这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...
随机推荐
- 通过fork函数创建进程的跟踪,分析linux内核进程的创建
作者:吴乐 山东师范大学 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程 1.打开gdb, ...
- Slf4j MDC 使用和 基于 Logback 的实现分析
前言 如今,在 Java 开发中,日志的打印输出是必不可少的, 关于 有了日志之后,我们就可以追踪各种线上问题.但是,在分布式系统中,各种无关日志穿行其中,导致我们可能无法直接定位整个操作流程.因此 ...
- Log--事务日志
由于日志是顺序写入,而修改数据分散在数据库各个页面,属于随机写入,而磁盘顺序写入速度远高于随机写入,因此主流数据库都采用预写日志的方式来确保数据完整性 1.日志记录的是数据的变化而不是引发数据的操作2 ...
- Go语言最佳实践——异常和错误
Go语言将错误和异常两者区分对待. 1.Go语言中处理错误的惯用法是将错误以函数或者方法最后一个返回值的形式将其返回,并总是在调用它的地方检查返回的错误值. 2.对于“不可能发生的事情”称为异常,可使 ...
- Eclipse平台下配置Go语言开发环境(Win7)
<Go语言编程>中写到:“从功能和易用性等方面考虑, Eclipse+GoEclipse.LiteIDE这两个环境在所有IDE里面是表现最好的”,所以笔者打算采用Eclipse+GoEcl ...
- 百度地图离线API及地图数据下载工具
全面介绍,请看下列介绍地址,改写目前最新版本的百度V2.0地图,已全面实现离线操作,能到达在线功能的95%以上 http://api.jjszd.com:8081/apituiguang/gistg. ...
- JMeter的使用——ApacheJMeterTemporaryRootCA.crt的用法
在使用JMeter的时候,启动HTTP代理服务器弹出的那个提示框一直不知道是什么意思,刚刚弄明白了,在JMeter2.1之后,通过JMeter的代理服务器来访问https安全连接的网页的时候,浏览器会 ...
- Ubuntu 14.10,准备C/C++的编译环境
Ubuntu缺省情况下,并没有提供C/C++的编译环境,因此还需要手动安装. 如果单独安装gcc以及g++比较麻烦,幸运的是,为了能够编译Ubuntu的内核,Ubuntu提供了一个build-esse ...
- mysql 行转列,对列的分组求和,对行求和
CREATE TABLE students( id INT PRIMARY KEY, NAME VARCHAR(11)); CREATE TABLE courses( id INT PRIMARY K ...
- 跳转iPhone设置页面,绕过审核
1.问题描述 跳转iPhone设置页面之前都是通过 App-Prefs:root=WIFI 来跳转,但是2018年6月废弃了这个函数,被认为是私有函数,审核会被拒绝. 有心人采用了字符串转码的方式来规 ...