Vue知识点

1. Vue的生命周期理解

Vue的生命周期一共分为8个阶段,分别为创建前/后,载入前/后,更新前/后,销毁前/后

  1. 创建前后:在beforeCreate阶段,vue实例的挂载元素$el和数据对象data都为underfined,还在初始化。在created阶段,vue实例对象data创建完成,$el还没有完成。
  2. 载入前后:在beforeMount阶段,vue实例的$el也初始化完成,但是挂载之前为虚拟的DOM节点,data.message还未替换。在mounted阶段,vue实例挂载完成,data也成功渲染。
  3. 更新前后:当data变化时,会触发beforeUpdateupdated方法。
  4. 销毁前后:在执行destory方法以后,对data的变化不在触发周期函数,说明此vue实例已经解除了事件监听和dom的绑定,但是dom结构依然存在。
    简单的说:Vue实例从创建到销毁的过程,就是生命周期。也就是从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,我们称这是 Vue 的生命周期。
2. 父子组件、非父子组件传参

父组件向子组件传参通过绑定元素属性进行传递。

// 父组件
<template>
	<div>
		<h1 v-bind:title="msg"></h1>
	</div>
</template>
<script>
exprot default {
	data(){
		return{
			msg: "hello"
		}
	}
}
</script>

// 子组件
<template>
	<div>
		<p>{{ title }}</p>
	</div>
</template>
<script>
exprot default {
	props: ['title']
}
</script>

子组件向父组件传递参数(通过事件)

// 父组件
<template>
	<div>
		<child @title="receive">{{ msg }}</child>
	</div>
</template>
<script>
exprot default {
	data(){
		return{
			msg: "hello"
		}
	},
	methods:{
		receive(title){
			this.msg = title
		}
	}
}
</script>

// 子组件
<template>
	<div>
		<h1></h1>
	</div>
</template>
<script>
exprot default {
	mounted(){
		this.$emit('title', 'hello')
	}
}
</script>

非父子组件传参,通过中央事件总线传递,复杂的可以使用vuex

var bus = new Vue()

Vue.component('Another', {
	template: '
This is Another Content
'
, methods: { emit() { bus.$emit('anotherclick', 'hello') } } }) Vue.component('App', { template: '
This is App Content {{ info }}
'
, created() { bus.$on('anotherclick', (data) => { this.info = data; } )}, data: () => {return {info: ''}} })
3. vue双向数据绑定的原理

vue是采用数据劫持结合发布者-订阅者的方法,当你把一个普通的对象传递给vue实例的data选项,vue将遍历此对象上所有的属性,并使用Object.definePeoperty把这些属性全部转化为getter/setter。这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。每个组件实例都有相应的 watcher 实例对象,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher 重新计算,从而致使它关联的组件得以更新。
具体步骤:
第一步:需要observe的数据对象进行递归遍历,包括子属性对象的属性,都加上 setter和getter
这样的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据变化
第二步:compile解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图
第三步:Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是:
1、在自身实例化时往属性订阅器(dep)里面添加自己
2、自身必须有一个update()方法
3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调,则功成身退。
第四步:MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者,通过Observer来监听自己的model数据变化,通过Compile来解析编译模板指令,最终利用Watcher搭起Observer和Compile之间的通信桥梁,达到数据变化 -> 视图更新;视图交互变化(input) -> 数据model变更的双向绑定效果。

4.封装 vue 组件的过程

首先,组件可以提升整个项目的开发效率。能够把页面抽象成多个相对独立的模块,解决了我们传统项目开发:效率低、难维护、复用性等问题。
然后,使用Vue.extend方法创建一个组件,然后使用Vue.component方法注册组件。子组件需要数据,可以在props中接受定义。而子组件修改好数据后,想把数据传递给父组件。可以采用emit方法。

5.你对Vue.js的template编译的理解?

简而言之,就是先转化成AST树,再得到的render函数返回VNode(Vue的虚拟DOM节点)
详情步骤:
首先,通过compile编译器把template编译成AST语法树(abstract syntax tree 即 源代码的抽象语法结构的树状表现形式),compile是createCompiler的返回值,createCompiler是用以创建编译器的。另外compile还负责合并option。
然后,AST会经过generate(将AST语法树转化成render funtion字符串的过程)得到render函数,render的返回值是VNode,VNode是Vue的虚拟DOM节点,里面有(标签名、子节点、文本等等)。

6.完善的自定义组件

第一点、可以通用
第二点、代码尽量简洁
第三点、容易修改
第四点、功能要多一点

7.vuex几种属性的介绍

State:
vuex是管理共享数据的仓库,仓库里有很多数据。其中state就是数据的存放地,与组件中的data函数里面的数据一致。
state里面的数据是响应式的,Vue组件从state中读取数据,若是state中的数据发生变化,依赖这个数据的组件也会更新。
它一般是通过mapStates把全局的state个getters映射到当前组件的computed计算属性中。
Getter:
getters可以对state里面的数据进行计算操作,它就是state的计算属性。
虽然组件内也可以做计算属性,但是getters可以在多个组件之间复用,如果一个状态只在一个组件内使用,可以不用使用getters。
Mutation:
更改state中的状态的唯一方法就是提交mutation。Vuex中的mutation非常类似于一个事件:每个mutation都有一个字符串事件类型和一个回调函数。这个回调函数就是我们实际对状态就行更改的地方,它接收的第一个参数就是state。你不是直接调用mutation,要唤醒一个mutation handler 你需要以相应的type调用store.commit方法

mutations:{
	increment(state){
		state.count++
	}
}

state.commit('increment')

记住: mutation必须是同步函数
Action:
Action类似于Mutation,不同的是:
action提交的是mutation,而不是直接改变state状态。
action里面可以包含任意的异步操作。

你可能感兴趣的:(Vue)