1. Vue有哪些指令?
v-html 将数据解释为html、
v-on 监听DOM事件
v-show、v-for(数据循环)、
v-bind:class(绑定一个属性)、
v-bind:style(绑定一个样式)
v-model(实现双向绑定)
v-if:判断是否满足条件(是否显隐)
<p v-if="seen">现在你看到我了</p>2. 指令参数:
一些指令能够接受一个”参数“,在指令名称之后以冒号表示。
1. v-bind (响应式的更新HTML特性)
<a v-bind:href="url">...</a>
在这里 href 是参数,告知 v-bind 指令将该元素的 href 特性与表达式 url 的值绑定。
2. v-on (监听DOM事件)
<a v-on:click="doSomething">...</a>3. 指令的动态参数(2.6.0新增,js表达式进行动态求值)
<a v-bind:[attributeName]="url"> ... </a>
(用方括号括起来的 JavaScript 表达式作为一个指令的参数)
<a v-on:[eventName]="doSomething"> ... </a>
同样地,当 eventName 的值为 "focus" 时,v-on:[eventName] 将等价于 v-on:focus
4. v-if 和 v-show 有什么区别?
v-show 仅仅控制元素的显示方式,将display属性在block和none之间来回切换
v-if 控制这个DOM节点的存在与否
(当我们需要经常切换某个元素的显示/隐藏时,使用v-show更加节省性能上的开销)
(当只需要一次显示或隐藏时,用v-if更合理)5. 简述Vue的响应式原理
vue主要是通过js的一个属性Object.defineProperty来实现响应式,利用这个属性的getter、setterxuan'ran对数据的访问和秀爱通知变更,每个vue组件都有一个watcher实例,他会在组件渲染的过程中把接触过的数据记录为依赖,之后当依赖项的setter触发时,回通知watcher,使他关联的组件重新渲染。Vue响应式原理中说道:Object.defineProperty是Es5中无法shim的特性,那么这里的shim是什么呢?
shim可以将新的API引入到旧的环境中,而且仅靠就环境中已有的手段实现。文章中说的意思就是,Object.defineProperty这个特性是无法使用低级浏览器中的方法来实现的,所以Vue不支持IE8以及更低版本的浏览器。
有两个不足之处:
- 不能检测到增加或删除的属性。
- 数组方面的变动,如根据索引改变元素,以及直接改变数组长度时的变化,不能被检测到。
- 对于已经创建的实例,Vue 不允许动态添加根级别的响应式属性。但是,可以使用
Vue.set(object, propertyName, value)方法向嵌套对象添加响应式属性。原因差不多,无非就是没有被 getter/setter 。
第一个比较容易理解,为什么数组长度不能被 getter/setter ?
在知乎上找了一个答案:如果你知道数组的长度,理论上是可以预先给所有的索引设置 getter/setter 的。但是一来很多场景下你不知道数组的长度,二来,如果是很大的数组,预先加 getter/setter 性能负担较大。
component render function 组件渲染函数

6. Vue的生命周期?
它可以总共分为8个阶段:
beforeCreate(创建前), created(创建后),
beforeMount(载入前), mounted(载入后),
beforeUpdate(更新前), updated(更新后),
beforeDestroy(销毁前), destroyed(销毁后)
创建前/后: 在beforeCreated阶段,vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。
在created阶段,vue实例的数据对象data有了,$el还没有。
载入前/后:在beforeMount阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,
data.message还未替换。在mounted阶段,vue实例挂载完成,data.message成功渲染。
更新前/后:当data变化时,会触发beforeUpdate和updated方法。
销毁前/后:在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听
以及和dom的绑定,但是dom结构依然存在
生命周期钩子的 this 上下文指向调用它的 Vue 实例。7. vue中Computed 和 watch的使用和区别?
1、计算属性computed适用的情形
我们可能会有这样的需求,一个数据属性在它所依赖的属性发生变化时,也要发生变化,这种情况下,我们
最好使用计算属性。例如在下面这个例子中,如果我们使用监听函数,代码就会变得有点冗余。
2、监听器watch适当的情形
watch函数适用于,当数据发生变化时,执行异步操作或较大开销操作的情况。8. 对vue 路由的理解?
1.router是VueRouter的一个对象,通过Vue.use(VueRouter)和VueRouter构造函数得到一个router的实例对
象,这个对象中是一个全局的对象,他包含了所有的路由包含了许多关键的对象和属性。举例:history对象
$router.push({path:'home'});本质是向history栈中添加一个路由,在我们看来是 切换路由,但本质是在
添加一个history记录方法:$router.replace({path:'home'});//替换路由,没有历史记录
2.route是一个跳转的路由对象,每一个路由都会有一个route对象,是一个局部的对象,可以获取对应的
name,path,params,query等我们可以从vue devtools中看到每个路由对象的不同9. vue双向绑定原理?(vue data 是怎么实现的?)
vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
1.实现一个监听器Observer,用来劫持并监听所有属性,如果有变动的,就通知订阅者。
2.实现一个订阅者Watcher,可以收到属性的变化通知并执行相应的函数,从而更新视图。
3.实现一个解析器Compile,可以扫描和解析每个节点的相关指令,并根据初始化模板数据以及初始化相应的订阅器。
Object.defineProperty() 方法会直接在一个对象上定义或者修改一个属性,实现数据劫持