vue相关知识总结

42 阅读11分钟

1.让CSS只在当前的组件起作用

答:在style标签中写入scoped即可 例如:

2.v-if 和 v-show 区别

答:简单回复:v-if按照条件是否渲染,v-show是display的block或none; 详细比较:
v-show是css切换,v-if是完整的销毁和重新创建。 使用频繁切换时用v-show,运行时较少改变时用v-if v-if=‘false’ v-if是条件渲染,当false的时候不会渲染

3.$route和$router的区别

答:route路由信息对象包括pathparamshashqueryfullPathmatchedname等路由信息参数。而route是**路由信息对象** 包括path,params,hash,query,fullPath,matched,name等路由信息参数。 而router是 路由实例对象包括了路由的跳转方法,钩子函数等。

4.vue.js 的两个核心是什么?

答:数据驱动组件系统

5.vue 几种常用的指令

答:v-for 、 v-if 、v-bind、v-on、v-show、v-else

6.vue 常用的修饰符?

答:

  • .prevent: 提交事件不再重载页面;
  • .stop: 阻止单击事件冒泡;
  • .self: 当事件发生在该元素本身而不是子元素的时候会触发;
  • .capture: 事件侦听,事件发生的时候会调用

7.v-on 可以绑定多个方法吗?

答:可以

8.vue 中 key 值的作用?

答:当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。key的作用主要是为了高效的更新虚拟DOM。

9在列表渲染时使用key属性

相信大多数Vue开发者接触到key属性的时候是使用v-for进行列表渲染的时候,如果不使用key属性,Vue会产生警告,那么在这个时候key属性的作用是什么呢?

10 什么是vue的计算属性。

在模板中放入太多的逻辑会让模板过重且难以维护,在需要对数据进行复杂处理,且可能多次使用的情况下,尽量采取计算属性的方式。 使用计算属性有以下的好处:

  • ①使得数据处理结构清晰;
  • ②依赖于数据,数据更新,处理结果自动更新;
  • ③计算属性内部this指向vm实例;
  • ④在template调用时,直接写计算属性名即可;
  • ⑤常用的是getter方法,获取数据,也可以使用set方法改变数据;
  • ⑥相较于methods,不管依赖的数据变不变,methods都会重新计算,但是依赖数据不变的时候computed从缓存中获取,不会重新计算。

11. 组件中data为什么是函数

为什么组件中的 data 必须是一个函数,然后 return 一个对象,而 new Vue 实例里,data 可以直接是一个对象?

因为组件是用来复用的, JS 里对象是引用关系,这样作用域没有隔离,而 new Vue 的实例,是不会被复用的,因此不存在引用对象的问题。 vue实例只有一个,所有vue实例中的data属性既可以是一个对象,也可以是一个函数。

vue实例。

const app=new Vue({
    el:'#app',
    //对象类型
    data:{
        foo:'foo'
    },
    //函数格式
    data(){
        return {
           foo:"foo"
        }
    }
})

组件实例对象 data 必须为函数,目的是为了防止多个组件实例对象之间共用一个data,产生数据污染。采用函数的形式,initData有时会将其作为工厂函数都会返回全新data对象,有效规避多实例之间状态污染问题。

12 SPA(单页应用的优缺点)

  • 优点:Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定组合的视图组件,核心是一个响应的数据绑定系统。MVVM数据驱动组件化轻量、简洁、高效、快速、模块友好。

  • 缺点:不支持低版本的浏览器,最低只支持到IE9;不利于SEO的优化(如果要支持SEO,建议通过服务端来进行渲染组件);第一次加载首页耗时相对长一些;不可以使用浏览器的导航按钮需要自行实现前进、后退。

13怎么定义 vue-router 的动态路由? 怎么获取传过来的值

答:在 router 目录下的 index.js 文件中,对 path 属性加上 /:id,使用 router 对象的 params.id 获取。

14 watch 和computed的区别?

区分computed和watch使用场景

  • 当我们需要进行数值计算,并且依赖于其它数据时,应该使用computed,因为可以利用computed的缓存特性,避免每次获取值时,都要重新计算。
  • 当我们需要在数据变化时执行异步或开销较大的操作时,应该使用watch,使用watch选项允许我们执行异步操作,限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。
            如果一个数据需要经过复杂计算就用 computed
            如果一个数据需要被监听并且对数据做一些操作就用 watch
  • 1、功能上computed是计算属性,watch是监听一个值的变化,然后执行对应的回调。
  • 2、是否调用缓存computed中的函数所依赖的属性没有发生变化,那么调用当前的函数的时候会从缓存中读取,而watch在每次监听的值发生变化的时候都会执行回调。
  • 3、是否调用returncomputed中的函数必须要用return返回,watch中的函数不是必须要用return。
  • 4、computed默认第一次加载的时候就开始监听;watch默认第一次加载不做监听,如果需要第一次加载做监听,添加immediate属性,设置为true(immediate:true)
  • 5、使用场景computed----当一个属性受多个属性影响的时候,使用computed-----购物车商品结算。watch–当一条数据影响多条数据的时候,使用watch-----搜索框.

15对MVVM的理解

MVVM 是 Model-View-ViewModel 的缩写。

  • M:模型(Model) :对应 data 中的数据
  • V:视图(View) :模板
  • VM:视图模型(ViewModel) : Vue 实例对象

image.png

MVVM -Model View ViewModel,它包括 DOM ListentersData bindings

  • 前者实现了页面与数据的绑定,当页面操作数据的时候 DOM 和 Model 也会发生相应的变化。
  • 后者实现了数据与页面的绑定,当数据发生变化的时候会自动渲染页面。

MVVM相对于MVC的优势

  1. MVVM 实现了数据与页面的双向绑定,MVC 只实现了 Model 和 View 的单向绑定。
  2. MVVM 实现了页面业务逻辑和渲染之间的解耦,也实现了数据与视图的解耦,并且可以组件化开发。

VUE是如何体现MVVM思想的

  1. 胡子语法(Mustache 语法, {{}} 长的比较像胡子,命名为胡子语法),实现了数据与视图的绑定。
  2. v-on 事件绑定,通过事件操作数据时,v-model 会发生相应的变化。

16 vue2生命周期

2 、VUE 生命周期的几个阶段

beforeCreate(创建前) 在数据观测和初始化事件还未开始

created(创建后) 完成数据观测,属性和方法的运算,初始化事件,$el属性还没有显示出来

beforeMount(载入前) 在挂载开始之前被调用,相关的render函数首次被调用。实例已完成以下的配置:编译模板,把data里面的数据和模板生成html。注意此时还没有挂载html到页面上。
mounted(载入后) 在el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染到html页面中。此过程中进行ajax交互。
beforeUpdate(更新前) 在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。
updated(更新后) 在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。
beforeDestroy(销毁前) 在实例销毁之前调用。实例仍然完全可用。
destroyed(销毁后) 在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。

17 、第一次页面加载会触发哪几个钩子?

答:会触发 下面这几个beforeCreate, created, beforeMount, mounted 。

18 DOM 渲染在 哪个周期中就已经完成?

答:DOM 渲染在 mounted 中就已经完成了。

19 对keep-alive的理解

keep-alive是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。
在vue 2.1.0 版本之后,keep-alive新加入了两个属性: include(包含的组件缓存) 与 exclude(排除的组件不缓存,优先级大于include) 。

image.png

20 对setup的理解

1.setup执行在beforeCreate之前

2.setup中是不能使用data 和method的 因为没有初始化好

  1. 由于不能再setup函数中使用data和methods,所以Vue为了避免我们错误的使用,它直接将setup函数中的this修改成undefined.
  2. setup只能同步,不能异步

21 Vue3最大的新特性在哪?

Vue2.x 的组织代码形式,叫 Options API,而 Vue3 最大的特点是 Composition API 中文名是合成函数以函数为载体,将业务相关的逻辑代码抽取到一起,整体打包对外提供相应能力。可以理解它是我们组织代码,解决逻辑复用的一种方案。

其中 setup 是 Composition API 的入口函数,是在 beforeCreate 声明周期函数之前执行的。还提供了 ref 函数定义一个响应式的数据,reactive 函数定义多个数据的响应式等等。

22 Vue3 Proxy的优势?

Vue3 数据劫持底层主要是使用 ES6 的 Proxy 实现。

Proxy 的优势如下:

  • Proxy 可以直接监听对象(const proxy = new Proxy(target, handler));defineProperty 需要遍历对象属性进行监听。
  • Proxy 可以直接监听对象新增的属性;defineProperty 只能劫持一开始就存在的属性,新增属性需要手动 Observer。
  • Proxy 可以直接监听数组的变化;defineProperty 无法监听数组的变化。
  • Proxy 有多达 13 种拦截方法:不限于 getsethasdeletePropertyapplyownKeysconstruct 等等;除开 get 和 set 其他都是 defineProperty 不具备的。
  • Proxy 返回的是一个新对象,我们可以只操作新的对象达到目的;defineProperty 只能遍历对象属性直接修改;

Proxy 的劣势如下:

  • ES6 的 Proxy 的存在浏览器兼容性问题。

Proxy 和 Reflect 结合实现 Vue3 底层数据劫持原理。Reflect 设计的目的是为了优化 Object 的一些操作方法以及合理的返回 Object 操作返回的结果,对于一些命令式的 Object 行为,Reflect 对象可以将其变为函数式的行为。比如 ('name' in obj) = Reflect.has(obj, 'name')

23 vue2 双向绑定原理

双向绑定是什么?首先明确一下双向绑定和响应式的概念,双向绑定是双向的,表示数据改变驱动视图改变,视图反过来也可以改变数据。响应式是单向的,只代表数据改变驱动视图改变,响应式的主要原理是数据劫持观察者模式,是 Vue 最核心的模块。

首先明确一下双向绑定和响应式的概念,双向绑定是双向的,表示数据改变驱动视图改变,视图反过来也可以改变数据。响应式是单向的,只代表数据改变驱动视图改变,响应式的主要原理是数据劫持观察者模式,是 Vue 最核心的模块。

Vue2 数据劫持的原理

数据劫持核心是 defineReactive 函数,里面主要使用 Object.defineProperty 来对对象访问器 getter 和 setter 进行劫持。数据变更时 set 函数里面可以通知视图更新。

在使用 Object.defineProperty 进行数据劫持的时候,对象和数组是分开处理的:对象是遍历对象属性之后进行递归劫持;数组是重写数组的原型方法比如 splice。这个我看了一些源码和资料。Object.defineProperty 本身是可以监控到数组下标的变化的,但尤大在 github issue 回复过从性能/体验的性价比考虑弃用了这种对数组的劫持方案。举例子就是对象属性通常比较少对每一个属性劫持不会消耗太多性能,但数组可能有成千上万个元素,如果每一个元素都劫持,无疑消耗过多性能。

1.7 Vue2 数据劫持的缺陷

第一个缺陷是由于 Vue2 数据劫持底层是用 ES5 的 Object.defineProperty 实现的,所以不兼容 IE8 以下。

第二个缺陷是 Vue2 数据劫持无法检测数组和对象的变化,只会劫持一开始存在 data 选项里面的数据,这就是官网建议我们把可能要使用的数据一开始声明在 data 里面并提供初始值。对象新增属性可以通过 Vue.$set() 进行数据劫持,数组新增元素也可以通过 Vue.$set(),或者因为数组原型方法已经被重写了可以用 splice、push、unshift 等方法新增元素。