Vue(二)生命周期、vue组件的定义和注册、父子组件传值

Vue(二)生命周期、vue组件的定义和注册、父子组件传值

  • 前言
  • 一、Vue生命周期钩子
    • 1.vue数据是怎么驱动视图的
    • 2.误区
    • 3.vue生命周期钩子
    • 4.简化版生命周期
    • 5.VUE完整示例new vue()参数详解
  • 二、Vue组件的定义、注册方式和模板使用
    • 1.组件的定义
    • 2.组件的分类
    • 3.引用模板
  • 三、组件间数据的通信
    • 1.父子组件
    • 2.组件间数据通信
    • 3.单向数据流
  • 四、过滤器
    • 1.过滤器分为两种
    • 2.过滤器使用地方两个位置
  • 五、使用axios进行ajax操作
    • 1.Axios简介
    • 2.Axios特点
    • 3.Axios基本用法


前言

  1. 理解Vue生命周期
  2. 掌握Vue组件的定义和注册方式
  3. 掌握父子和子父组件传值
  4. 掌握使用axios进行ajax操作

一、Vue生命周期钩子

1.vue数据是怎么驱动视图的

一堆数据放在那里是不会有任何作用的,它必须通过我们的View Model(视图模型)才能操控视图。
Vue(二)生命周期、vue组件的定义和注册、父子组件传值_第1张图片
图中的model其实就是数据,一般我们写成js对象的格式;
中间的这个所谓View Model,就是

var vm = new Vue({ 
	el: '#app', //数据监听
	data: { 
	message: 'Hello Vue!' //数据绑定
	} 
})

我们把数据放到了vm里,然后把各种directive(命令)放到视图里,这样我们就可以以vm为媒介,通过改变数据来改变视图。

2.误区

vm实际上是Vue这个类的一个实例,非常容易混淆的是,你会很容易的以为

vm.el == '#app'; 
vm.data== { message: 'Hello Vue!' };
vm.data.message =='Hello Vue!';

实际上这都是错误的,以上虽然是错误的写法,有时候我们还是希望获得这些属性的,通过vm你需要这样写:

vm.$el === document.getElementById('app') //结果为true 
vm.$data.message ==='Hello Vue!' //结果为true

这个$符代表的就是vm的真实属性了。

代码示例:

DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Titletitle>
        <script src="js/v2.6.10/vue.js">script>
    head>
    <body>
        <div id="app">

        div>
    body>
    <script>
        let obj ={
            message: "hello vue"
        } ;
        let vm = new Vue({
            el: "#app",
            data: obj
        });
        //vm是vue是实例对象
        console.log(vm.el)
        console.log(vm.el===document.getElementById("app"));        //false
        console.log(vm.data===obj); //false
        console.log(vm.data);  //undefined
        //console.log(vm.data.message==="hello vue"); //报错

        //要想获取 vue实例对象获取传入的对象数据 ,需要传入的属性名前加一个$符号,例如vm.$el  vm.$data  vm.$methods
        console.log(vm.$el==="#app");        //false
        console.log(vm.$el===document.getElementById("app"));  //true
        console.log(vm.$el);    //div的dom对象
        console.log(vm.$data===obj); //true
        console.log(vm.$data);  //创建vue对象时,传入的data对应的对象
        console.log(vm.$data.message==="hello vue"); //true
    script>
html>

3.vue生命周期钩子

每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。
比如 created 钩子可以用来在一个实例被创建之后执行代码:

new Vue({ 
	data: { a: 1 },
	created: function () { 
	// `this` 指向 vm 实例 
	console.log('a is: ' + this.a) 
	} 
})

vue实例从创建到销毁的过程,称为生命周期,共有八个阶段
Vue(二)生命周期、vue组件的定义和注册、父子组件传值_第2张图片

DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>title>
		<script type="text/javascript" src="js/v2.6.10/vue.js" >script>
	head>
	<body>
		<div id="app">
			<input type="text" v-model="message" />
		div>
		<div id="app1">
			<input type="text" v-model="message" />
		div>
		<script type="text/javascript">
			var app = new Vue({
				el:"#app",
				data:{
					message:"hello world"
				},
				beforeCreate:function(){
					//this指向创建的实例,还不能访问data/computed/methods
					console.log("Vue对象创建前状态======");
					console.log("el=" + this.$el);
					console.log("data=" + this.$data);
					console.log("message=" + this.message);
				},
				created:function(){
					// 可以访问data、methods,但是未挂载到dom,并且还不能访问$el属性,$ref属性内容此时为空数组
					console.log("Vue对象创建完毕状态======");
					console.log("el=" + this.$el);
					console.log("data=" + this.$data);
					console.log("message=" + this.message);
					this.message="hello 不    world";
				},
				beforeMount:function(){
					//仍为原始el值(app,未挂载前的el修改没有影响后来)
					console.log("Vue对象挂载前状态======");
					console.log("el=" + this.$el);
					console.log("data=" + this.$data);
					console.log("message=" + this.message);
					//this.$el=document.getElementById("app1");//此处挂载后不会再次挂载
					console.log(this.$el);
				},
				mounted:function(){
					//挂载后进行修改
					console.log("Vue对象挂载之后状态======");
					console.log("el=" + this.$el);
					console.log("data=" + this.$data);
					console.log("message=" + this.message);
					this.$el=document.getElementById("app1");
					console.log(this.$el);
				},
				beforeUpdate:function(){
					console.log("Vue对象更新前状态======");
					console.log("el=" +this.$el);
					console.log("data=" + this.$data);
					console.log("message=" + this.message);
					console.log(this.$el);
				},
				updated:function(){
					console.log("Vue对象更新完成状态======");
					console.log("el=" +this.$el);
					console.log("data=" + this.$data);
					console.log("message=" + this.message);
					console.log(this.$el);
				},
				beforeDestroy:function(){
					console.log("Vue对象销毁前状态======");
					console.log("el=" + this.$el);
					console.log("data=" + this.$data);
					console.log("message=" + this.message);
					console.log(this.$el);

				},destroyed:function(){
					console.log("Vue对象销毁完成状态======");
					console.log("el=" + this.$el);
					console.log("data=" + this.$data);
					console.log("message=" + this.message);
				}
			})
			app.$destroy();
		script>
	body>
html>

4.简化版生命周期

Vue(二)生命周期、vue组件的定义和注册、父子组件传值_第3张图片

5.VUE完整示例new vue()参数详解

DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>title>
		<script src="js/v2.6.10/vue.js" type="text/javascript">script>
	head>
	<body>
		<div id="app"> div>
	body>
	<script type="text/javascript">
		var vm = new Vue({
					el: "#app", 
					// 挂载点,可认为是element的简写,创建一个vue实例得知道是在哪一块 元素上创建Vue实例,对哪一块视图进行操作 
					data: {}, 
					// 又称内部数据,该属性值可以是对象,也可以是函数,但优先推荐使用函数,对象里的函数又称方法。 
					// 并且若是组件中的data则必须使用函数。数据成员,在.vue组件中data是一个函数,要写成data () {}这种方式 
					props: {} ,
					// 又称外部数据,一般用于组件中接受外来传递的数据,在组件使用时,通过标签全局属性的方式进行传参 
					computed: { 
						// 计算属性 
						// 计算属性名: 
						function(){..} },
						watch: { 
							// 监视属性 
						},
						methods: { 
							// 成员方法 
							// 方法名: 
							function(){..} 
							},template: "" ,
						// 模板 
						beforeCreate: function() { 
							// 生命构造函数,还有其他7个... 
							},compontents: { },
							// 其他option.... 
				}) 
	script>
html>

1.1 el:"#id" , //DOM成员
提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标。
1.2 template:" ", //DOM成员
一个字符串模板作为 Vue 实例的标识使用。模板将会替换挂载的元素。挂载元素的内容都将被忽略,除非模板的内容有分发 slot
1.3 render: (h)=>{h(App)} , //DOM成员
字符串模板的代替方案,允许你发挥 JavaScript 最大的编程能力。
1.4 data //数据成员
data():{ return{ } } ,
Vue实例的数据对象。Vue 将会递归将 data 的属性转换为 getter/setter,从而让 data 的属性能够响应数据变化
1.5 methods //方法成员
methods:{ func(){ } }
methods将被混入到 Vue 实例中,可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用方法中的 this自动绑定为 Vue 实例
1.6 watch //监听属性
watch:{ key:value $route:function (newValue, oldValue) { //监控路由 } }
整个为一个对象,键是需要观察的表达式,值是对应回调函数
1.7 computed //计算属性
computed:{ getTotalCount(){ const totalCount=0; return totalCount; } } ,
vue的计算属性,将被混入到 Vue 实例中。所有 getter 和 setter 的 this 上下文自动地绑定为Vue 实例
1.8 props //父组件传给子组件
props:['counts','ids'] ,
用于父子组件的eventbus传值,是数组或对象,props的成员是子组件接收的来自父组件的
数据
1.9 propsData //数据成员
创建实例时传递 props。主要作用是方便测试
1.10 filters //资源
filters('filterName',(input,function(){ return newvalue }))
包含 Vue 实例可用过滤器的哈希表。
1.11 directives //资源
包含 Vue 实例可用指令的哈希表。
1.12 components //组件
(即该组件的子实例)这里是包含 Vue 实例可用组件的哈希表。
1.13 name //杂项
允许组件模板递归地调用自身。注意,组件在全局用 Vue.component() 注册时,全局 ID 自动作为组件的name。
1.14 parent //杂项
指定已创建的实例之父实例,在两者之间建立父子关系。子实例可以用 this.$parent 访问父实例,子实例被推入父实例的 $children 数组中。
1.15 mixins //杂项
mixins 选项接受一个混合对象的数组。Mixin钩子按照传入顺序依次调用,并在调用组件自身的钩子之前被调用。
1.16 extends //杂项
允许声明扩展另一个组件。这主要是为了便于扩展单文件组件。这和 mixins 类似,区别在于,组件自身的选项会比要扩展的源组件具有更高的优先级。
1.17 delimiters //杂项
改变纯文本插入分隔符。
1.18 functional //杂项
使组件无状态(没有 data )和无实例(没有 this 上下文)。他们用一个简单的 render 函数返回虚拟节点使他们更容易渲染。

二、Vue组件的定义、注册方式和模板使用

1.组件的定义

vue.js中创建组件有三个步骤:定义组件,注册组件以及使用组件
定义组件:

  1. 方式1:先创建一组件构造器,然后由组件构造器创建组件。如:var myCom = Vue.extend({})
  2. 方式2:使用Vue.component()直接创建组件。

定义组件名的方式有两种:

  1. 使用 kebab-case:使用 kebab-case (短横线分隔命名) 定义一个组件(kebab发音/kI’ba:b/)
  2. 使用 PascalCase:(驼峰式命名) 定义一个组件

当使用 kebab-case (短横线分隔命名) 定义一个组件时,你也必须在引用这个自定义元素时使用 kebab-case,例如
当使用 PascalCase (驼峰式命名) 定义一个组件时,你在引用这个自定义元素时两种命名法都可以使用。也就是说 都是可接受的。

2.组件的分类

全局组件||局部组件
通过选项components定义,但只能在当前Vue实例中使用

3.引用模板

将组件内容放到