当前位置: 首页 > Web前端 > vue.js

前端面试宝典:vue核心知识

时间:2023-03-31 16:31:48 vue.js

前言:想要系统学习前端面试题,强烈推荐浏览在线电子书(支持手机版,持续更新)。本书特色:系统全面(涵盖前端核心技术点),简洁明了,针对性强(专为面试场景设计)。欢迎在github上留言,反馈vue的问题。你用过Vuex吗?Vuex是专门为Vue.js应用程序开发的状态管理模式。每个Vuex应用程序的核心都是商店。“商店”基本上是一个容器,其中包含应用程序的大部分状态(state)。(1)Vuex的状态存储是响应式的。当Vue组件从store中读取状态时,如果store中的状态发生变化,相应的组件将相应地高效更新。(2)改变store中状态的唯一方法是显式提交(commit)突变。这使我们能够轻松跟踪每个状态更改。主要包括以下几个模块:State:定义了应用状态的数据结构,可以设置默认的初始状态。Getter:允许组件从Store中获取数据。mapGetters辅助函数只是将存储中的getter映射到本地计算属性。Mutation:是改变store中状态的唯一方法,并且必须是一个同步函数。动作:它用于提交突变而不是直接改变状态,并且可以包含任何异步操作。Module:允许将单个Store拆分为多个store,同时存储在单个statetree中。Vue组件之间有哪些通信方式?Vue组件之间的通信是面试中经常考到的知识点之一。这个问题有点类似于开放式问题。你回答的方法越多,你得到的分数就越多,这表明你对Vue.js的熟练程度更高。Vue组件之间的通信仅指以下三种通信:父子组件通信、代际组件通信、兄弟组件通信。下面我们将分别介绍每种通信方式,并说明该方式适用于哪些类型的组件通信。(1)props/$emit适用于父子组件通信。这种方法是Vue组件的基础。相信大部分同学都听过,这里就不举例了。(2)ref和$parent/$children适用于父子组件通信ref:如果用在普通DOM元素上,则引用指向DOM元素;如果用在子组件上,则引用指向组件实例$parent/$children:访问parent/childinstance(3)EventBus($emit/$on)适用于父子、代际、兄弟组件通信这个方法使用一个空的Vue实例作为中央事件总线(eventcenter),用于触发事件和监听事件以实现任何组件之间的通信,包括父子组件、代际组件和兄弟组件。(4)$attrs/$listeners适用于代际组件通信$attrs:包含父作用域中prop无法识别(获取)的特性绑定(类和样式除外)。当一个组件没有声明任何props时,所有的父作用域绑定(除了class和style)都会被包含在这里,内部组件可以通过v-bind="$attrs"传递。通常与inheritAttrs选项结合使用。$listeners:包含父作用域中的v-on事件监听器(没有.native装饰器)。它可以将v-on="$listeners"传递给内部组件(5)provide/inject适用于代际组件通信。在祖先组件中通过provider提供变量,然后在后代组件中通过inject注入变量。provide/injectAPI主要解决跨层组件之间的通信问题,但其使用场景主要是子组件获取上层组件的状态,跨层之间建立主动提供和依赖注入的关系级组件。(6)Vuex适用于父子、代际、兄弟组件通信。Vuex是专门为Vue.js应用开发的状态管理模型。每个Vuex应用程序的核心都是商店。“商店”基本上是一个容器,其中包含应用程序的大部分状态(state)。Vuex的状态存储是响应式的。当Vue组件从store中读取状态时,如果store中的状态发生变化,相应的组件将相应地高效更新。更改存储中状态的唯一方法是显式提交更改。这使我们能够轻松跟踪每个状态更改。说说你对keep-alive的理解?keep-alive是Vue的一个内置组件,可以保持被包含组件的状态,避免重新渲染。它具有以下特点:一般与路由、动态组件配合使用,对组件进行缓存;它提供了include和exclude属性,都支持字符串或者正则表达式,include表示只缓存名称匹配的组件,exclude表示不缓存任何名称匹配的组件,exclude的优先级高于include;对应activated和deactivated这两个钩子函数,当组件被激活时,会触发钩子函数activated,当组件被移除时,会触发钩子函数deactivated。直接给数组项赋值,Vue能检测到变化吗?由于JavaScript的限制,Vue无法检测到以下数组变化:当您直接使用索引设置数组项时,例如:vm.items[indexOfItem]=newValue当您修改数组的长度时,例如:vm.items.length=newLength为了解决第一个问题,Vue提供了如下操作方法://Vue.setVue.set(vm.items,indexOfItem,newValue)//vm.$set,Vue.setvm的别名。$set(vm.items,indexOfItem,newValue)//Array.prototype.splicevm.items.splice(indexOfItem,1,newValue)复制代码为了解决第二个问题,Vue提供了如下操作方法://Array.prototype。拼接。items.splice(newLength)Vue框架是如何实现对象和数组的监听的?如果问Vue是如何实现双向数据绑定的,大家肯定会回答是通过Object.defineProperty()来劫持数据,但是Object.defineProperty()只能劫持属性的数据,并不能劫持整个对象.同样道理Arrays不能被劫持,但是我们都知道Vue在使用Vue框架的时候可以检测到对象和数组的变化(一些方法的操作),那么它是如何实现的呢?我们查看相关代码如下:/***观察一个数组项列表。*/observeArray(items:Array){for(leti=0,l=items.length;i