vue相关

vue面试题

一、vue优点

1.轻量级框架:只关注视图层,是一个构建数据的视图集合,大小只有几十kb;

2.简单易学:国人开发,中文文档,不存在语言障碍 ,易于理解和学习;

3.双向数据绑定:保留了angular的特点,在数据操作方面更为简单;

4.组件化:保留了react的优点,实现了html的封装和重用,在构建单页面应用方面有着独特的优势;视图,数据,结构分离:使数据的更改更为简单,不需要进行逻辑代码的修改,只需要操作数据就能完成相关操作;

5.虚拟DOM:dom操作是非常耗费性能的, 不再使用原生的dom操作节点,极大解放dom操作,但具体操作的还是dom不过是换了另一种方式;

6.运行速度更快:相比较与react而言,同样是操作虚拟dom,就性能而言,vue存在很大的优势。


二、vue中的父子组件之间的数据传递之props、$ref和$emit

props是用于数据之间的传递(父组件向子组件),ref也可以用于数据之间的传递(ref用在子组件上,指向的是组件实例,可以理解为对子组件的索引,通过ref可能获取到在子组件里定义的属性和方法。),$emit是用于事件之间的传递(子组件触发父组件里面的方法)

1.props是用于父组件向子组件传递数据信息(所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。)

这里有两种常见的试图变更一个 prop 的情形:

A.这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。在这种情况下,最好定义一个本地的 data property 并将这个 prop 用作其初始值:

props: ['initialCounter'],

data:function(){return{counter:this.initialCounter  }}

B.这个 prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性:

props: ['size'],

computed: {normalizedSize:function(){returnthis.size.trim().toLowerCase()  }}

注意在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变变更这个对象或数组本身将会影响到父组件的状态。

2.通过ref 实现通信

对于ref官方的解释是:ref 是被用来给元素或子组件注册引用信息的。引用信息将会注册在父组件的 refs 对象上。

那应该怎么理解?看看下面的解释:

(1).如果ref用在子组件上,指向的是组件实例,可以理解为对子组件的索引,通过ref可能获取到在子组件里定义的属性和方法。

(2).如果ref在普通的 DOM 元素上使用,引用指向的就是 DOM 元素,通过$ref可能获取到该DOM 的属性集合,轻松访问到DOM元素,作用与JQ选择器类似。

prop和$ref之间的区别:

1.prop 着重于数据的传递,它并不能调用子组件里的属性和方法。像创建文章组件时,自定义标题和内容这样的使用场景,最适合使用prop。

2.ref 着重于索引,主要用来调用子组件里的属性和方法,其实并不擅长数据传递。而且ref用在dom元素的时候,能使到选择器的作用,这个功能比作为索引更常有用到。

3.通过emit 实现通信

上面两种示例主要都是父组件向子组件通信,而通过emit实现子组件向父组件通信。对于emit实现子组件向父组件通信。

vm.$emit( event, […arg] )  $emit是可以传递多个参数的

$emit 绑定一个自定义事件event,当这个这个语句被执行到的时候,就会将参数arg传递给父组件,父组件通过@event监听并接收参数。


三、v-show和v-if指令的共同点和不同点?

共同点:都能控制元素的显示和隐藏;

不同点:实现本质方法不同,v-show本质就是通过控制css中的display设置为none,控制隐藏,只会编译一次;v-if是动态的向DOM树内添加或者删除DOM元素,若初始值为false,就不会编译了。而且v-if不停的销毁和创建比较消耗性能。

总结:如果要频繁切换某节点,使用v-show(切换开销比较小,初始开销较大)。如果不需要频繁切换某节点使用v-if(初始渲染开销较小,切换开销比较大)。


四、如何让CSS只在当前组件中起作用?

在组件中的style前面加上scoped


五、

1.keep-alive简介:keep-alive是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。

用法也很简单:

 

   

 

2.props

include - 字符串或正则表达,只有匹配的组件会被缓存

// 组件 a

export default {

  name: 'a',

  data () {

    return {}

  }

}

//可以保留它的状态或避免重新渲染

 

   

 

//可以保留它的状态或避免重新渲染

exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存

 

   

 

//可以保留它的状态或避免重新渲染

问题:如果只想router-view里面某个组件被缓存,怎么办?

1.使用 include/exclude

2.增加 router.meta 属性

// 组件 a

export default{name:'a',data(){return{}}}

缺点:需要知道组件的 name,项目复杂的时候不是很好的选择

优点:不需要例举出需要被缓存组件名称

增加 router.meta 属性

// routes 配置

export default [{path:'/:id',name:'edit',component:Edit,meta:{keepAlive:false// 不需要被缓存}}]

  {

    path: '/',

    name: 'home',

    component: Home,

    meta: {

      keepAlive: true // 需要被缓存

    }

  }, {

    path: '/:id',

    name: 'edit',

    component: Edit,

    meta: {

      keepAlive: false // 不需要被缓存

    }

  }

]

   

       

   

   

vue实现前进刷新,后退不刷新:https://juejin.im/post/5a69894a518825733b0f12f2

参考文章:https://www.jianshu.com/p/0b0222954483


六、如何获取dom?

答:ref="domName" 用法:this.$refs.domName


七、说出几种vue当中的指令和它的用法?

v-model双向数据绑定;

v-for循环;

v-if v-show 显示与隐藏;

v-on事件;v-once: 只绑定一次。


八、vue-loader是什么?使用它的用途有哪些?

Vue Loader 是一个webpack的 loader,它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件

Vue Loader 还提供了很多酷炫的特性:

1.允许为 Vue 组件的每个部分使用其它的 webpack loader,例如在