一、

 

1.v-show和v-if区别的区别:

v-show通过css display控制显示和隐藏,v-if组件真正的渲染和销毁,而不是显示和隐藏,频繁切换状态使用v-show 否则v-if

2.为何v-for要用key

快速查找到节点,减少渲染次数,提升渲染性能

3.描述vue组件声明周期mm

单组件声明周期图

挂载: beforeCreate => created => beforeMount => mounted
更新: beforeUpdate => updated
销毁: beforeDestroy => destroyed

父子组件生命周期图

挂载: parent beforeCreate => parent created => parent beforeMount => child beforeCreate => child created => child beforeMount => child mounted => parent mounted
更新: parent beforeUpdate => child beforeUpdate => child updated => parent updated
销毁: parent beforeDestroy => child beforeDestroy => child destroyed => parent destroyed
从以上能够看出:
挂载时,子组件是在父组件before mount后开始挂载,并且子组件先mounted,父组件随后
更新时,子组件是在父组件before update后开始更新,子组件先于父组件更新
销毁时,子组件是在父组件before destroy后开始销毁,并且是子组件先销毁,父组件随后。

4.vue组件如何通信

1.父子组件props和this.$emit
2.ref 链:父组件要给子组件传值,在子组件上定义一个 ref 属性,这样通过父组件的 $refs 属性就可以获取子组件的值了,也可以进行父子,兄弟之间的传值($parent / $children与 ref类似)
3.事件总线bus:使用一个 空的 VUE 实例作为事件总线,自定义事件event.$on event.$off event.$emit
4 provide inject组件通信
5.vuex
6.$attrs和$listeners 仅仅是传递数据,而不做中间处理,$attrs 里存放的是父组件中绑定的非 Props 属性,$listeners里存放的是父组件中绑定的非原生事件。
常见使用场景可以分为三类:
父子通信:
父向子传递数据是通过 props,子向父是通过 events($emit);
通过父链 / 子链也可以通信($parent / $children);
ref 也可以访问组件实例;
provide / inject API;
$attrs/$listeners
vuex
兄弟通信:
事件总线Bus;
Vuex
跨级通信:
事件总线Bus;
Vuex;
provide / inject API
$attrs/$listeners

5.描述组件渲染和更新的过程

1、vue 组件初次渲染过程

解析模板为 render 函数
触发响应式,监听 data 属性的 getter 和 setter
执行 render 函数, 生成 vnode,patch(elem,vnode)

2、vue 组件更新过程

修改 data, 触发 setter (此前在getter中已被监听)
重新执行 render 函数,生成 newVnode,patch(vnode, newVnode)

6.双向数据绑定v-model的实现原理

双向数据绑定最核心的方法便是通过Object.defineProperty()来实现对属性的劫持,达到监听数据变动的目的.
先是从data里面的数据msg通过绑定到input控件和p标签上。然后input上通过v-on:input监听控件,触发change()。
调用方法都可以默认获取e事件,e.target.value是获取调用该方法的DOM对象的value值。把value值在赋给data里的msg,就是实现了双向数据绑定的原理了。

7.对mvvm的理解

m->model,v->view,vm->viewModel。dom通过监听事件操作vue里的data,反之vue中的data通过指令操作dom,这就是所说数据驱动视图,这就是mvvm的理解。

8.computed有何特性

缓存,data不变不会重新计算,提高性能

9.VUE 中如何封装组件?什么组件,为什么要封装组件?组件中 data 为什么是一个函数?

  为什么要封装组件?
  主要就是为了解耦,提高代码复用率。

  什么是组件?
  页面上可以复用的都称之为组件 它是 HTML、CSS、JS 的聚合体。

  组件就相当于库,把一些能在项目里或者不同项目里可以复用的代码进行需求性的封装。

  组件中的 data 为什么是一个函数?

  让每个返回的实例都可以维护一份被返回对象的独立的拷

10.ajax请求应该放在哪个生命周期?

mounted,因为js是单线程,ajax异步获取数据

11.如何将组件所有props传递给子组件?

父组件绑定一个自定义属性变量,然后子组件通过props使用这个变量即可。

12.如何自定实现v-model?

我们定义了model对象。model对象包含两个属性,一个是prop,一个是event。prop值text1,event的值change1,我们这里写model是为了改变默认的东西,使用我们自己定义的变量。

<input type="text" :value="text1" @input="$emit('change1', $event.target.value)" >

16.何时使用beforeDestroy?

1.解绑自定义事件event.$off

2.清除定时器

3.解绑自定义dom事件,如windom.scroll等

17.什么是作用域插槽?

在solt组件中有自己的data,把它传给使用的地方