本文介绍: ​前两篇详细讲解了 HTML 、CSS 、JavaScript计算机网络知识、Reactgitwebpack等方面的内容本文详细讲解 有关 vue内容,预祝各位成功上岸!

前两篇详细讲解了 HTML 、CSS 、JavaScript 、计算机网络知识、Reactgitwebpack等方面的内容本文详细讲解 有关 vue内容,预祝各位成功上岸!

1、说一下 vue两个特性

(1)数据驱动视图:

数据的变化会驱动视图自动更新

​ 好处:程序员只管把数据维护好,那么页面结构会被 vue 自动渲染出来!

(2)双向数据绑定:

​ 在网页中,form 表单负责采集数据,Ajax 负责提交数据

 2、谈一谈对 MVVM 的理解

MVVM 是 Model-View-ViewModel 的缩写。MVVM 是一种设计思想

(Mode 数据源、View 视图、ViewModel 就是 vue实例

– 数据驱动视图双向数据绑定底层原理是 MVVM

– Model 表示当前页面渲染时所依赖数据源

– View 表示当前页面渲染的 DOM 结构

– ViewModel 表示 vue实例,它是 MVVM 的核心,把当前页面数据源和页面结构连在了一起。

在 MVVM 架构下,View 和 Model 之间没有直接的联系,而是通过 ViewModel 进行双向交互, 因此 View 数据的变化会自动同步到 Model 中,而 Model 数据的变化也会立即反应到 View 上,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作 DOM,不需要关注数据状态同步问题复杂的数据状态维护完全由 MVVM 来统一管理

优点:

3、vue 组件生命周期

生命周期总共分为四个阶段创建(前/后), 挂载(前/后),更新(前/后),销毁(前/后);

注意:

1、除了更新阶段的两个钩子函数,其他的都只执行一次

2、第一次页面加载触发的 4 个钩子函数分别是:beforeCreate、created、beforeMount、mounted;

3、DOM 渲染是在 mounted 阶段完成,此阶段真实的 DOM 挂载完毕,数据完成双向绑定,可以访问到 DOM 节点

4、多组件(父子组件)中生命周期调用顺序

组件的调用顺序都是先父后子;渲染完成顺序是先子后父;组件销毁操作是先父后子;销毁完成顺序是先子后父。

加载渲染过程:父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount- >子mounted->父mounted

组件更新过程:父beforeUpdate->子beforeUpdate->子updated->父updated

组件更新过程:父 beforeUpdate -> 父 updated

销毁过程:父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

5、created 和  mounted 的区别

created:在模板染成html前调用,即通常初始化某些属性值,然后再渲染成视图

mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对htmldom节点进行一些需要的操作。

4、vue 框架实现数据双向绑定的原理什么

vue2 Object.defineProperty 实现的,为对象定义属性时候注册 setter 和 getter 方法,在这两个方法上进行监听,对属性的改变或者获取的时候同时进行页面更新。

v-model 用于表单数据的双向绑定,其实就是一个语法糖,这个背后就做了两个操作:

v-bind 绑定一个 value 属性;v-on 指令给当前元素绑定 input 事件

vue3 中使用的是 proxy 代理;所以 vue 项目不能在 ie8 以下的浏览器使用。因为不支持

5、vue 组件传参

1、父传子使用props属性

子组件在props创建一个属性用来接收父组件传过来的值;在父组件中注册子组件;

在子组件标签添加子组件props创建属性;把需要传给子组件的值赋给该属性

2、子传父使用事件派发

子组件中需要以某种方式(如点击事件)的方法触发一个自定义事件;将需要传的值作为$emit第二个参数,该值将作为实参传给响应事件方法;在父组件中注册子组件并在子组件标签上绑定自定义事件监听

3、非相关组件使用事件总线或者vuex

什么是事件总线:我们在vue项目中定义一个空白的vue实例,所有的事件派发监听都在这个空白的vue实例上进行

$emit事件派发$on事件监听

4、vue3中实现跨组件传参使用providerinject

6、 组件传参值改变的问题

父子组件之间父子组件之间,当传值object类型时,传值之后数据源会被改变,最好的解决办法是:传值的时候不要直接传数据源,而且经过使用深拷贝和浅拷贝或者定义新变量等。

data 是一个 function,可以保证每一个组件中的数据是一个唯一的实例。可以保证所有的组件在复用的时候互不影响

7、vuex 状态管理

是 vue 中的状态管理插件,主要用来做数据共享的;

8、actions 中也能改变数据,为什么建议这样做?

因为每一次的数据改变需要可以被追踪到,但是 action 中改变的数据是没有办法被追踪的;

在 vuex 中的数据流向:组件中通过 disptatch 派发一个 action,在 action 中调接口获取数据获取数据成功之后提交(commit)一个 mutation 改变数据,数据改变之后组件重新更新;

如果不牵涉异步操作,可以在组件中 commit 提交一个 mutation 直接改变数据

9、vue 中如何保证页面切换之后数据还在?

比如列表跳转详情页之后,返回列表的时候以前加载的数据还在;

keep-alive 可以对组件做缓存;或者使用 vuex 实现数据共享;以上两者实现的都是数据的临时存储,如果页面刷新了,数据还会消失。为了解决刷新之后数据不消失问题,可以使用 localstorage 本地存储,或者刷新之后重新加载数据的方案实现

10、Vuex 可以直接修改 state 的值吗?

可以直接修改,但是极其不推荐state的修改必须在mutation修改,否则无法被devtool监测,无法监测数据的来源,无法保存状态快照,也就无法实现时间漫游/回滚之类的操作。

11、vuexredux什么区别

vuex 只能在 vue 中使用;redux 可以在任何一个框架中使用;它们两个都是基于单向数据流的;

12. vuex 是什么?怎么使用它?什么场景下我们会使用到 vuex

vuex 是什么

vuex 是一个专为 Vue 应用程序开发状态管理器采用中式存储管理应用的所有组件的状态。每一个 vuex 应用的核心就是 store仓库)。“store基本就是一个容器,它包含着应用中大部分的状态 (state)。

什么需要 vuex?

由于组件只维护自身的状态(data),组件创建时或者路由切换时,组件会被初始化,从而导致 data 也随之销毁

使用方法

main.js 引入 store注入。只用来读取的状态集中放在 store 中, 改变状态的方式是提交 mutations,这是个同步的事物,异步逻辑应该封装action 中。

什么场景下会使用到 vuex?

如果是 vue 的小型应用,那么没有必要使用 vuex,这个时候使用 vuex 反而会带来负担。组件之间的状态传递使用 props自定义事件来传递即可

但是如果涉及到 vue 的大型应用,那么就需要类似于 vuex 这样的集中管理状态的状态机管理所有组件的状态。例如登录状态、加入购物车音乐播放等,总之只要是开发 vue 的大型应用,都推荐使用 vuex 来管理所有组件状态。

13. 说一下 v-for 与 v-show区别

共同点:都是动态显示 DOM 元素

区别点:

手段:

v-if 是动态的向 DOM 树内添加或者删除 DOM 元素;

v-show通过设置 DOM 元素的 display 样式属性控制显隐;

编译过程:

v-if 切换有一个局部编译/卸载过程,切换过程中合适地销毁和重建内部的事件监听和子组件;

v-show 只是简单基于 css 切换;

编译条件

v-if 是惰性的,如果初始条件为假,则什么也不做。只有在条件一次变为真时才开始局部编译;

v-show 是在任何条件下(首次条件是否为真)都被编译然后缓存,而且 DOM 元素保留

性能消耗:

v-if 有更高的切换消耗;

v-show 有更高的初始渲染消耗;

使用场景

v-if 适合运营条件不大可能改变;

v-show 适合频繁切换;

14、路由拦截路由守卫

beforeEach 路由前置守卫,可以用来做登录判断

– vue 路由以及路由嵌套和路由守卫

  路由嵌套使用 children 属性实现

  beforeEach,在所有的页面跳转之前执行,可以做登陆判断

15、在项目用户登陆判断是怎么实现的?

我们会把用户登陆信息存储本地,在每一次路由跳转之前判断是否存的有登陆信息。如果有那表示登陆过了,同时我们还会做网络请求全局拦截,我们的登陆信息传递服务器的时候,服务接口验证用户登陆数据是否有效,根据验证结果返回我们对应的状态码。我们会更具返回的状态码做不同处理提示

16、项目打包优化

17、vue 项目如何性能优化,或者解决首页白屏问题

1. 对资源文件进行压缩合并,使用 cdn 的方式引入资源

2. 使用路由懒加载方式加载路由对应的组件,初始化的时候第一次加载所有的路由文件,当访问对应页面的时候再加载

3. 使用 cdn 的方式引入外部资源,把我们项目中的一些第三方插件使用外部引入的方式进行引入。不打包生成js 文件

4.v-for 循环的时候加上 key

5.使用路由懒加载

 推荐观看:vue打包优化_哔哩哔哩_bilibili

18、watch计算属性以及 method 方法调用的区别

19、vue 中的数据改变是异步的,如何获取改变之后的最新的数据?

$nextTick,可以获取最新的改变之后的结果。页面在下一次渲染之后会触发它的回调函数;

20、 $set没有了解过,有什么作用

我们在 vue 中动态data 添加的数据是不能做到响应式的,可以使用$set 为其设置响应式;

21、虚拟 domdiff 算法

虚拟 dom就是一个用 js 表达的 dom结构,最终会生成真实的 dom 树。它是一个 js 对象,所以更新比较效率很高,在渲染生成真实的 dom 树的时候会进行局部更新,而不是更新整个页面。这样子便于提升页面的渲染速度和优化页面性能

diff 算法,是一个虚拟 dom 节点改变的查找算法,可以快速定位到发生改变的节点找到哪一个位置发生了改变,进行替换操作。它是按照逐层进行比较的,遇到改变的节点,直接替换整棵树

diff 算法按照逐层比较,如果当前层有改变,那么所有的子节点自动全部替换

22、vue 中如何获取 dom 元素?

(1)通过 $refs 获取元素;

<template>
  <div>
    <input type="text" ref="myInput">
    <button @click="handleClick">获取值</button>
  </div>
</template>

<script>
export default {
  methods: {
    handleClick() {
      console.log(this.$refs.myInput.value);
    },
  },
};
</script>

使用ref,给相应的元素加ref=”name“, 然后再this.$refs.name获取到该元素

(2)通过事件参数 $event 获取元素;

<template>
  <div>
    <input type="text" @blur="handleBlur">
  </div>
</template>

<script>
export default {
  methods: {
    handleBlur(event) {
      console.log(event.target.value);
    },
  },
};
</script>

添加了一个事件监听器,并将其绑定到handleBlur方法。当输入框失去焦点时,handleBlur方法被触发。该方法接受一个事件参数event,并使用event.target.value获取输入框的值。

23、vue 中如何解决 v-for 中使用 v-if 的问题

在 v-for 循环之前多数据先做过滤处理(只循环需要展示的数据)

v-for 的优先级高于 v-if

24、$route 和 $router 的区别

$route用来获取路由的信息的,它是路由信息的一个对象里面包含路由的一些基本信息,包括namemetapathhashqueryparams、等。

而$router主要是用来操作路由的,它是VueRouter的实例,包含了一些路由的跳转方法,钩子函数等

25、对比 jQuery,Vue 有什么不同

jQuery 专注视图层通过直接操作 DOM 去实现页面的一些逻辑渲染;Vue 专注于数据层,通过数据的双向绑定,最终表现在 DOM 层面,减少了 DOM 操作;

Vue 使用了组件化思想,使得项目子集职责清晰,提高开发效率,方便重复利用,便于协同开发

26、Vue-router 使用 paramsquery 传参有什么区别?

// 用法

1:query要用path引入params要用name引入接收参数都是类似的,分别是this.$route.query.name和this.$route.params.name

// 展示上

2:query更加类似于我们ajaxget传参,params则类似于post,说的再简单一点,前者在浏览器地址栏显示参数,后者则不显示

3:params是路由的一部分,必须要有。query拼接url后面的参数,没有也没关系

4:params、query不设置也可以传参,params设置的时候,刷新页面或者返回参数会丢失

27、用过插槽吗?用的是具名插槽还是匿名插槽

用过,都使用过。插槽相当于预留了一个位置,可以将我们书写在组件内的内容放入,写一个插槽就会将组件内的内容替换一次,两次替换两次。为了自定义插槽位置我们可以给插槽取名,它会根据插槽名来插入内容,一一对应。

28、用过 beforeEach 吗?

每次通过vue-router进行页面跳转,都会触发beforeEach这个钩子函数,这个回调函数共有三个参数,to,from,next这三个参数,to表示我要跳转目标路由对应的参数,from表示来自那个路由,就是操作路由跳转之前的,即将离开的路由对应的参数,next是一个回调函数,一定要调用next方法来resolve这个钩子函数;

29、常见的事件修饰符及其作用

30、谈一下你对keep-alive的理解

如果需要在组件切换的时候,保存一些组件的状态防止多次渲染,就可以使用 keep-alive 组件包裹需要保存的组件。

keep-alive有以下三个属性:

注意:keep-alive 包裹动态组件时,会缓存不活动的组件实例。

keep-alive 组件是 vue 的内置组件,用于缓存内部组件实例。这样做的目的在于,keep-alive 内部的组件切回时,不用重新创建组件实例,而直接使用缓存中的实例,一方面能够避免创建组件带来的开销,另一方面可以保留组件的状态。

keep-alive 具有 includeexclude 属性,通过它们可以控制哪些组件进入缓存。另外它还提供了 max 属性,通过它可以设置最大缓存数,当缓存的实例超过该数时,vue 会移除最久没有使用的组件缓存

keep-alive的影响,其内部所有嵌套的组件都具有两个生命周期钩子函数,分别是 activated 和 deactivated,它们分别在组件激活和失活时触发。第一次 activated 触发是在 mounted 之后

在具体的实现上,keep-alive内部维护了一个 key 数组和一个缓存对象

// keep-alive 内部声明周期函数

// keep-alive 内部声明周期函数
created () {
    this.cache = Object.create(null)
    this.keys = []
}

key 数组记录目前缓存的组件 key 值,如果组件没有指定 key 值,则会为其自动生成一个唯一的 key 值

cache 对象以 key 值为键,vnode 为值,用于缓存组件对应虚拟 DOM

在 keep-alive 的渲染函数中,其基本逻辑是判断当前渲染的 vnode 是否有对应的缓存,如果有,从缓存中读取对应的组件实例;如果没有则将其缓存。

当缓存数量超过 max 数值时,keep-alive 会移除掉 key 数组第一个元素。

31、Vue-router 导航守卫哪些

32、vue3 和 vue2 的区别?

vue3 数据双向绑定的原理proxy 代理和 vue2 不一样。vue3 中引入很多 hooks写法,vue3 中新增组合式 api写法更像 react

vue3 中移除filter 过滤器功能;vue3 中跨组件之间传参使用 provider/inject 实现;

(1)监测机制的改变

(2)只能监测属性,不能监测对象

(3)模板

(4)对象式的组件声明方式

  • vue2.x 中的组件是通过声明的方式传入一系列 option,和 TypeScript 的结合需要通过一些装饰器的方式来做,虽然能实现功能,但是比较麻烦。
  • 3.0 修改了组件的声明方式,改成了类式的写法,这样使得和 TypeScript 的结合变得很容易

(5)其它方面的更改

推荐阅读

前端面试前端面试八股文(详细版)—上-CSDN博客 

前端面试前端面试八股文(详细版)—中_前端面试八股文在哪刷-CSDN博客

Vue2重点笔记Vue2快速上手指南,重点笔记整理-CSDN博客

Vue3重点笔记: Vue3快速上手指南,重点知识内容总结_vue3 中 v-phone-hide:name_旺旺大力包的博客-CSDN博客

原文地址:https://blog.csdn.net/leoxingc/article/details/134277098

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_42992.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注