Vue中小结

249 阅读8分钟

Vue

Spa—单页应用。

仅在该 Web 页面初始化时加载相应的 HTML 、 JavaScript 、 CSS ,不会因为用户的操作而重新加载,而是利用 路由的机制实现 HTML的变换,避免页面重新加载。可以减轻服务端的压力。缺点:首屏加载过慢。

优点: 用户体验好、快,内容的改变不需要重新加载整个页面,避免了不必要的跳转和重复渲染; 有利于前后端职责分离,架构清晰,前端进行交互逻辑,后端负责数据处理;

Vue的SSR是什么?有什么好处?

  • SSR就是服务端渲染
  • 基于nodejs serve服务环境开发,所有html代码在服务端渲染
  • 数据返回给前端,然后前端进行“激活”,即可成为浏览器识别的html代码
  • SSR首次加载更快,有更好的用户体验,有更好的seo优化,因为爬虫能看到整个页面的内容,如果是vue项目,由于数据还要经过解析,这就造成爬虫并不会等待你的数据加载完成,所以其实Vue项目的seo体验并不是很好

keep-alive的作用

kepp-alive包裹的组件会被保留状态,避免重新渲染,有include(包括)和exclude属性。

activated(),deactivated()只有该组件保持了状态使用keep-alive才是有效的。 第一次activated触发经过created=》mounted=》activated,退出触发deactivated,再进入只触发activated。

router-link 跟router-view

<router-link to="/home">最终渲染成a便签,有to属性。<router-view>占位符,相当于要显示在哪个位置。

动态路由:<router-link :to="'/user/'+userid"> 或者this.$router.push('/user/'+this.userid)

path:“/user/:abc”,通过$route.params.abc获取id。

vue父子组件生命周期顺序

父beforeCreate -> 父created -> 父beforeMount -> 子beforeCreate -> 子created -> 子beforeMount -> 子mounted -> 父mounted 一定得等子组件挂载完毕后,父组件才能挂在完毕,所以父组件的 mounted 在最后。

父beforeUpdate -> 子beforeUpdate -> 子updated -> 父updated

父beforeDestroy -> 子beforeDestroy -> 子destroyed -> 父destroyed

在哪个生命周期中发起数据请求****

可以在钩子函数 created、beforeMount、mounted 中进行调用,因为在这三个钩子函数中,data 已经创建。如果你要操作DOM,那肯定要mounted才能操作。

推荐在 created 钩子函数中调用异步请求,有以下优点:

· 能更快获取到服务端数据,减少页面 loading 时间;

· ssr (服务端渲染)不支持 beforeMount 、mounted 钩子函数,所以放在 created 中有助于一致性;  

双向绑定的原理:

数据劫持结合发布订阅者模式,核心是Object.defineProperty()方法 mvvm,m为模型层,v为视图层,view,业务逻辑层viewmodel, 通过objectdefineProperty()进行数据劫持,调用set方法检测数据的变化,当数据变化就会触发这个函数。然后一个订阅者,当收到数据变化,就会更新视图。

1. 实现一个监听器Observer,用来劫持监听所有属性,如果发生变化通知订阅者

2. 实现一个订阅者watcher,当接到变化的通知,执行对应的函数然后更新视图

3. 实现compile解析器,解析模板指令,初始化视图。

生命周期函数有哪些?作用是什么?

Beforecreate-开始创建,created初始化数据,beforemount编译模板,mounted挂载dom,beforeupdate数据更新,但视图还没,updated页面和数据同步,beforedestroy-销毁阶段,数据和方法可用—destoryed-卸载阶段,都不可用。 作用:有多个事件钩子,让我们控制整个vue实例的过程更易形成号的逻辑。

destoryed:比如有定时器销毁完就调用这个钩子。

Created和mounted区别

-前者组件实例创建完成立即调用,但dom节点还没更新。Mounted是在页面dom节点渲染完后调用。

组件通信:

通过props,$emit触发自定义事件,ref,vuex

image.png

V-show和v-if都是控制元素的显示和隐藏

v-show是通过控制css使display:none,dom元素还在。V-if是通过直接删除dom元素。频繁的用v-show就好,不频繁用v-if就好

V-if和v-for?

v-for优先级是高于v-if的。不要把v-if和v-for用在同个元素上,性能浪费(每次循环后又判断),所以在template进行v-if判断,然后在内部进行v-for。

vue中如何给对象添加一个属性

Vue.set(),会触发视图更新。

Object.assign()。直接使用Object.assign()添加到对象的新属性不会触发更新

Vue.delete是直接删除数组

怎么配置别名,在引用路径加个~

在vue.config.js配置别名

vue更新数组触发视图更新的方法

push(),pop(),unift(),shift(),sort(),reverse()

computed和watch使用场景。

computed:不支持异步。当一个属性受多个属性影响的时候要用到computed,是依赖缓存的,只有当缓存发生变化就会重新赋值。例:购物车商品结算的时候。

watch:支持异步。当一条数据影响多条数据就用watch。例:搜索数据。

组件是什么?

组件化开发可以降低整个系统的耦合度、调试方便、提高可维护性。

插件注册Vue.use(插件名);

为什么data属性是一个函数而不是一个对象?

产生这样的原因这是两者共用了同一个内存地址,componentA修改的内容,同样对componentB产生了影响。如果我们采用函数的形式,则不会出现这种情况(函数返回的对象内存地址并不相同)。vue组件可能会有多个实例,采用函数返回一个全新的data,如果是对象那可能受到其他实例对象数据的污染。

  • 根实例对象data可以是对象也可以是函数(根实例是单例),不会产生数据污染情况
  • 组件实例对象data必须为函数,目的是为了防止多个组件实例对象之间共用一个data,产生数据污染。

Provide和inject(vue3)

在祖先组件定义provide属性,返回传递的值 在后代组件通过inject接收

为对象添加属性?

通过vue.$set给data对象新增属性,并可以触发视图更新。如果只给对象直接赋值的话,可以新增属性,但不会触发视图更新,因为vue初始化实例的将属性转为setter。

Object.assign()添加到对象的新属性不会触发视图更新。

$nextTick?

vue在更新dom是异步操作的,当数据发生变化了,不会马上更新dom,如果放在$nexttick后面执行,当数据变化,立即执行后面的函数,立即获得更新后的dom。 使用场景:如果在修改数据后立即得到更新后的dom,用vue.nexttick() Vue生命周期前3个钩子函数(beforeCreate、created、beforeCreate)如果要操作 DOM,一定要放在 nextTick 中,否则直接报错,因为此时 DOM 还没进行渲染

Mixin是什么?

当两个组件有共同代码需要抽取,可以编写一个mixin对象,定义一个myMixin对象,里面有methods,data。然后通过mixins:[myMixin]调用。也可以单独建一个js文件,导出,通过然后在组件里导入后mixins:[myMixin]。缺点是不能传递参数。

插槽:

子组件通过<slot name=”head”></slot>定义,父组件通过<div slot=”head”></div>调用,

作用域插槽,可以获得插槽作用域的值

如何获取dom?

通过ref=“domName” ; 然后this.$refs.domName

Key:

可以更高效的更新虚拟dom,因为他会给每个节点做标识,可以更好的匹配,涉及到那个diff算法,不用key做标识的是索引。

说一下 vue 有哪些优点和特点*

渐进式框架:可以在任何项目中轻易的引入,便于第三方库和既有项目整合

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

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

双向数据绑定:在数据操作方面更为简单;

组件化开发:很大程度上实现了逻辑的封装和复用,在构建单页面应用方面有着独特的优势;

什么是虚拟 dom

Virtual DOM 是 DOM 节点在 JavaScript 中的一种抽象数据结构,之所以需要虚拟 DOM,是因为浏览器中操作 DOM 的代价比较昂贵,频繁操作 DOM 会产生性能问题。

Actived()缓存的组件激活后,都会调用。用来获取缓存后的数据

vue常用的修饰符

.native 给组件绑定事件。 image.png

image.png

为什么需要虚拟DOM

DOM是很慢的,其元素非常庞大,页面的性能问题,大部分都是由DOM操作引起的

vue2 和vue3 什么区别

1 响应式原理,vue2用defineProperty,vue3双向数据绑定—proxy(因为definePropertyAPI)只能针对单例属性做监听,proxy监听是一个对象或者数组,对象里的所有操作都能监听。

2 生命周期钩子名称

image.png

3 自定义指令钩子名称

4 新的内置组件

5 diff 算法

6 Composition API,生命周期,方法,都在setup里。

7基于typescript编写的

主流的前端框架的优缺点是什么****

只用过 vue ,优点上面讲过了,缺点嘛,可能就是不支持 IE8

vue 组件间传值的 n 种方式*

(1) props / $emit 适用 父子组件通信

(2) ref 适用 父子组件通信

· ref:如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例,父元素通过this.$refs.名调用

(3) parent/parent **/** children / $root :访问父 / 子实例 / 根实例

(4) EventBus 事件总线(emit/emit / on) 适用于 父子、隔代、兄弟组件通信****

先在入口初始化,Vue.prototype.$bus = new Vue()

通过this.bus.emit()发送,通过this.bus.emit()发送,通过this.bus.on()接收

这种方法通过一个空的 Vue 实例作为中央事件总线(事件中心),用它来触发事件和监听事件,从而实现任何组件间的通信,包括父子、隔代、兄弟组件。

(5)  适用于 隔代组件通信

(6) provide / inject 适用于 隔代组件通信

父组件中通过 provide 来提供变量,然后在子孙组件中通过 inject 来注入变量。provide / inject API 主要解决了跨级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系。

(7) Vuex 适用于 父子、隔代、兄弟组件通信

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store(仓库)。store 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state )。

· Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。

· 改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化。

vue 首屏渲染优化有哪些

· 图片压缩/懒加载

· 禁止生成 .map 文件

· 路由懒加载

· cdn 引入公共库

· 开启 GZIP 压缩

assets和static区别

都是放静态资源,打包后会放置在static文件中。static防止的不用打包压缩化。

vue-router 有 2 种路由模式

hash、history、

· hash: 使用 URL hash 值来作路由。支持所有浏览器,包括不支持 HTML5 History Api 的浏览器;通过改url,location.hash因为hash发生变化的url都会被浏览器记录下来,从而你会发现浏览器的前进后退都可以用了

· history : 依赖 HTML5 History API 和服务器配置。最主要的 API 有以下两个:history.pushState() 和 history.repalceState()。后者不能返回

history和hash的区别?

hash值变化不会导致浏览器向服务器发出请求,hash的变化都会被浏览器记录,不会向后端发出请求。hash带有#号。history没有,而且history刷新会对后端发出请求。

vue-router参数传递的方式

params和query。params在浏览器不显示参数,query在浏览器显示参数。query刷新不会丢失里面数据,params会。 都是通过this.$route.params.id

$nextTick的使用

vue更新dom是异步的。当数据变化时,立即获得更新后的dom。Vue生命周期前3个钩子函数(beforeCreate、created、beforeCreate)如果要操作 DOM,一定要放在 nextTick 中,否则直接报错,因为此时 DOM 还没进行渲染

怎么实现MVVM双向绑定

是个语法糖     <input type='text'  :value='message'  @input=‘i’>  

Data:{message:‘双向’}method:{i(event){

this.Message=event.target.value

}}

onload和onshow?

  1. onshow在每次打开页面都会加载,可以用于数据在需要刷新的环境下
  2. onload只是在第一次进入页面会刷新数据,从二级页面回来不会重新加载数据

vuex:state和mutation是必须的

1.state:负责状态管理,类似于vue中的data,初始化数据。

2.mutation:专用于修改state的方法,通过commit触发。

3.action:可以用来处理异步方法,通过dispatch,通过this.$store.dispatch()

4.getters:vuex中的计算属性,依赖与state状态值,一旦改变,getters会重新计算,需要return

5.modules:模块化管理。

Promise

Promise的初始状态是pending

·  1、执行了resolve,Promise状态会变成fulfilled

·  2、执行了reject,Promise状态会变成rejected

·  3、Promise只以第一次为准,第一次成功就永久为fulfilled,第一次失败就永远状态为rejected

·  4、Promise中有throw的话,就相当于执行了reject

Promise中有throw的话,就相当于执行了reject。这就要使用try catch了

then支持链式调用,下一次then执行受上一次then返回值的影响,then总是返回一个新的promise

咱们知道then是Promise上的方法,那如何实现then完还能再then呢?很简单,then执行后返回一个Promise对象就行了,就能保证then完还能继续执行then

Promise 如何一次进行多个异步请求

promise解析

答:利用 Promise.all 。

事件循环

同步代码=》所有微任务=》渲染页面=》第一个宏任务=》所有微任务=》渲染页面=》第二个宏任务

先执行同步代码,遇见定时器会交给对应的管理模块,1秒后放进宏队列,继续执行代码后,第一个宏任务,然后检查有没有新的微任务,没有就执行第二个宏任务。

async,await

简化异步的操作,await后面的代码是微任务。

all****

· 接收一个Promise数组,数组中如有非Promise项,则此项当做成功

· 如果所有Promise都成功,则返回成功结果数组

· 如果有一个Promise失败,则返回这个失败结果

any****

any与all相反

· 接收一个Promise数组,数组中如有非Promise项,则此项当做成功

· 如果有一个Promise成功,则返回这个成功结果

· 如果所有Promise都失败,则报错

axios

get post的区别(至少五条)

1.get对长度有限制,post 无。  2. get数据会显示在url(不安全),post放在请求体中 。3.Get只能url编码,4.get只能ascii字符。5.Get从服务器获取数据,post从服务器接收数据。 6.get刷新无影响、post会重新请求。

Axios是什么?

· 从浏览器中创建 XMLHttpRequests

· 从 node.js 创建 http请求

· 支持 Promise API

· 拦截请求和响应

· 转换请求数据和响应数据

· 取消请求

· 自动转换JSON 数据

· 客户端支持防御XSRF

image.png

前端如何处理这些状态码****

答:在 axios 的请求拦截当中根据不同的状态码进行不同的操作。

如何做权限认证****

答:在路由守卫中根据 url 地址结合 token 做权限认证。

同步和异步的区别****

同步:  同步的思想是:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。这种情况下,用户不能关闭界面,如果关闭了,即迁移程序就中断了。

异步:  将用户请求放入消息队列,并反馈给用户,系统迁移程序已经启动,你可以关闭浏览器了。然后程序再慢慢地去写入数据库去。这就是异步。但是用户没有卡死的感觉,会告诉你,你的请求系统已经响应了。你可以关闭界面了。

AJAX过程说下   

1创建ajax对象(xmlhttprequest对象)。 2链接到服务器(ajax.open(get,)) 3发送请求ajax.send().  4接收请求

AJAX状态码

1xx服务器接到请求、 2xx表示请求成功 3xx需重定向 4xx客户端ing求错误 5xx服务端错误

XML和JSON的区别。 

xml的数据体积较大。json占用带宽小。xml是标记语言,类似于html。服务器端要解析xml才能使用,json可以直接给服务端使用,节省了时间和资源。

axios参数的传递方式

data和params。data一般用post、put。params一般用get,get一般是把参数附在url后面,post是在请求体里的