笔试/面试——Vue(全!)

发布于:2022-10-12 ⋅ 阅读:(307) ⋅ 点赞:(0)

目录

一、Vue的最大的优势是什么?

二、在使用计算属性的时候,函数名和data数据源中的数据可以同名吗?

三、Vue和jQuery两者之间的区别?

四、Vue2.0兼容IE哪个版本以上吗?

五、跟keep-alive有关的生命周期是哪些?

1、activated:

2、deactivated:

六、Vue中key的原理?说说对它的理解?

七、Object.defineProperty 和 Proxy 的区别

八、style加scoped属性的用途和原理

九、Vue组件如何进行传值?

1)父传子

1、属性传值:

2、this.$refs.ref

3、this.$children

2)子传父

1、自定义事件 =>  $emit

2、传值的sync

3、传值的v-model

4、this.$parent 或者 this.$root

3) 多层组件传值 $listeners/$attrs

4) 非父子组件之间传递数据

十、watch的属性用箭头函数定义结果会怎么样?

十一、组件的命名规范

十二、Vue自定义事件中 父组件怎么接受 子组件的多个参数?

十三、Vue给组件绑定事件无效 怎么解决?

十四、Vue变量名如果以 _  、$ 开头的属性会发生什么问题?怎么访问到它们的值?

十五、组件中写name选项有什么作用?

十六、使用Vue写一个tab切换

十七、Vue数据双向绑定的原理是什么?

十八、在Vue中使用this应该注意哪些问题?

十九、prop 验证的 type 类型有哪几种?


一、Vue的最大的优势是什么?

Vue是一款简单易学、双向数据绑定、组件化的框架

1、Vue.js可以进行组件化开发,使代码编写量大大的减少,读者更加容易理解

2、Vue.js最突出的优势在于可以对数据进行双向绑定

3、使用Vue.js编写出来的页面的效果本身就是响应式的,这使网页在各个设备都能显示出非常好的效果

4、相比传统的页面同超链接实现页面的切换和跳转,Vue使用路由不会刷新页面

5、Vue是单页面应用,使页面局部刷新,不用每次跳转页面都请求所有数据和DOM,这样大大加快了访问速度和提升用户体验

6、它的第三方UI组件库使用起来节省很多开发时间,从而提升开发效率

二、在使用计算属性的时候,函数名和data数据源中的数据可以同名吗?

本来不应该同名,同名了就说明命名不规范。若eslint配置比较严格的话,同名是编译不通过的。

如果同名,那么就会有覆盖的现象==>

初始化的顺序是: computed  methods  data  props    (C M D P)

本质上这些都是要挂载到this上面的,如果重名,后面出现的属性自然就会覆盖之前挂载的属性

三、Vue和jQuery两者之间的区别?

1、jQuery:

jQuery是曾经很流行的web前端js库,现在国内外使用都使用其它的js库代替它了,随着浏览器厂商对HTML5规范统一遵循以及ECMA6在浏览器端的实现,它的使用率会越来越低。

2、Vue:

Vue是一个兴起的前端js库,是一个精简的MVVM。

从技术角度讲,Vue.js专注于MVVM模型的ViewModel层,它通过双向数据绑定把View和Model层连接起来,通过对数据的操作就可以完成对页面视图的渲染。

当然还有其它的MVVM框架:Angular、react等。但是Vue更简单、快速、组合

3、Vue和jQuery的区别:

1) jQuery是使用选择器选取DOM对象,对其进行赋值、取值、事件绑定等操作

其实和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和页面是在一起的。

2) Vue是通过Vue对象将数据和View完全分离开

对数据进行操作不再需要引用相应的DOM对象,可以说数据和View是分离的,他们通过Vue对象这个vm实现相互的绑定==>这就是MVVM

四、Vue2.0兼容IE哪个版本以上吗?

不支持IE8及以下,部分兼容IE9,完全兼容IE10以上。

因为Vue的响应式原理是基于ES5的Object.defineProperty,这个方法不支持IE8及以下。

五、跟keep-alive有关的生命周期是哪些?

1、activated:

页面第一次进入的时候,钩子触发的顺序就是created、mounted、activated

2、deactivated:

页面退出的时候会触发deactivated,当再次前进或者后退的时候,只触发activated

六、Vue中key的原理?说说对它的理解?

1、如果没有唯一的key,数据更新的时,相同节点更点前后无法准确的一 一对应起来,会导致更新的效率降低。

2、作用:为了高效的更新虚拟DOM

3、当页面的数据发生变化的时,Diff算法只会比较同一层级的节点

1) 如果节点类型不同,直接干掉前面的节点,再创建并插入新的节点,不会再比较这个节点以后的子节点

2) 如果节点类型相同,则会重新设置该节点的属性,从而实现节点的更新

七、Object.defineProperty 和 Proxy 的区别

1、Proxy可以直接监听对象,而非属性

2、Proxy可以直接监听数组的变化

3、Proxy有多达13种拦截方式,不限于apply、ownKeys、deletdProperty、has等是Object.defineProperty不具备的

4、Proxy返回的是一个新的对象,我们可以只操作新的对象达到目的

Object.defineProperty只能遍历对象属性直接修改

5、Proxy作为新标准将受到浏览器厂商重点持续的性能优化,也就是传说中的新标准的性能红利

6、Proxy(Vue3.0)存在浏览器兼容性问题,Object.defineProperty(Vue2.0)兼容性好,支持IE9

八、style加scoped属性的用途和原理

用途:防止全局同名CSS污染

原理:在标签加上v-data-something属性,再在选择器时加上对应[v-data-something],即CSS带属性选择器,以此完成类似作用域的选择方式

九、Vue组件如何进行传值?

1)父传子

1、属性传值:

父组件内设置要传的数据,在父组件中引用的子组件上 绑定一个自定义属性并把数据绑定在自定义属性上,在子组件中添加参数props接受即可

2、this.$refs.ref

在子组件中加上 ref,然后通过 this.$refs.ref 属性值 访问子组件

3、this.$children

在父组件内部通过 this.$children[索引号] 访问子组件

2)子传父

1、自定义事件 =>  $emit

子组件通过vue实例方法$emit 进行 触发 父组件的自定义事件 并且 可以携带参数

2、传值的sync

跟$emit相同,只是这个方法省略了写事件名字

3、传值的v-model

4、this.$parent 或者 this.$root

子组件通过 this.$parent 或者 this.$root 访问到父组件或者根组件

3) 多层组件传值 $listeners/$attrs

多层组件向下传值$attrs,首先在第一层子组件上使用 '属性="数据" ' 将值传
给子组件,再到子组件模板内部使用 v-bind="属性",注意该“属性”不能被定义为子组
件的 props 属性
多层组件向下传值$listeners,在父组件内部定义好 methods 方法,在第一层
组件的模板内部使用 '@事件名="methods 方法"',再到子组件模板内部使用 v-on="事件
名",在需要传值的组件内部使用 this.$emit("事件名",val1,val2,val3……)

4) 非父子组件之间传递数据

第一步:引入第三方 new vue 定义为 eventBus
第二步:在组件中 created 中订阅方法 eventBus.$on("自定义事件名",methods 中
的方法名)
第三步:在另一个兄弟组件中的 methods 中写函数,在函数中发布 eventBus 订阅的
方法 eventBus.$emit("自定义事件名”)
第四步:在组件的 template 中绑定事件(比如 click)

 

十、watch的属性用箭头函数定义结果会怎么样?

this是undefine,要更改的属性也会报错

==>TypeError 错误  :Cannot read property  'xxx' of undefined

因为箭头函数绑定父级作用域的上下文,所以就不会绑定vue实例

十一、组件的命名规范

给组件命名有两种方式:

1、链式命名 my-component

2、大驼峰命名 MyComponent

字符串模板中:
<my-component></my-component> 和 <MyComponent></MyComponent> 都 可 以 使 用
在 非 字 符 串 模 板 中
最 好 使 用 <MyComponent></MyComponent>,
因为要遵循 W3C 规范中的自定义组件名 (字母全小写且 必须包含一个连字符),避免和当前以及未来的 HTML 元素相冲突。
Tips:

1. 在html中不允许使用驼峰!
html中的组件必须用短横线命名,例如my-component
在组件中, 父组件给子组件传递数据必须用短横线,例如my-msg

2. 在template中必须使用驼峰

3.在组件的data中this.XXX引用时,只能是驼峰命名方式,比如this.myMsg

4.文件名最好全小写,因为有些古老的操作系统(window10)可能不能识别大小写,防止2个大小写文件重名。
5.组件首字母最好大写

十二、Vue自定义事件中 父组件怎么接受 子组件的多个参数?

this.$emit("eventName",data)  //data为一个对象

十三、Vue给组件绑定事件无效 怎么解决?

两种方式:

1、组件外部加修饰符     .navtive

2、组件内部声明$emit("自定义事件")

十四、Vue变量名如果以 _  、$ 开头的属性会发生什么问题?怎么访问到它们的值?

实例创建后,可以通过vm.$data访问原始数据对象。Vue实例也代理了data对象上所有的属性,因此访问vm.a等价于访问vm.$data.a

以_或$开头的属性不会被Vue实例代理,因为它们可能和Vue内置的属性、API方法冲突。可以使用例如vm.$data._property的方法访问这些属性

十五、组件中写name选项有什么作用?

1、项目使用keep-alive的时候,可搭配组件name进行缓存过滤

2、DOM做递归组件时,需要调用自身的name

3、Vue-devtools调试工具里显示的组件名称是由vue中组件name决定的

十六、使用Vue写一个tab切换

1、v-for循环,利用下标和v-show/v-if控制显示

2、动态组件component,控制其属性is的值

3、引入vueRouter,定义路由规则,通过router-link/router-view实现

十七、Vue数据双向绑定的原理是什么?

Object.defineProperty定义新属性或修改原有的属性

原理:

用Object.defineProperty这个方法,里面定义了setter和getter方法,通过观察者模式(发布订阅模式)来监听数据的变化,从而做相应的逻辑处理

十八、在Vue中使用this应该注意哪些问题?

1、Vue中使用匿名函数,会出现this指针改变

解决方法:

1)使用箭头函数

2)定义变量绑定this至vue对象

2、Vue的data避免使用箭头函数

3、Vue中的methods中函数尽量不要使用箭头函数,会改变this指向,在Vue-cli构建的项目中this会为undfined

4、生命周期的钩子函数不能使用箭头函数,否则this不能指向vue实例

十九、prop 验证的 type 类型有哪几种?

props:{ 
title:String, 
likes: Number, 
isPublished: Boolean, 
commentIds: Array,
 author: Object,
 callback: Function, 
contactsPromise: Promise 
}

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到