VUE面试题整理3.0


1.vue最大特点是什么或者说vue核心是什么

vue最大特点就是“组件化“和”数据驱动“
组件化就是可以将页面和页面中可复用的元素都看做成组件,写页面的过程,就是写组件,然后页面是由这些组件“拼接“起来的组件树
数据驱动就是让我们只关注数据层,只要数据变化,页面(即视图层)会自动更新,至于如何操作dom,完全交由vue去完成,只关注数据,数据变了,页面自动同步变化了,很方便

2.vue自定义指令如何实现的和适用场景?

vue除有了v-for,v-if等自带vue指令外,但不能满足所有的开发需求,有时需要自定义指令,自定义指令创建有全局自定义指令和局部自定义指令
全局自定义指令:Vue.directive(‘指令名’,{ inserted(el) { } })
局部自定义指令:directives:{ }

3.对单向数据流的理解

答:单向数据流主要是vue 组件间传递数据是单向的,即数据总是由父组件传递给子组件,子组件在其内部维护自己的数据,但它无权修改父组件传递给它的数据,当开发者尝试这样做的时候,vue 将会报错。这样做是为了组件间更好的维护。
在开发中可能有多个子组件依赖于父组件的某个数据,假如子组件可以修改父组件数据的话,一个子组件变化会引发所有依赖这个数据的子组件发生变化,所以 vue 不推荐子组件修改父组件的数据

4.vue开发环境和线上环境如何切换

主要通过检测

process.env.NODE_ENV===”production”和process.env.NODE_ENV===”development”

环境,来设置线上和线下环境地址,从而实现线上和线下环境地址的切换

5.对axios拦截器的理解

axios拦截器可以让我们在项目中对后端http请求和响应自动拦截处理,减少请求和响应的代码量,提升开发效率同时也方便项目后期维护

6.vue第三方ui样式库如何实现样式穿透的(ui库和less/sass穿透问题)

 >>> /deep/

7.为什么要用scoped

在style标签上使用scoped属性主要是实现样式的私有化,防止对全局样式造成污染。

8.在 vue 中使用插件的步骤

采用 es6 的 import…from

9.Vue3.0 你知道有哪些改进

更好的支持了 TS
设计了一套强大的组合式 API,复用性更强
vue3 采用 es6 的 Proxy 代理对象 代替了 vue2 的 Object.defineProperty() 实现数据的响应式
重写了虚拟 DOM, 速度更快了

10.eventBus详细使用

enventBus(事件总线)就是借助 Vue 实例中的 $on()$emit() ,来实现数据传递

新建一个 bus.js 文件,里面 new 一个 Vue()导出

需要通信的组件导入 bus.js

bus.$emit() 触发消息,发布出去

bus.$on() 订阅消息,监听到同名消息就调用回调

11. Vue 中 v-html 会导致哪些问题?

可能会受到 xss 攻击
会替换掉标签内部的子元素

12.Class 与 Style 如何动态绑定?

Class 可以通过对象语法和数组语法进行动态绑定:

对象语法:

<div v-bind:class="{ active: isActive, 'text-danger': hasError }"></div>
 
 
data: {
  isActive: true,
  hasError: false
}

数组语法:

<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
 
 
data: {
  activeClass: 'active',
  errorClass: 'text-danger'
}

Style 也可以通过对象语法和数组语法进行动态绑定:

对象语法:

<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
 
 
data: {
  activeColor: 'red',
  fontSize: 30
}

数组语法:

<div v-bind:style="[styleColor, styleSize]"></div>
 
 
data: {
  styleColor: {
     color: 'red'
   },
  styleSize:{
     fontSize:'23px'
  }
}

13.直接给一个数组项赋值,Vue 能检测到变化吗?

由于 JavaScript 的限制,Vue 不能检测到以下数组的变动:

当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue

当你修改数组的长度时,例如:vm.items.length = newLength

为了解决第一个问题,Vue 提供了以下操作方法:

// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// vm.$set,Vue.set的一个别名
vm.$set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)

为了解决第二个问题,Vue 提供了以下操作方法:

// Array.prototype.splice
vm.items.splice(newLength)

14.Vue Router的路由守卫

router.beforeEach、router.beforeResolve、router.afterEach......

路由守卫接受三个参数:

to:route即将进入的目标路由对象,
from:route当前导航正要离开的路由
next:function一定要调用该方法resolve这个钩子。执行效果依赖next方法的调用参数。可以控制网页的跳转。

15.Vue Router的hash和history模式

对于vue这类渐进式前端开发框架,为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义。前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求。

为了达到这一目的,浏览器当前提供了以下两种支持:

hash —— 即地址栏 URL 中的 # 符号(此 hash 不是密码学里的散列运算)。比如这个 URL:http://www.abcdfg.com/#/hellio hash 的值为 #/hello
它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。
history —— 利用了 HTML5 History Interface 中新增的 pushState()replaceState() 方法。(需要特定浏览器支持)这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。

16.Vue中如何进行依赖收集?

每个属性都拥有自己的dep属性,存放他所依赖的watcher,当属性变化后会通知自己对应的watcher去更新
默认在初始化时会调用render函数,此时会触发属性依赖收集 dep.depend
当属性发生修改时会触发watcher更新 dep.notify()

17.谈一谈对Vue组件化的理解

组件化开发能大幅提高应用开发效率、测试性、复用性等;
常用的组件化技术:属性、自定义事件、插槽等
降低更新范围,只重新渲染变化的组件
组件的特点:高内聚、低耦合、单向数据流

18.vue如何实现按需加载配合webpack设置

webpack中提供了require.ensure()来实现按需加载。以前引入路由是通过import 这样的方式引入,改为const定义的方式进行引入。

页面不按需加载引入方式:import home from '../../common/home.vue'

页面按需加载引入方式:

const home = r => require.ensure( [], () => r (require('../../common/home.vue')))

19.params和query的区别

两者都是为了传递参数;
params通过name引入路由传参,query通过path路由传参;
params是路由的一部分,必须要在路由后面添加参数名,query是拼接在url后面的参数

20.v-on可以监听多个方法吗?

可以

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值