4.vue文档API(2),简单的生命周期描述

Vue与实例vue:

可以看出,vue框架,有些类似jQuery,对外的接口就是一个Vue对象,然后使用new的,创建一个Vue的实例对象,根据指定的id渲染元素,构建组件。而每个实例vue都被规定了生命周期。(Vue的配置属性,可以看作独立于声明周期,对Vue插件本身的设置)。

生命周期:

vue实例的生命周期有如下几种。

beforeCreate是创建实例之前,created是创建实例完成之后。

创建实例,就是传入对象,然后new Vue({...})。Vue会根据对象内的属性信息,初始化Vue实例,创建对应的信息。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>vueTest</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
	<div class="app" v-bind:src="message">
		<p>{{ message }}</p>
	</div>
	<script type="text/javascript">
		Vue.config.productionTip = false;
		new Vue({
			data: function(argument) {
				return {
					message: 'Hello Vue!'
				}
			},
			beforeCreate: function(){
				console.log('创建之前');
			},
			created: function(){
				console.log('创建');
			},
			beforeMount: function(){
				console.log('挂载之前');
			},
			mounted: function(){
				console.log('挂载');
			},
		});
	</script>
</body>
</html>

可以看到,传入的对象中,初始化了data、beforeCreate、created、beforeMount、mounted五个属性,new的时候,触发了beforeCreate、created两个属性设定的函数。

beforeMount、mounted属于挂载才会触发的函数。这是虽然初始化了,但是由于new的时候,并没有挂载,所以并没有触发。

挂载,就是将vue实例挂载到指定的dom元素,然后进行渲染。通过添加对应el属性实现(el可以添加id、class、标签名,不过都只会挂载到第一个元素上)。将部分代码改成如下:

	<div class="app" v-bind:src="message">
		<p>{{ message }}</p>
	</div>
	<script type="text/javascript">
		Vue.config.productionTip = false;
		new Vue({
			el: '.app',
			data: function(argument) {
				return {
					message: 'Hello Vue!'
				}
			},
			beforeCreate: function(){
				console.log('创建之前');
			},
			created: function(){
				console.log('创建');
			},
			beforeMount: function(){
				console.log('挂载之前');
			},
			mounted: function(){
				console.log('挂载');
			},
		});
	</script>

更新,就是当挂载的dom元素中,有内容发生变化的时候,就会触发的函数。部分代码改成如下:

	<div class="app" v-bind:src="message" v-on:click="click">
		<p>{{ message }} {{count}}</p>
	</div>
	<script type="text/javascript">
		Vue.config.productionTip = false;
		new Vue({
			el: '.app',
			data: function(argument) {
				return {
					message: 'Hello Vue!',
					count: 0,
				}
			},
			methods: {
				click: function(){
					this.count++;
				}
			},
			beforeCreate: function(){
				console.log('创建之前');
			},
			created: function(){
				console.log('创建');
			},
			beforeMount: function(){
				console.log('挂载之前');
			},
			mounted: function(){
				console.log('挂载');
			},
			beforeUpdate: function(){
				console.log('更新之前');
			},
			updated: function(){
				console.log('更新');
			},
		});
	</script>

 

点击文字,更改数据,就会触发相关的更新函数。

组件的销毁,通过$destroy()函数,将组件销毁。

			methods: {
				click: function(){
					this.count++;
					console.log("正在销毁");
					this.$destroy();
				}
			},

点击文本,就可以看到,触发了beforeDestroy、destroyed函数。可以看到数字不再变化,但是多点几下,依旧会显示文字"正在销毁"。

个人认为,销毁的只是,vue实例中,data数据和dom节点中的响应式关系,不是dom节点,也不是实例本身。

只有处于<keep-alive>标签内的实例才会拥有activated、deactivated周期,keep-alive标签可以用来缓存vue组件。这里只做简单的演示,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>vueTest</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
	<div class="app">
		<keep-alive>
			<demo></demo>
		</keep-alive>
	</div>
	<script type="text/javascript">
		Vue.config.productionTip = false;
		var demo = {
			template: `<p v-on:click="click">{{ message }} {{count}}</p>`,
			data: function(argument) {
				return {
					message: 'Hello Vue!',
					count: 0,
				}
			},
			methods: {
				click: function(){
					this.count++;
					console.log("正在销毁");
					this.$destroy();
				}
			},
			beforeCreate: function(){
				console.log('创建之前');
			},
			created: function(){
				console.log('创建');
			},
			beforeMount: function(){
				console.log('挂载之前');
			},
			mounted: function(){
				console.log('挂载');
			},
			beforeUpdate: function(){
				console.log('更新之前');
			},
			updated: function(){
				console.log('更新');
			},
			beforeDestroy: function(){
				console.log('销毁之前');
			},
			destroyed: function(){
				console.log('销毁');
			},
			activated (){
				console.log("激活 activated");
			},
			deactivated (){
				console.log("停用 deactivated");
			},
		}
		new Vue({
			el: '.app',
			components: {
				'demo': demo,
			},
		});
	</script>
</body>
</html>

当父组件被销毁之前,会触发停用deactivated。

当下级组件报出错误的时候,会出现,接收三个参数,err:错误信息, vm:抛出错误的实例, info:不确定,个人认为代表是抛出错误的源头。返回Boolean值,用来确定错误的信息会不会继续向上面的组件传递。代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>vueTest</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
	<div class="app">
		<keep-alive>
			<demo></demo>
		</keep-alive>
	</div>
	<script type="text/javascript">
		Vue.config.productionTip = false;
		var demo = {
			template: `<p v-on:click='throwError'>{{ message }} {{count}}</p>`,
			methods: {
				throwError: function(){
					throw new Error('errorCaptured测试')
				}
			},
			data: function(argument) {
				return {
					message: 'Hello Vue!',
					count: 0,
				}
			},
		}
		new Vue({
			el: '.app',
			components: {
				'demo': demo,
			},
			errorCaptured: function(err, vm, info){
				console.log(err);
				console.log(vm);
				console.log(info);
				return false;
			},
		});
	</script>
</body>
</html>

点击文本就会打印抛出的错误信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值