vue生命周期实战(二)—— 实例挂载

此学习教程是对官方教程的解析,

本章节主要涉及到的官方教程地址:

生命周期图示 — Vue.js

上一章 :vue生命周期实战(一)—— 实例创建

本章节介绍实例创建阶段的生命周期钩子:beforeMount和mounted

beforeMount、mounted和beforeCreate、created的区别

beforeMount、mounted和beforeCreate、created主要区别在于是否能访问编译好的render函数

生命周期钩子区别
beforeCreate、created不能访问this.$options.render(编译好的render函数)
beforeMount、mounted能访问this.$options.render(编译好的render函数)

beforeMount和mounted的区别

mounted和它之前的生命周期钩子主要区别在于虚拟dom以及非异步子组件是否渲染并挂载

生命周期钩子区别
beforeCreate、created、beforeMount虚拟dom以及非异步子组件都未初次渲染,也未挂载
正因为根本就未渲染,所以在这些钩子中 非异步 更改响应式属性会影响初次渲染结果,注意,是初次渲染, 并不是重新渲染,所以是不会触发beforeUpdate和updated钩子的
mounted虚拟dom以及非异步子组件都已经初次渲染并挂载
因为已初次渲染, 所以在这个钩子中更改响应式属性,将重新渲染,会触发beforeUpdate和updated钩子

beforeMount和mounted的具体区别如下:

生命周期钩子可获取的对象常见应用场景
beforeMountthis.$root、this.$parent、this.$options
data、computed、watch、methods中的数据和方法
新增: this.$options.render(编译好的render函数)、this.$el(未渲染的dom元素
在渲染前对编译好的render函数进行更改,以改变渲染结果
mountedthis.$root、this.$parent、this.$options
data、computed、watch、methods中的数据和方法
this.$options.render(编译好的render函数)、this.$el(已渲染的dom元素)、
新增: this.$refs(DOM 元素或子组件实例的引用对象)、this.$childrens(非异步子组件数组)
对渲染后的DOM进行操作

beforeMount应用

假设有个权限判断,针对页面上的test组件,如果有权限就显示,没权限则显示noRight组件,用于提示没有权限。

即若没有权限,将以下html

	  <test></test>
      <test></test>
      <test></test>

转换为

	  <noRight></noRight>
      <noRight></noRight>
      <noRight></noRight>

页面上test组件很多,如果要实现上述请求,只能用v-if组件不断地做判断:

	  <template v-if="hasRight"><test><test></template>
      <template v-if="!hasRight"><noRight></noRight></template>
      
      <template v-if="hasRight"><test><test></template>
      <template v-if="!hasRight"><noRight></noRight></template>
      
      <template v-if="hasRight"><test><test></template>
      <template v-if="!hasRight"><noRight></noRight></template>

每个test组件出现的地方都必须做判断。这种实现并不优雅,而且如果页面上test组件很多则很可能漏掉其中一两个。怎么解决呢?幸好在渲染前,还可以在beforeAmount钩子中做些处理:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title></title>
  <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
</head>
<body>
  <div id="app">
      <test></test>
      <test></test>
      <test></test>
  </div>


<script>
Vue.component('test', {
  template: '\
     <div>我是测试的子组件</div>\
  '
})
Vue.component('noRight', {
  template: '\
     <div>您无权限查看</div>\
  '
})

var vm = new Vue({
	el: '#app',
	data: {
	   hasRight: false
	},
	beforeMount: function() {
		if(!this.hasRight){
			var html = this.$el.outerHTML;
			var html2 = html.replace(new RegExp("<test></test>","gm"),"<noRight></noRight>");
			//将html字符串编译成render函数
			_render = Vue.compile(html2).render;
			//将render选项重新设置为重新编译好的render函数,从而改变渲染结果
			this.$options.render = _render;
		}
    }
})
</script>
</body>
</html>

mounted应用

以上面的例子为基础,将test组件的文字颜色改变下。代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title></title>
  <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script>
</head>
<body>
  <div id="app">
      <test ref="test1"></test>
      <test ref="test2"></test>
      <test ref="test3"></test>
  </div>


<script>
Vue.component('test', {
  template: '\
     <div>我是测试的子组件</div>\
  '
})

var vm = new Vue({
	el: '#app',
	mounted: function() {
		this.$refs.test1.$el.style.color = "red"
		this.$refs.test2.$el.style.color = 'yellow'
		this.$refs.test3.$el.style.color = 'green'
    }
})
</script>
</body>
</html>

this.$refs.test1 指的是ref属性为test1<test ref="test1"></test>子组件;
this.$refs.test1.$el 指的是<test ref="test1"></test>子组件的挂载元素, 因为这时子组件已经渲染并挂载;

本章节教程结束。

全部教程地址:Vue入门实战教程 | 寒于水学习网

vue生命周期实战系列:

vue生命周期实战(一)—— 实例创建

vue生命周期实战(二)——实例挂载

vue生命周期实战(三)—— 实例更新并深刻理解nextTick、watch和生命周期的关系

vue生命周期实战(四)——实例销毁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值