本篇文章给大家谈谈vue项目优化面试,以及vuecli项目优化对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
有关vue的常见面试题(上)
防抖 :一个频繁触发的函数,在规定时间内,只让最后一次生效,前面的不生效。
例:防抖经常用在我们搜索框输入搜索,点击提交,防止等;
节流 :一个频繁触发的函数,在规定时间内,函数执行一次后,只有大于设定的执行周期后才会执行第二次。
例:节流一般在onresize、mousemove、滚动事件等事件中使用,防止过多的请求造成服务器压力
盒模型的组成:元素的内容content、元素的内边距padding、元素的外边距margin、元素的边框border
盒模型分为 : W3C标准盒子 、IE盒子
W3C标准盒子(content-box) :又称内容盒子,是指块元素box-sizing属性为content-box的盒模型,盒子总宽度 = margin + border + padding + width
IE盒子(border-box) :又称怪异盒模型(边框盒子),是指块元素box-sizing属性为border-box的盒模型,盒子总宽 = margin + width
1.toString()与join()一样都是把数组转成以逗号分割的字符串
2.pop() 删除数组的最后一项
3.push() 往数组最后添加新数据
4.shift() 删除数组最前面的一项
var定义的变量可以修改,如果不初始化会输出undefined,不会报错。
const定义的变量不可以修改,而且必须初始化
let是块级作用域,函数内部使用let定义后,对函数外部无影响。
1.都支持服务器端渲染
2.都有虚拟dom,组件化开发,都有‘props’的概念,允许父组件往子组件传送数据,都实现webComponent规范
3.数据驱动视图
4.都有支持native的方案,React的React native,Vue的weex
5.构建工具
React和Vue都有自己的构建工具,你可以使用它快速搭建开发环境。React可以使用Create React App (CRA),而Vue对应的则是vue-cli。都有管理状态,React有redux,Vue有自己的Vuex
设计思想
react
1.函数式思想,all in js ,jsx语法,js操控css
2.单项数据流
3.setState重新渲染
4.每当应用的状态被改变时,全部子组件都会重新渲染。当然,这可以通过shouldComponentUpdate这个生命周期方法来进行控制,如果为true继续渲染、false不渲染,但Vue将此视为默认的优化。
vue
1.响应式思想,也就是基于数据可变的。把html、js、css、组合到一起,也可以通过标签引擎组合到一个页面中
2.双向绑定,每一个属性都需要建立watch监听(页面不用,涉及到组件更新的话需要)
3.Vue宣称可以更快地计算出虚拟 DOM的差异,这是由于它在渲染过程中,会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树
性能
react ----大型项目、优化需要手动去做,状态可控
vue ------中小型项目、状态改变需要watch监听,数据量太大的话会卡顿
扩展性
react
1 类式写法api少,更容易结合ts
2 可以通过高阶组件来扩展
vue
1 声明式写法,结合ts比较复杂
2 需要通过mixin方式来扩展
vue-router提供了导航钩子:全局前置导航钩子 beforeEach和全局后置导航钩子 afterEach
导航钩子3个参数(to,from,next):
到达这个组件时:
离开这个组件时:beforeRouteLeave:(to,from,next)={}
确认离开next();取消离开next(false);
beforeEnter:(to,from,next)={},用法与全局守卫一致。只是,将其写进其中一个路由对象中,只在这个路由下起作用。
方法一:
子组件绑定一个事件,通过 this.$emit() 来触发
在子组件中绑定一个事件,并给这个事件定义一个函数
在父组件中定义并绑定 handleChange 事件
方法二:
通过 callback 函数
先在父组件中定义一个callback函数,并把 callback 函数传过去
在子组件中接收,并执行 callback 函数
方法三:
通过 $parent /$children 或 $refs 访问组件实例
这两种都是直接得到组件实例,使用后可以直接调用组件的方法或访问数据。
这种方式的组件通信不能跨级
方法四:
$attrs和$listeners
前端Vue面试必过题 优选(钩子函数)
①自定义指令是什么?以及自定义指令的使用场景
在Vue中,有很多内置指令,但是这些指令只能满足我们最基础的使用,当我们在实际项目中遇到了必须要对DOM进行操作的逻辑时,我们就用到了自定义指令
②自定义指令的钩子函数
bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
inserted:被绑定元素插入父节点时调用
update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。
componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
unbind:只调用一次,指令与元素解绑时调用。
在父组件给子组件传值的时候,给子组件加一个判断,如果数据没有请求到就不渲染当前组件
vue-router传参两种方式:params和query
方法一:
query 方式传参和接收参数
传参:
接收参数:
this.$route.query.id
传参是this.$router,接收参数是this.$route
两者区别:
$router为VueRouter实例,想要导航到不同URL,则使用$router.push方法
$route为当前router跳转对象,里面可以获取name、path、query、params等
方法二:
params方式传参和接收参数
传参:
接收参数: this.$route.params.id
query和oarams的区别:
query相当于get请求,页面跳转的时候,可以在地址栏看到请求参数,而params相当于post请求,参数不会再地址栏中显示
全局导航钩子:beforeEach、afterEach
组件内导航:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave
独享导航守卫:beforeEnter
vue面试问项目用到什么技术栈时怎么回答
常用的有路由、vue 指令、axios(用于后端数据请求)、vuebus、时间处理(moment)结合过滤器使用、拦截器、监视、走后门(特殊情况用一下 DOM)、还有一些 ui(element、mint、mui)以及其他一些业务上需要的第三方插件等。
或者还可以回答以下技术。
1、vue 的脚手架可以从自行搭建与 webpack 的原理 。
2、vue 项目路由、状态管理、axios、ApI 的封装。
3、vue 服务端渲染 ssr 原理与完整的 SEO 处理点。
4、vue 多页面原理。
5、vue 的响应式原理。
Vue面试题集锦
原理:在创建Vue实例时,Vue会遍历data选项的属性,利用Object.defineProperty()为属性添加getter和setter对数据的读取进行劫持(getter用来依赖手机,setter用来派发更新),并且在内部追踪依赖,在属性被访问和修改时通知变化。每个组件实例会有相应的watcher实例,会在组件渲染过程中记录依赖的所有数据属性,之后依赖项被改动时,setter方法会通知依赖与此data的watcher实例重新计算(派发更新),从而使它关联的组件重新渲染。
一句话总结:vue.js采用数据劫持结合发布-订阅模式,通过Object.defineProperty()来劫持各个属性的setter、getter,在数据变动时发布消息给订阅者,触发响应的监听回调。
我的理解:在new Vue的时候,在Observer中通过Object.defineProperty()达到数据劫持,代理所有数据的getter和setter属性,在每次触发setter的时候,都会通过Dep来通知Watcher,Watcher作为Observer数据监听器与Compile模板解析器之间的桥梁,当Observer监听到数据发生改变的时候,通过Updater来通知Compile更新视图。而Compile通过Watcher订阅对应数据,绑定更新函数,通过Dep来添加订阅者,达到双向绑定。
Vue实例从创建到销毁的全过程,就是生命周期。也就是从开始创建、初始化数据、编译模板、挂载DOM-渲染、更新-渲染、卸载等一系列过程。
它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑。
它可以分为8个阶段:创建前/后、载入前/后、更新前/后、销毁前/后。
第一次页面加载时会触发beforeCreate、created、beforeMounted、mounted
DOM渲染在mounted中就已经完成。
1、beforeCreate:可以在这加个loading事件,在加载实例时触发;
2、created:初始化完成时的事件写在这里,如在这结束loading事件,异步请求也适宜在这里调用;
3、mounted:挂载元素,获取DOM节点;
4、updated:如果对数据统一处理,在这里写上相应函数;
5、beforeDestroy:可以放一个确认停止事件的确认框;
6、nextTick:更新数据后立即操作DOM。
1、对象方法v-bind:class="{'orange': isRipe, 'green': isNotRipe}"
2、数组方法v-bind:class="[class1, class2]"
3、行内v-bind:style="{color: color, fontSize: fontSize+'px'}"
1、router-link标签会渲染为标签,咋填template中的跳转都是这种;
2、另一种是编辑式导航,也就是通过js跳转比如router.push('/home')
M- model ,model 表示数据模型,也可以在model中定义数据修改和操作的业务逻辑
V- view,view表示视图,它负责将数据模型转换为视图展示出来
VM- viewmodel,viewmodel是一个同步view和model的对象,连接view和model,用于监听数据模型的改变和控制视图行为
computed:computed是计算属性,也就是计算值,更多用于计算值的场景。它具有缓存性,computed的值在getter执行后是会缓存的,只有在它依赖的属性值改变之后,下一次获取computed的值时重新调用对应的getter来计算。
watch:watch更多的是观察作用,类似于某些数据的监听回调,用于观察props、$emit或者本组件的值,当数据变化时用来执行回调进行后续操作。它不具有缓存性,页面重新渲染时值不会变化也不会执行。
在style标签上添加scoped属性,以表示它的样式作用于当下的模块,很好的实现了样式私有化的目的,但是也得慎用,样式不易改变。
解决方法:
① 使用混合型的css样式,混合使用全局样式和私有样式。
② 深度作用选择器:如果你希望scoped样式中的一个选择器能够作用的更深,可以使用操作符。如:style scoped.a.b{/ ... /}/style
一个元素绑定多个事件的写法有两种:
1、修饰符的使用
2、在method方法里分别写两个事件
Vue组件中的data值不能为对象,因为对象是引用类型,组件可能会被多个实例同时引用,如果data值为对象,将导致多个实例共享一个对象,其中一个组件改变data属性值,其它实例也会受到影响。
原理:JS执行是单线程的,它是基于事件循环的。所有同步任务都在主线程上执行,形成一个执行栈。主线程之外,还存在一个任务队列,只要异步任务有了运行结果,就在任务队列中放置一个事件。一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,看看那些对应的异步任务,等结束等待状态,进入执行栈,开始执行。主线程不断重复上面的步骤。主执行的执行过程就是tick,所有的异步结果都是通过任务队列来调度的。任务分为两大类:宏任务和微任务,宏任务包括:setTimeOut等,微任务包括promise.then。
Vue用异步队列的方式来控制DOM更新和nextTick回调先后执行。在下次DOM更新循环结束之后执行延迟回调,nextTick主要使用了宏任务和微任务,nextTick把要执行的任务推入一个队列中,在下一个tick同步执行队列的所有任务,它是异步任务中的微任务。如果我们在更新了一个响应式数据后,需要同步拿到这个渲染后的DOM结果,就使用nextTick方法,异步拿这个结果。
使用方式:
① this. nextTick.then(cb); 异步
父组件调用子组件的方法
父组件: this.$refs.yeluosen.childMethod()
子组件向父组件传值并调用方法: $emit
组件之间: bus==$emit+$on
1、第一种方法是直接在子组件中通过this. emit向父组件触发一个事件,父组件监听这个事件就行了。
3、第三种都可以实现子组件调用父组件的方法。
keep-alive是Vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。
原来的组件实例会被复用。这也意味着组件的生命周期钩子不会再被调用,你可以简单的监控watch $route对象:
is用来动态切换组件,DOM模板解析
全局的:前置守卫、后置钩子(beforeEach、afterEach)beforeResolve
单个路由独享的:beforeEnter
组件级的:beforeRouteEnter(不能获取组件实例this)、beforeRouteUpdate、beforeRouteLeave
这是因为在执行路有钩子函数beforeRouteEnter的时候,组件还没有被创建出来,先执行beforeRouteEnter,再执行周期钩子函数beforeCreate,可以通过next获取组件的实例对象,如:next((vm) = {}),参数vm就是组件的实例化对象。
缺点:
优点:
计算属性是需要复杂的逻辑,可以用方法method代替。
vue-cli提供的脚手架模板有browserify和webpack。
① 是什么?
Vue框架中的状态管理,分别是State、Getter、Mutation、Action、Module。
② 怎么使用?
新建一个目录store。
③ 功能场景?
单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车等。
④ vuex的状态:
a. State特性:vuex就是一个仓库,仓库里面放了很多对象,其中state就是数据源存放地,对应于一般Vue对象里面的data。state里面存放的数据是响应式的,Vue组件从store中读取数据,若是store中的数据发生改变,依赖这个数据的组件也会发生更新。它通过mapState把全局的state和getters映射到当前组件的computed计算属性中。
b. Getter特性:getters可以对State进行计算操作,它就是store的计算属性。虽然在组件内可以做计算属性,但是getters可以在多组件之间复用。如果一个状态只在一个组件内使用,可以不用getters。
c. Mutation特性:改变store中state状态的唯一方法就是提交mutation,每个mutation都有一个字符串类型的事件类型和一个回调函数,我们需要改变state的值就要在回调函数中改变。我们要执行这个回调函数,那我们需要执行一个相应的调用方法:store.commit。
d. Action特性:类似于mutation,不同点在于:Action提交的是mutation,而不是直接变更状态。Action可以包含任意异步操作,Action函数接受一个与store实例具有相同方法和属性的context对象,因此你可以调用context.commit提交一个mutation。或者通过context.state和context.getters来获取state和getters。Action通过store.dispatch方法触发:store.dispatch('increment')。
e. Module特性:Module其实只是解决了当state中很复杂臃肿的时候,module可以将store分解为模块,每个模块中拥有自己的state、mutation、action和getter。
① 创建组件页面eg Toast.vue
② 用Vue.extend() 扩展一个组件构造器,再通过实例化组件构造器,就可以创造出可复用的组件。
③ 将toast组件挂载到新创建的div上;
④ 将toast组件的dom添加到body里;
⑤ 修改优化达到动态控制页面显示文字跟显示时间;
修饰符分为:一般修饰符、事件修饰符、按键、系统
① 一般修饰符:
② 事件修饰符
③ 按键修饰符
④ 系统修饰符(可以用如下修饰符来实现仅在按下相应按键时才触发鼠标或键盘事件的监听器。)
Vue的核心的功能,是一个视图模板引擎,但这不是说Vue就不能成为一个框架。在声明式渲染(视图模板引擎)的基础上,我们可以通过添加组件系统、客户端路由、大规模状态管理来构建一个完整的框架。更重要的是,这些功能相互独立,你可以在核心功能的基础上任意选用其他的部件,不一定要全部整合在一起。可以看到,所说的“渐进式”,其实就是Vue的使用方式,同时也体现了Vue的设计的理念
在我看来,渐进式代表的含义是:主张最少。视图模板引擎每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式。
比如说,Angular,它两个版本都是强主张的,如果你用它,必须接受以下东西:
必须使用它的模块机制- 必须使用它的依赖注入- 必须使用它的特殊形式定义组件(这一点每个视图框架都有,难以避免)所以Angular是带有比较强的排它性的,如果你的应用不是从头开始,而是要不断考虑是否跟其他东西集成,这些主张会带来一些困扰。
Vue可能有些方面是不如React,不如Angular,但它是渐进的,没有强主张,你可以在原有大系统的上面,把一两个组件改用它实现,当jQuery用;也可以整个用它全家桶开发,当Angular用;还可以用它的视图,搭配你自己设计的整个下层用。也可以函数式,都可以,它只是个轻量视图而已,只做了自己该做的事,没有做不该做的事,仅此而已。
渐进式的含义,我的理解是:主张最少,没有多做职责之外的事。
vue常见面试题(3)
1. 什么是vue的计算属性computed
计算属性是需要复杂的逻辑,可以用方法method代替
2.vue-cli提供的几种脚手架模板
vue-cli 的脚手架项目模板有browserify 和 webpack;
3.组件中传递数据?
4. vue-router实现路由懒加载( 动态加载路由 )
5. vue-router 的导航钩子,主要用来作用是拦截导航,让他完成跳转或取消
6. 完整的 vue-router 导航解析流程
7. vue-router如何响应 路由参数 的变化?
原来的组件实例会被复用。这也意味着组件的生命周期钩子不会再被调用。你可以简单地 watch (监测变化) $route 对象:
8.vue-router的几种实例方法以及参数传递
name传递
to来传递
采用url传参
9. is的用法(用于动态组件且基于 DOM 内模板的限制来工作。)
is用来动态切换组件,DOM模板解析
tabletris="my-row"/tr /table
10.vuex是什么?怎么使用?哪种功能场景使用它?
是什么:vue框架中状态管理:有五种,分别是 State、 Getter、Mutation 、Action、 Module
使用:新建一个目录store,
场景:单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车
vuex的State特性
A、Vuex就是一个仓库,仓库里面放了很多对象。其中state就是数据源存放地,对应于一般Vue对象里面的data
B、state里面存放的数据是响应式的,Vue组件从store中读取数据,若是store中的数据发生改变,依赖这个数据的组件也会发生更新
C、它通过mapState把全局的state和getters映射到当前组件的computed计算属性中
vuex的Getter特性
A、getters可以对State进行计算操作,它就是Store的计算属性
B、虽然在组件内也可以做计算属性,但是getters可以在多组件之间复用
C、如果一个状态只在一个组件内使用,是可以不用getters
vuex的Mutation特性
改变store中state状态的唯一方法就是提交mutation,就很类似事件。每个mutation都有一个字符串类型的事件类型和一个回调函数,我们需要改变state的值就要在回调函数中改变。我们要执行这个回调函数,那么我们需要执行一个相应的调用方法:store.commit。
Action类似于mutation,不同在于:Action提交的是mutation,而不是直接变更状态;Action可以包含任意异步操作,Action函数接受一个与store实例具有相同方法和属性的context对象,因此你可以调用context.commit提交一个mutation,或者通过context.state和context.getters来获取state和getters。Action通过store.dispatch方法触发:eg。store.dispatch('increment')
vuex的module特性Module其实只是解决了当state中很复杂臃肿的时候,module可以将store分割成模块,每个模块中拥有自己的state、mutation、action和getter
关于vue项目优化面试和vuecli项目优化的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
2、本站永久网址:https://www.yuanmacun.com
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
源码村资源网 » vue项目优化面试(vuecli项目优化)
1 评论