Vue 常见面试题

资讯 2024-06-24 阅读:43 评论:0
1、MVVM是什么?MVVM 与 MVC 的区别?它和其他框架(jquery)的区别是什么?哪些场景适合使用?MVVM 是 Model-View-ViewModel 的缩写。Model(模型层)代表数据模型,也可以在Model中定义数据修改...


1、MVVM是什么?MVVM 与 MVC 的区别?它和其他框架(jquery)的区别是什么?哪些场景适合使用?

MVVM 是 Model-View-ViewModel 的缩写。

Model(模型层)代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。(axios data vuex(state))

View (视图层)代表UI组件,它负责将数据模型转化成UI展现出来。(template < /template>)

ViewModel 监听模型数据的改变和控制视图行为、处理用户交互,简单理解就是一个同步View 和 Model的对象,连接Model和View。(viewmodel是双向绑定实现的机制)

?

MVVM 与 MVC 的区别:

MVC 模型视图控制器,视图是可以直接访问模型,所以,视图里面会包含模型信息,mvc 关注的是模型不变,所以,在 mvc 中,模型不依赖视图,但是视图依赖模型。

MVVM 模型 视图和 VM,VM 是作为模型和视图的桥梁,当模型层数据改变,VM 会检测到并通知视图层进行相应的修改。

它和其他框架区别:MVVM 是通过数据来显示视图;jquery 是通过节点来操作的。

适用场景:适用于数据操作比较多的场景。

?

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

?

2、vue 与 angular 的区别?vue 与 react 的区别,使用场景分别是什么?vue 的优点和缺点?vue 全家桶开发?什么是 vue 渐进式开发?

1、与AngularJS的区别

相同点:都支持指令:内置指令和自定义指令;都支持过滤器:内置过滤器和自定义过滤器;都支持双向数据绑定;都不支持低端浏览器。

不同点:AngularJS的学习成本高,比如增加了Dependency Injection特性,而Vue.js本身提供的API都比较简单、直观;在性能上,AngularJS依赖对数据做脏检查,所以Watcher越多越慢;Vue.js使用基于依赖追踪的观察并且使用异步队列更新,所有的数据都是独立触发的。

2、与React的区别

相同点: 都有自己的脚手架工具;支持项目工程化;都是数据驱动视图的框架; 中心思想相同:一切都是组件,组件实例之间可以嵌套;都提供合理的钩子函数,可以让开发者定制化地去处理需求;都不内置列数AJAX,Route等功能到核心包,而是以插件的方式加载;在组件开发中都支持mixins的特性。

不同点: React 采用的 Virtual DOM 会对渲染出来的结果做脏检查。 Vue.js在模板中提供了指令,过滤器等,可以非常方便,快捷地操作 DOM。 React:数据单向流,语法-jsx,在 React 中需要使用 setState() 方法去更新状态。 Vue:数据双向绑定,语法-HTML,state 对象并不是必须的,数据由 data 属性在 Vue 对象中进行管理。

?

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

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

?

vue 全家桶开发:指的是:vue-router,vuex, vue-resource

渐进式:引入 vue.js 部分功能,逐渐取代之前的原生js、jquery。

?

3、什么是虚拟DOM?为什么使用虚拟DOM?虚拟DOM的优缺点?vue怎么操作dom?vue2.x 和 vue3.x 渲染器的 diff 算法分别说一下

什么是虚拟DOM:

用 js 模拟一颗 dom 树,放在浏览器内存中,当你要变更时,虚拟 dom 使用 diff ?算法进行新旧虚拟 dom 的比较,将变更放到变更队列中,反应到实际的dom树,减少了dom操作。 虚拟 DOM 将 DOM 树转换成一个 JS 对象树,diff 算法逐层比较、删除、添加操作;但是,如果有多个相同的元素,可能会浪费性能,所以,react 和 vue-for 引入 key 值进行区分。(让我们不用直接操作DOM元素,只操作数据便可以重新渲染页面)

?

为什么使用虚拟DOM

?1、手动操作DOM比较麻烦,还需要考虑浏览器兼容性问题,虽然有jQuery等库简化DOM操作,但是随着项目的复杂DOM操作复杂提升

?2、为了简化DOM的复杂操作于是出现了各种MVVM框架,MVVM框架解决了视图和状态的同步问题

3、为了简化视图的操作我们可以使用模板引擎,但是模板引擎没有解决跟踪状态变化的问题,于是Virtual DOM出现了. Vitual DOM的好处是当状态改变时不需要立即更新DOM,只需要创建一个虚拟树来描述DOM, Virtual DOM内部将弄清楚如何有效(if)的更新DOM

?

优点:

1、维护视图和状态的关系

2、复杂视图情况下提升渲染性能 3、除了渲染DOM以外,还可以实现SSR(Nuxt.js/Next.js)、 原生应用(Weex/React Native)、 小程序(mpvue/uni-app)等

4、虚拟DOM具有批处理和高效的Diff算法,最终表现在DOM上的修改只是变更的部分,可以保证非常高效的渲染,优化性能.

?

缺点:

首次渲染大量DOM时,由于多了一层虚拟DOM的计算,会比innerHTML插入慢。

?

vue怎么操作dom 设置:ref=’name’ 使用:this.$refs.name

?

diff 算法

diff算法比较新旧虚拟 dom 的过程:

如果节点类型相同,则比较数据,修改数据;

如果节点不同,直接干掉节点及所有子节点,插入新的节点;

如果给每个节点都设置了唯一的key,就可以准确的找到需要改变的内容,否则就会出现修改一个地方导致其他地方都改变的情况。

比如A-B-C-D, 我要插入新节点A-B-M-C-D,实际上改变的了C和D。但是设置了key,就可以准确的找到B C并插入

正常diff两个树的时间复杂度是0(n^3),但实际情况下我们很少会进行跨层级的移动DOM,所以vue将Diff进行了优化,从o(n^3)->0(n),只有当新旧 children都为多个子节点时才需要用核心的diff算法进行同层级比较。

Vue2的核心diff算法采用了双端比较的算法,同时从新旧 children的两端开始进行比较,借助key值找到可复用的节点,再进行相关操作。相比React的diff算法,同样情况下可以减少移动节点次数,减少不必要的性能损耗,更加的优雅。

Vue3.x借鉴了算法 ivi和 inferno算法 在创建VNode时就确定其类型,以及在 mount/ patch的过程中采用位运算来判断一个VNode的类型,在这个基础之上再配合核心的diff算法,使得性能上较Vue2.x有了提升。(实际的实现可以结合vue3x源码看。)

虚拟dom的作用:虚拟dom是为了解决浏览器性能问题而被设计出来的;当操作数据时,将改变的dom元素缓存起来,都计算完后再通过比较映射到真实的dom树上

?

4、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:在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。

什么是 vue 生命周期?

Vue 实例从创建到销毁的过程,就是生命周期。从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、销毁等一系列过程,称之为 Vue 的生命周期。

vue 生命周期的作用是什么?

它的生命周期中有多个事件钩子,让我们在控制整个 Vue 实例的过程时更容易形成好的逻辑。

vue 生命周期总共有几个阶段?

它可以总共分为8个阶段:创建前/后, 载入前/后,更新前/后,销毁前/销毁后。

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

?会触发这几个钩子: beforeCreate、created、beforeMount 和 mounted 。

DOM 渲染在哪个周期中就已经完成? DOM 渲染在 mounted 中就已经完成了。

?

vue 中生命周期钩子函数有哪些,请写出语法

?创建前beforeCreate 创建后created、挂载前beforeMount 挂载后mounted、更新前beforeUpdate 更新后updated、销毁前beforeDestroy 销毁后destroyed、激活activated 未激活deactivated 未激活是啥

什么时候触发激活和未激活生命周期钩子函数

当页面或者组件被缓存则激活 activated,未激活 deactivated 会取代创建和销毁

挂载和创建之间的区别

创建之后只可以访问数据不可以操作dom 挂载之后可以访问数据可以操作dom

?

5、Vue的模板编译原理,如何编译 template 模板?

vue模板的编译过程分为3个阶段:

?第一步是将 模板字符串 转换成 element ASTs(解析器) 解析将模板字符串解析生成AST,生成的AST元素节点总共有3种类型,1为普通元素,2为表达式,3为纯文本

第二步是对 AST 进行静态节点标记,主要用来做虚拟DOM的渲染优化(优化器) vue模板中井不是所有数据都是响应式的,有很多数据是首次染后就永远不会变化的,那么这部分数据生成的DOM也不会变化,我们可以在 patch的过程跳过对他们的比对 此阶段会深度遍历生成的AST树,检测它的每一颗子树是不是静态节点,如果是静态节点则它们生成DOM永远不需要改变,这对运行时对模板的更新起到极大的优化作用。

第三步是使用 element ASTs 生成 render 函数代码字符串(代码生成器) 生成代码:const code=generate(ast, options );通过 generate 方法,将 ast 生成 render 函数

?

6、批量异步更新策略、nextTick 原理及 vue.nextTick 有什么作用?

(1)批量异步策略 Vue 在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。

(2)nextTick 在下次DOM更新循环结束后执行延迟回调,在修改数据之后立即使用 nextTick 来获取更新后的DOM。 数据更新是一个异步操作异步 dom,更新后使用 vue.nextTick 可以立即得到更新后的数据

nextTick 对于 microtask 的实现,会先检测是否支持 Promise,不支持的话,直接指向 macrotask,而 macrotask的实现,优先检测是否支持 setTinmediat。(高版本IE和 Etage支持),不支持的再去检测是否支持 MessageChannel,如果仍不支持,最终降级为 setTimeout 0;默认的情况,会先以 microtask 方式执行,因为 microtask 可以在一次 tick 中全部执行完毕,在一些有重绘和动画的场景有更好的性能。

但是由于 microtask 优先级较高,在某些情况下,可能会在事件冒泡过程中触发,导致一些问题,所以有些地方会强制使用 macrotask(如v-on)。

?注意:之所以将 nextTick 的回调函数放入到数组中一次性执行,而不是直接在 nextTick 中执行回调函数,是为了保证在同一个 tick 内多次执行了 nextTick,不会开启多个异步任务,而是把这些异步任务都压成一个同步任务,在下一个tick内执行完毕。

?

7、数据渲染有几种方式,有什么区别?v-html 会导致什么问题

插值表达式:{{}} 只会替换自己的这个占位符,不会把整个元素的内容清空

v-html:只有v-html可以渲染HTML代码,会覆盖元素中原本的内容(相当于原生js中的innerHTML) 在网站上动态渲染任意HTML,很容易导致XSS攻击。所以只能在可信内容上使用v-html,且永远不能用于用户提交的内容上。

v-text:完整地输出内容而不会转换标签

闪烁:使用插值表达式 {{}},会造成界面闪烁。

解决方式:

使用 v-text

使用 v-cloak 指令,v-cloak 指令和 css 规则如 [v-cloak]{display:none} 一起用

8、v-if 和 v-show 有什么区别,切换时组件触发哪些什么周期钩子函数?适用于哪些场景?

区别:

?v-if 控制的是 dom 的销毁和创建

v-show 只是控制 dom 的css中 display属性

?

触发的生命周期:

?v-if 显示、创建、挂载、隐藏和销毁

?v-show 显示隐藏不触发生命周期钩子函数

使用场景:

?v-if 切换的开销更大,而 v-show 初始化渲染开销更大,在需要频繁切换或者切换的部分 dom 很复杂时,使用 v-show 更合适;渲染后很少切换的则使用 v-if 更合适。

?

9、v-if 和 v-for 为什么不建议混合使用?

原因:被渲染的 dom 会重复一个创建销毁的过程

解决方法:

使用计算属性 过滤数据

?computed:{? showList:function(){? return this.list.filter(var,index)=>{? return var.isshow? }? } }

当 v-for 和 v-if 处于同一个节点时,v-for的优先级比v-if更高,这意味着v-if将分别重复运行于每个v-for循环中,如果要遍历的数组很大,而真正要展示的数据很少时,这将造成很大的性能浪费。这种场景建议使用 computed,先对数据进行过滤。

?

10、key 主要是解决哪一类的问题(作用),为什么不建议用索引 index(重绘)

(1)key 的作用主要是为了高效的更新虚拟 DOM

(2)当以 index 为 key 值时,如果数组长度发生变化,会导致 key 的变化,比如删除其中某一项,那么 index 会相应变化。 所以用 index作为key和不加index没有什么区别,都不能提升性能。一般用每项数据的唯一值来作为key,就算数组长度变化,也不会影响到这个key

?

11、v-on 可以监听多个方法吗?怎么实现?

可以一次性绑定多个事件,写在对象中即可。

实现:

<button v-on="{mouseenter:onEnter, mouseleave:onLeave">鼠标进来1</button>

<button @mouseenter="onEnter", @mouseleave="onLeave">鼠标进来2</button>


一个事件绑定多个函数,按顺序执行,这里的分隔函数可以用逗号也可以用分号

<button @click="a(), b()">点我ab</button>

<button @click="one()">点我one</button>

?

12、vue 实现双向数据绑定的原理是什么?你用过哪些 v-model 修饰符?

当一个vue实例创建后vue会遍历data选项的属性,用object.definproperty将它转化为getter或者setter,并且内部追踪相关依赖,在属性访问和修改时通知变化每一个组件实例化都有相应的watcher程序实例,他会在组件渲染的过程中把属性记录为依赖,之后当依赖项的setter被调用时会通知watcher重新计算,从而使得它相关的组件的以更新

Vue实现数据双向绑定的原理:Object.defineProperty()

vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调。当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。

vue的数据双向绑定 将MVVM作为数据绑定的入口,整合Observer,Compile和Watcher三者,通过Observer来监听自己的model的数据变化,通过Compile来解析编译模板指令(vue中是用来解析 {{}}),最终利用watcher搭起observer和Compile之间的通信桥梁,达到数据变化 —>视图更新;视图交互变化(input)—>数据model变更双向绑定效果。

?

修饰符:

.lazy文本框失去焦点后在更新数据 ?

.trim清除前后空格的 ?

.number从字符中获取数字

?

v-model 是如何实现双向绑定的?

vue2.0:v-model是用来在表单控件或者组件上创建双向绑定的,他的本质是v-bind和v-on的语法糖,在个组件上使用v-mode1,默认会为组件绑定名为 value的prop和名为 input的事件。

?Vue3.0:在3X中,自定义组件上的v-mode1相当于传递了 modelValueprop并接收抛出的update: modelValue事件

?

13、计算属性和实例方法有什么区别、computed 和 watch 有什么区别? 什么是 vue 的计算属性,computed 是如何实现的?vue 怎么监听数据的变化,怎么监听一个对象属性的变化?

计算属性和实例方法有什么区别(computed,methods )

实例方法指的是对象能调用的函数,对象里所有可以调用的函数全叫实例方法。

答:计算属性有缓存,实例方法没有缓存 计算属性调用时 total 不可以传参 实例方法调用时 total()可以传参

?

computed 和 watch 的区别:

computed?1、computed是计算属性,也就是依赖某个值或者props通过计算得来得数据;? 2、 computed的值是在getter执行之后进行缓存的,只有在它依赖的数据发生变化,会重新调用getter来计算;? 3、 不支持异步,当computed内有异步操作时无效,无法监听数据的变化;

watch 1、watch是监听器,可以监听某一个数据,然后执行相应的操作; 2、不支持缓存,数据变直接会触发相应的操作; 3、监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值; 4、支持异步操作;

?

什么时候用computed 什么时候用watch 比较合适?

当多个属性影响一个属性的时候,建议用computed(computed适合在模板渲染中,某个值是依赖了其他的响应式对象甚至是计算属性计算而来)

当一个值发生变化之后,会引起一系列的操作,这种情况就适合用watch(watch适合监听某个值的变化去完成一段复杂的业务逻辑)

?

vue 的计算属性:

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

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

?

computed 的实现:

流程总结如下:

1、当组件初始化的时候, computed和data会分别建立各自的响应系统, Observer遍历data中每个属性设置get/set数据拦截

2、初始化 computed会调用 initComputed 函数

2.1、注册一个 watcher实例,并在内实例化一个Dep消息订阅器用作后续收集依赖(比如渲染函数的 watcher或者其他观察该计算属性变化的watcher) 2.2、调用计算属性时会触发其 Object.defimeProperty的get访问器函数

2.3、调用 watcher.depend()方法向自身的消息订间器dep的subs中添加其他属性的watcher

2.4、调用 watcher的 evaluate方法(进而调用 watcher的get方法)让自身成为其他watcher的消息订阅器的订阅者,首先将watcher赋给dep.target,然后执行 getter求值函数,当访问求值函数里面的属性(比如来自data、prope或其他 computed)时,会同样触发它们的get访问器函数从而将该计算属性的 watcher添加到求值函数中属性的watcher的消息订阅器dep中,当这些操作完成,最后关闭dep.target赋为 null 并返回求值函数结果

3、当某个属性发生变化,触发set拦截函数,然后调用自身消息订阅器dep的 notify方法,遍历当前dep中保存着所有订阅者 wather的subs数组,并逐个调用 watcher的 update方法,完成响应更新

vue 怎么监听数据的变化,怎么监听一个对象属性的变化

用 watch 监听数据的变化 监听对象属性,先在 computed 中声明中间件: computed:{? newage:function(){? return this.person.age? } } watch:{?num:function(newdata,olddata){? console.log(newdata,olddata)? },? newage:function(){? console.log("生日快乐!")? } }

?14、vue 的父组件和子组件生命周期钩子执行顺序是什么?

渲染过程

?父组件挂载完成一定是等子组件都挂载完成后,才算是父组件挂载完,所以父组件的 mounted在子组件 mouted之后

父beforeCreate → 父created → 父beforeMount → 子beforeCreate → 子created →子 beforeMount →子mounted->父 mounted

子组件更新过程:

?1.影响到父组件:父 beforeUpdate→>子 beforeUpdate->子 updated->父 updated

2.不影响父组件:子 beforeUpdate>子 updated

父组件更新过程:

?1.影响到子组件:父 beforeUpdate→>子 beforeUpdate->子 updated->父 updated

2.不影响子组件:父 beforeUpdate→>父 updated

销毁过程:

父 beforeDestroy → 子 beforeDestroy → 子 destroyed → 父 destroyed

不管是哪种情况,都一定是父组件等待子组件完成后,才会执行自己对应完成的钩子。

?

15、Vue2.0 组件通信方式有哪些? vue 父子组件怎样实现通讯?vue 组件的参数传递,vue 中子组件调用父组件的方法?vue 中怎么实现组件之间的嵌套?

1、父子组件通信

?props 和 event、v-model、.sync、ref、$parent 和 $children、$emit

2、 非父子组件

$attr 和 $listeners 、provide 和 inject、eventBus、通过实例 $root 访问、vuex、dispath 和 brodcast

实现通讯:

?父传子:父组件:<mydiv:list='list'> </mydiv>? 子组件:props[‘list’]

子传父:子组件:this.$emit(‘子组件事件名’,参数) 父组件:<mydiv @子组件事件名=‘父组件事件名’>

?

参数传递:

1、父组件与子组件传值

父组件传给子组件:子组件通过props方法接受数据;

子组件传给父组件:$emit方法传递参数

2、非父子组件间的数据传递,兄弟组件传值 eventBus,

就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。兄弟组件可以父传子 子传父;Vuex也可以实现数据共享 项目比较小时,用这个比较合适。(虽然也有不少人推荐直接用VUEX,具体来说看需求咯。技术只是手段,目的达到才是王道。)

?

子组件调父组件的方法:

第一种方法是直接在子组件中通过 this.$parent.event 来调用父组件的方法

第二种方法是在子组件里用 $emit 向父组件触发一个事件,父组件监听这个事件。

第三种是父组件把方法传入子组件中,在子组件里直接调用这个方法

?

16、怎样使用 props 限定传递的数据,有哪些属性?非 props 属性有什么特点?如何解决 props 层级过深的问题?

props 限定传递的数据

type //限定传递的数据类型

?Required:true false //是否必传

?Default:false //指定默认值

Validator:function(){ //自定义规则 }

非 props 属性的特点:

①会显示在解析之后的标签上 ②子组件不能使用该属性

?

解决props层级过深:

(1)使用vuex

(2)传递数据,使用以下接收(均不含被props接收的数据) this.$attrs 接收属性 this.$listeners 接收事件(不含被 .native 修饰符的事件)

组件之间的嵌套:组件之间的嵌套使用,可以借助插槽,让插槽接受子组件中的内容

?

17、如果子组件直接修改父组件的值会发生什么?怎么解决,要修改多个数据怎么办?解释 VUE 中单向数据流的概念?

如果修改的不是引用类型的值时会报错,告诉我们不能直接修改父组件的值。

?(1)可以使用.sync修饰符来修改值,对一个 prop 进行“双向绑定”。(注意.sync 修饰符的 v-bind 不能和表达式一起使用)

?(2)父组件将改变值的方法传递给子组件

单向数据流的概念: 子组件不可以直接修改父组件传过来的参数,如果直接修改会报错,只能声明成自己的才可以修改

?

18、怎样声明全局组件,怎样使用全局组件?怎样声明局部组件,怎样使用局部组件?

声明全局组件: vue.component(‘myheader’,{ Template:<div>全局组件</div> })

使用全局组件: <myheader></myheader>

声明局部: 声明成 ***.vue文件中模板在中。

使用局部组件:

?Js模块化导出 <script></script>

css定义 <style scoped></style>

?import 引入,注册 components 调用

?19、多个组件之间如何拆分各自的 state,每块小的组件有自己的状态,它们之间还有一些公共的状态需要维护,如何思考这块?

(1)公共的数据部分可以提升至和他们最近的父组件,由父组件派发

(2)公共数据可以放到vuex中统一管理,各组件分别获取

?

20、vue 中如何编写可复用的组件?

(1)以组件功能命名

(2)只负责ui的展示和交互动画,不要在组件里与服务器打交道(获取异步数据等)

(3)可复用组件不会因组件使用的位置、场景而变化。尽量减少对外部条件的依赖。

?

21、vue 组件中的 data 为什么必须是一个函数?vue中组件 data 为什么是 return ー个对象的函数,而不是直接是个对象?

函数:

对象为引用类型,当重用组件时,由于数据对象都指向同一个data对象,当在一个组件中修改data时,其他重用的组件中的data会同时被修改;而使用返回对象的函数,由于每次返回的都是一个新对象(Object的实例),引用地址不同,则不会出现这个问题。

对象:

当data定义为对象后,这就表示所有的组件实例共用了一份data数据,因此,无论在哪个组件实例中修改了data,都会影响到所有的组件实例。组件中的data写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据;而单纯的写成对象形式,就使得所有组件实例共用了一份data,就会造成一个变了全都会变的结果。

?

22、什么是插槽,怎么使用,什么是具名插槽,如何使用?什么是作用域插槽?

插槽,也就是slot,是组件的一块 HTML 模板,这块模板显示不显示、以及怎样显示由父组件来决定。

?由于插槽是一块模板,所以,对于任何一个组件,从模板种类的角度来分,其实都可以分为非插槽模板和插槽模板两大类。 非插槽模板指的是 html 模板,比如‘div、span、ul、table’这些;非插槽模板的显示与隐藏以及怎样显示由组件自身控制;插槽模板是 slot,它是一个空壳子,因为它的显示与隐藏以及最后用什么样的html模板显示由父组件控制;但是插槽显示的位置却由子组件自身决定,slot 写在组件 template 的什么位置,父组件传过来的模板将来就显示在什么位置。

目的:内容不确定,以后谁来调用记得填

设计思路:子组件定义插槽,父组件提供内容去填补插槽

单个插槽 | 默认插槽 | 匿名插槽

单个插槽是 vue 的官方叫法,但是其实也可以叫它默认插槽,或者与具名插槽相对,我们可以叫它匿名插槽。因为它不用设置name属性。

?单个插槽可以放置在组件的任意位置,但是就像它的名字一样,一个组件中只能有一个该类插槽。相对应的,具名插槽就可以有很多个,只要名字(name属性)不同就可以了。

使用:

父组件:在 <template></template> ?里面任意写入 HTML 代码

子组件:在需要展示的位置放置? 即可展示

?

具名插槽

匿名插槽没有 name 属性,所以是匿名插槽,那么,插槽加了 name 属性,就变成了具名插槽。

具名插槽可以在一个组件中出现 N 次,出现在不同的位置。

?

作用域插槽 | 带数据的插槽

官方叫它作用域插槽,实际上,对比前面两种插槽,我们可以叫它带数据的插槽。什么意思呢,就是前面两种,都是在组件的template里面写;但是作用域插槽要求,在slot上面绑定数据。 插槽获取子组件的数据 需要属性传递 结合作用域插槽语法,代码如下 设置:Slot-scope=‘自定义名字’ 使用: 自定义名字 {{scope}}

?

作用域插槽跟单个插槽和具名插槽的区别:

因为单个插槽和具名插槽不绑定数据,所以父组件提供的模板一般要既包括样式又包括内容,而作用域插槽,父组件只需要提供一套样式(在确实用作用域插槽绑定的数据的前提下)。

?

23、对 keep-alive 的了解?keep-alive 组件有什么作用?keep-alive 组件有哪些属性?

理解:每次切换界面组件都会重新初始化,离开页面就会集体销毁;keep-alive是用来保活,相当于缓存,即使你离开页面,组件也不销毁

keep-alive本身注册了全局,而且不参与离开销毁等生命周期,组件写在他的里面,自然不受外界影响;正常切换组件的时候,都会通知子组件,生命周期结束了,然后每个组件都冒泡调用销毁;而keep-alive组件直接就不执行销毁,也不通知子组件销毁,下次进入组件还可以组件复用

keep-alive是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。

在vue 2.1.0 版本之后,keep-alive新加入了两个属性: include(包含的组件缓存) 与 exclude(排除的组件不缓存,优先级大于include) 。

?

使用方法:?



<keep-alive include='include_components' exclude='exclude_components'>
<component>

<!-- 该组件是否缓存取决于include和exclude属性 -->

</component>
</keep-alive>


  

参数解释:

?include - 字符串或正则表达式,只有名称匹配的组件会被缓存

?exclude - 字符串或正则表达式,任何名称匹配的组件都不会被缓存 include 和 exclude 的属性允许组件有条件地缓存。二者都可以用“,”分隔字符串、正则表达式、数组。当使用正则或者是数组时,要记得使用 v-bind 。

作用:缓存组件缓存页面(router-view)

属性:include 声明需要被缓存的组件页面 exclude 声明不需要被缓存的组件页面

使用场景:商品分类页面(每次进入会发ajax,这根本没有必要,直接保活keep-alive就相当于缓存,保持活着的状态,避免反复的销毁创建)等等

?

24、如何自定义事件?你知道哪些事件修饰符?什么是 vue 全局事件解绑?

自定义事件:

每个Vue创建的实例都会出现一个事件接口:var vm=new Vue({el: '#app'})

自定义事件的定义(发布):vm.$on(自定义事件的名称,自定义事件的事件处理程序) vm.$on( 'aa', function () {console.log( 'aa' )})

自定义事件的触发 ( 订阅 ):vm.$emit( 自定义事件的名称,自定义事件处理程序需要的参数1,参数2,参数3) vm.$emit( 'aa' )

?

事件修饰符:

.stop 阻止事件冒泡 ?.once 只执行一次,一次性事件 ?.self 阻止事件冒泡和事件捕获

.captrue 事件捕获阶段触发 .prevent 阻止浏览器默认行为 .native 触发原生事件

?

vue 全局事件解绑:

在vue中,写在 methods 里面的方法,在页面切换时一般就自动销毁了,但是写在 window 上的事件,需要我们手动解绑,这也是为了提高代码执行效率,使用生命周期函数 destroy,在页面离开时执行解绑。

(例子看文件)

?

?

25、vue中常用的指令有哪些?vue 中如何自定义指令(全局和局部)?自定义指令接受哪些生命钩子函数?

vue中常用的指令:

V-text:主要用来更新textContent,可以等同于JS的text属性

V-html:双大括号的方式会将数据解释为纯文本,而非HTML。为了输出真正的HTML,可以用v-html指令。它等同于JS的innerHtml属性。

V-show:用于根据条件展示元素。

V-if:可以实现条件渲染,Vue会根据表达式的值的真假条件来渲染元素。 V-else-if:充当v-if的else-if块,可以链式的使用多次。可以更加方便的实现switch语句。

V-else:是搭配v-if使用的,它必须紧跟在v-if或者v-else-if后面,否则不起作用。

V-on:主要用来监听dom事件,以便执行一些代码块。表达式可以是一个方法名。

V-bind:用来动态的绑定一个或者多个特性。没有参数时,可以绑定到一个包含键值对的对象。常用于动态绑定class和style。以及href等。

v-for:用v-for指令根据遍历数组来进行渲染

V-model:这个指令用于在表单上创建双向数据绑定

V-slot

V-pre:主要用来跳过这个元素和它的子元素编译过程。可以用来显示原始的Mustache标签。跳过大量没有指令的节点加快编译。

V-cloak:这个指令是用来保持在元素上直到关联实例结束时进行编译。

V-once:v-once关联的实例,只会渲染一次。之后的重新渲染,实例极其所有的子节点将被视为静态内容跳过,这可以用于优化更新性能。

?

自定义全局指令:

Vue.directive('color', function(obj,arg){? //obj,第一个参数,指令调用位置的 dom 对象? //arg,指令对象,和指令相关的信息? obj.style.backgroundColor=arg.value })

自定义局部指令:

directive: {? color: function(obj,arg){? //obj,第一个参数,指令调用位置的 dom 对象? //arg,指令对象,和指令相关的信息? obj.style.backgroundColor=arg.value? } }

生命钩子函数:



directive: {
color: {
  bind: function(){ // 指令绑定给 dom 元素时触发 console.log('bind') },
  inserted: function(){ // 虚拟 dom 插入时触发 console.log('inserted') },
  update: function(){ // 传参更新时触发 console.log('update') },
  unbind: function(){ // 指令解除绑定时触发 console.log('unbind') } }
}


?

?

26、如何声明一个过滤器(全局和局部)?你常用的自定义过滤器有哪些?

过滤器:用于一些常见的文本格式化。

全局过滤器:

?vue.filter(‘gettime’,function(date){?

Var time=new date(date)?

return time.getFullyear()+’/’+time.getMonth()+1’/’+getDate() }

)

局部过滤器:

?Filters:{? Gettime(date){

? Var time=new date(date)? Return time.getFullyear()+’/’+time.getMonth()+1’/’+getDate()? }

?}

常用的自定义过滤器:

(1) 去除空格、(2)时间转换、(3)大小写转换、(4)字符串替换、

(5)金额字符转金额/数字转金额字符、(6)保留两位小数、(7)判断字符串长度并省略

根据自己常用的来说。

?27、完整的 vue-router 导航解析流程

(1)导航被触发。

(2)在失活的组件里调用离开守卫。

(3)调用全局的 beforeEach 守卫。

(4)在重用的组件里调用 beforeRouteUpdate 守卫

(5)在路由配置里调用 beforeEnter。

(6)解析异步路由组件。

(7)在被激活的组件里调用 beforeRouteEnter。

(8)调用全局的 beforeResolve 守卫

(9)导航被确认。

(10)调用全局的 afterEach 钩子。

(11)触发 DOM 更新。

(12)用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。

?

28、vue 路由的钩子函数

vue-router一共给我们提供了三大类钩子函数来实现路由守卫:

?1、全局钩子函数(beforeEach、afterEach)

?2、路由独享的钩子函数(beforeEnter)

?3、组件内钩子函数(beforeRouterEnter、beforeRouterUpdate、beforeRouterLeave)

?

29、vue-router路由的两种模式?如何实现?有什么区别?如何定义 vue-router 的动态路由? 怎么获取传过来的值?

vue-router中默认使用的是hash模式

(1)hash模式

?http://localhost:8080/#/pageA?? hash 的值为 #/pageA

?在浏览器中符号“#”,# 以及 # 后面的字符称之为hash,用window.location.hash读取。

?改变hash,浏览器本身不会有任何请求服务器动作的,但是页面状态和url已经关联起来了。

后面hash值的变化,不会导致浏览器向服务器发出请求,浏览器不发出请求,就不会刷新页面;同时通过监听 hashchange事件可以知道hash发生了哪些变化,然后根据hash变化来实现更新页面部分内容的操作。

特点:

hash虽然在URL中,但不被包括在HTTP请求中;用来指导浏览器动作,对服务端安全无用,hash不会重加载页面。

hash 模式下,仅 hash 符号之前的内容会被包含在请求中,如 http://www.xxx.com,因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回 404 错误。

?

(2)history模式

?http://localhost:8080/ 正常的路径,并没有#

history模式的实现,主要是HTML5标准发布的两个API, pushState和replaceState,这两个API可以改变url,但是不会发送请求。这样就可以监听url变化来实现更新页面部分内容的操作。

?history采用HTML5的新特性;且提供了两个新方法:pushState(),replaceState()可以对浏览器历史记录栈进行修改,以及popState事件的监听到状态变更。

?history 模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致,如:http://www.xxx.com/items/id。后端如果缺少对 /items/id 的路由处理,将返回 404 错误。

?

区别:

(1 )在 url 显示: hash 有 # ; history 无 # 对 seo 比较友好

(2)刷新页面时: hash 可以加载到hash值对应页面; history 没有处理的话,会返回404,一般需要后端将所有页面都配置重定向到首页路由

(3 )兼容性: hash 支持低版本浏览器和IE浏览器 ; history (HTML5新推出的API)不支持ie低版本

?

定义:在 router 目录下的 index.js 文件中,对 path 属性加上 /,后面是跳转的地址

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

?

30、路由显示区域和路由跳转分别是哪个组件?$route 和 $router 有什么区别? 路由懒加载怎么实现,有什么意义?

显示:router-view ?跳转 router-link

?

$route 和 $router 的区别:

$route是路由信息对象”,包括path, params, hash, query, matched, name 等路由信息参数。

$router是“路由实例"对象包括了路由的跳转方法,钩子函数等

?

路由懒加载的实现:let Addclass=resolve=>require([' @/views/ Addclass' ] ,resolve )

?路由懒加载的意义:为给客户更好的客户体验,首屏组件加载速度更快一些,解决白屏问题。

?

31、vue-router的几种实例方法以及参数传递?

vue-router传递参数分为两大类:

(1)编程式的导航 router.push

(2)声明式的导航 <router-link></router-link>

?

传递参数的方式:

编程式导航传递参数有两种类型:字符串、对象。

声明式的导航和编程式的导航传递参数的方式一样

路由传递参数和传统传递参数是一样的,命名路由类似表单提交而查询就是url传递,(在vue项目中基本上掌握了这两种传递参数就能应付大部分应用了)

?

总结:

?1.命名路由搭配params,刷新页面参数会丢失

2.查询参数搭配query,刷新页面数据不会丢失

?3.接受参数使用this.$router后面就是搭配路由的名称就能获取到参数的值

?

32、router的meta有什么用?怎样给路由添加 active-class?

meta 的作用:在meta对象中可以设置一些状态,通常设置标题或是否需要缓存。

路由添加 active-class: 配置文件中linkActiveClass 默认的是router- link- active 可以直接在标签中使用active-class

?

33、vue2.x 的响应式原理?vue3.x响应式原理?

vue2.x 的响应式原理:

vue的响应式是通过 Object.defineProperty 对数据进行动持,并结合观察者模式实现。 vue 利用 object.detineProperty 创建一个 observe 来劫持监听所有的属性,把这些属性全部转为 getter 和 setter。Vue 中每个组件实例都会对应一个 watcher 实例,它会在组件渲染的过程中把使用过的数据属性通过 getter 收集为依赖。之后当依赖项的 setter 触发时,会通知 watcher,从而使它关联的组件重新渲染。

Object.defineProperty有哪些缺点?(无法检测到对象属性的新增或删除)

?1、Object.defineProperty只能劫持对象的属性,而 Proxy 是直接代理对象 由于 Object.defineProperty只能对属性进行劫持,需要遍历对象的每个属性,而 Proxy可以直接代理对象。

2、Object.defineProperty 对新增属性需要手动进行 observe,由于Object.defineProperty劫持的是对象的属性,所以新增属性时,需要重新遍历对象,对其新增属性再使用 Object.defineProperty 进行劫持,也正是因为这个原因,使用 vue 给 data 中的数组或对象新增属性时,需要使用vm.$set才能保证新增的属性也是响应式的

3、Proxy支持13种拦截操作,这是 defineProperty 所不具有的。

?4、新标准性能红利 Proxy 作为新标准,长远来看,JS引擎会继续优化 Proxy,但 getter 和 setter 基本不会再有针对性优化 5、Proxy 兼容性差目前并没有一个完整支持 Proxy 所有拦截方法的 Polyfill 方案

?

vue3.x响应式原理:

vue3.x改用 Proxy 替代 object.defineProperty。因为 Proxy 可以直接监听对象和数组的变化,并且有多达13种拦截方法。井且作为新标准将受到浏览器厂商重点持续的性能优化。

Poxy只会代理对象的第一层,那么vue3又是怎样处理这个问题的呢?

?判断当前 Reflect.get的返回值是否为 Object,如果是则再通过 reactive 方法做代理,这样就实现了深度观测。

监测数组的时候可能触发多次 get/set,那么如何防止触发多次呢? 我们可以判断key是否为当前被代理对象target自身属性,也可以判断旧值与新值是否相等,只有满足以上两个条件之一时,才有可能执行 trigger。

?

34、vuex 是什么?什么是“状态管理模式”?vuex 有哪些核心的属性?Vuex 和单纯的全局对象有什么区别?

官方:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension (opens new window),提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

?简单的说:Vuex 是 vue 框架中状态管理。

?

状态管理模式:

把组件的共享状态抽取出来,以一个全局单例模式管理。在这种模式下,我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为,这就是“状态管理模式”。 应用场景有:单页应用中,组件之间的数据状态。

应用实例:

1、购物车功能(数据的存储);

2、下单页面有选择优惠券按钮,点击进入优惠券页面,选择后返回到下单页,数据会绑定回来,显示已选择的优惠券;

3、登录状态(用户信息的存储);

4、音乐播放 等等

?

核心属性: state、mutations、getters、action 和 modules。

state:Vuex 使用单一状态树,即每个应用将仅仅包含一个store 实例,但单一状态树和模块化并不冲突。存放的数据状态,不可以直接修改里面的数据。

mutations:mutations定义的方法动态修改 Vuex 的 store 中的状态或数据。

getters:类似 vue 的计算属性,主要用来过滤一些数据。

?action:actions 可以理解为通过将 mutations 里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。view 层通过 store.dispath 来分发 action。

modules:项目特别复杂的时候,可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,方便管理。

?

state=> 基本数据(只用来读取的状态集中放在 store 中)

getters=> 从基本数据派生的数据

mutations=> 修改数据,同步(改变状态的方式是在 mutations 中)

actions=> 修改数据,异步(异步逻辑应该封装在 action 中)

modules=> 模块化Vuex

?

?

vuex和全局对象主要有两大区别:

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

?2、不能直接改变 store中的状态。改变 store中的状态的唯一途径就是显式地提交( commit)mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。

?

35、vue中proxy代理?

Vue 框架开发的时候,会遇到跨域的问题,可在config/index.js 里配置proxyTable内容,使用proxy代理。



proxyTable: {
'/api': {
target: 'http://xxx.com:8080', // 你要代理的域名和端口号,要加上http
changeOrigin: true, // 跨域
pathRewrite: {
'^/api': '/api' // 这里用‘/api’代替target里面的地址,组件中调用接口时直接用api代替 比如我要调用'http://xxx.com:8080/api/NEWS/getNews.json?page=1&pageSize=10
',直接写‘/api/NEWS/getNews.json?page=1&pageSize=10’即可
}
}

然后在axios请求中:
getNewsList() {
const url='/api/NEWS/getNews.json?page=1&pageSize=10'
axios.get(url)
.then((res)=> {
res=res.data
if (res.state) {
this.news=res.result
}
})
}


?

?

36、vue中对象更改检测的注意事项

由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除;

对于已经创建的实例,Vue 不能动态添加根级别的响应式属性;但是,可以使用 Vue.set(object, key, value)方法向嵌套对象添加响应式属性; 还可以使用 vm.$set实例方法添加,它只是全局Vue.set 的别名;

有时可能需要为已有对象赋予多个新属性,比如使用 Object.assign()或 _.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。

?

37、Vue.js 全局运行机制

Vue 常见面试题_缓存

?

流程分析:

1、初始化以及挂载init, mount

2、在进行模板编译compile,将template编译为渲染函数render function

3、执行render function生成Virtual DOM, render function=> VNode tree

4、再进行响应式依赖收集,render function=> getter, setter=> Watcher.update=> patch。以及使用队列进行异步更新的策略。

?5、通过diff算法后进行patch更新视图

?

38、vue 如何优化首屏加载速度?vue 弹窗后如何禁止滚动条滚动?

vue优化首屏加载速度:

(1)按需加载组件,不一次性加载所有组件

(2)减少打包js,如果打包后的js文件过大,会阻塞加载。

(3)关闭sourcemap,开启压缩代码 vue.config.js文件中配置:productionSourceMap: false,

(4)加个好看的loading效果

?

vue弹窗后禁止滚动条滚动:



methods : {
//禁止滚动
stop(){
var mo=function(e){e.preventDefault();};
document.body.style.overflow='hidden';
document.addEventListener("touchmove",mo,false);//禁止页面滑动
},

move(){
var mo=function(e){e.preventDefault();};
document.body.style.overflow='';//出现滚动条
document.removeEventListener("touchmove",mo,false);
}


?

?

39、vue 开发命令 npm run dev 输入后的执行过程

(1)npm run dev是执行配置在package.json中的脚本

(2)调用了webpack配置文件

(3)配置文件中调用了main.js

(4)main.js用到了一个html元素#app,引用路由等开始vue的模板编译

?

40、devDependencies 和 dependencies 的区别

(1)devDependencies:用于本地开发,打包时生产环境不会打包这些依赖。

(2)dependencies:开发环境能用,生产环境也能用。生产环境会被打包。

?

41、依赖版本 ~ 和 ^ 的区别

(1)~:会匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但是不包括1.3.0

(2)^:会匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0

?42、Vue项目性能优化

编码阶段:

代码减少对服务器请求次数,减小对服务器请求代码的体积

尽量减少data中的数据,data中的数据都会增加 getter 和 setter,会收集对应的 watcher

?v-if 和v-for 不能连用、在更多的情况下,使用v-if替代 v-show

?如果需要使用 v-for 给每项元素绑定事件时使用事件代理,key保证唯一

?SPA页面采用 keep-alive 缓存组件

使用路由懒加载、异步组件、图片懒加载、css精灵图字体图标

?防抖、节流、第三方模块按需导入、长列表滚动到可视区域动态加载、全局事件解绑

SEO优化: 预渲染、服务端染SSR

打包优化: 压缩代码、使用cdn加载第三方模块、多线程打包 happypack、splitChunks抽离公共文件、sourceMap优化、Tree Shaking/Scope Hoisting

用户体验: 骨架屏、PWA、使用缓存(客户端缓存、服务端缓存)优化、服务端开启gzip压缩

?webpack

?

封装axios 请求超时时间, baseurl设置, 请求头设置 (token 的设置) 错误的处理 (未登录) token过期 404 (算也不算优化,这都是正常开发的功能,如果说这样可以优化结构复用也合理)

参考这篇文章:?https://www.cnblogs.com/chaoyuehedy/p/9931146.html

?

43、vue3.0 相对于 vue2.x 有哪些变化?

监测机制的改变( Object.defineProperty-> Proxy)、模板、对象式的组件声明方式(class)、使用 ts

其它方面的更改:支持自定义渲染器、支持 Fragment(多个根节点)和 Protal(在dom其他部分渲染组建内容)组件、基于 treeshaking优化,提供了更多的内置功能

?

44、vue2.0 中如何检测数组变化?

Vue的 Observer对数组做了单独的处理,对数组的方法进行编译,并赋值给数组属性的 proto 属性上,因为原型链的机制,找到对应的方法就不会继续往上找了。编译方法中会对一些会增加索引的方法(push, unshift, splice)进行手动 observe。

?

45、插件

插件:插件通常用来为 Vue 添加全局功能。插件的功能范围没有严格的限制;(插件按照vue格式编写的js代码,可以通过use注册,然后使用)

一般有下面几种:

?添加全局方法或者 property。如:vue-custom-element

添加全局资源:指令/过滤器/过渡等。如 vue-touch

通过全局混入来添加一些组件选项。如 vue-router

?添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现。

一个库,提供自己的 API,同时提供上面提到的一个或多个功能。如 vue-router

怎么注册插件: (看原稿)

?使用全局方法Vue.use()

Vue.use( MyPlugin )



com.js中
import com from 'https://blog.51cto.com/u_15057824/xx.vue'
  let test={}
  test.install=function(Vue,options){
  Vue.component(panel.name, panel) // 注册全局组件
}
export default com

main.js中
import com from 'https://blog.51cto.com/u_15057824/com.js'
Vue.use(com)

所有vue文件中都可以调用组件<com></com>


?

?

vue 如何兼容 IE

vue本身不支持旧版本 ie ,而旧版 js 也不支持属性监听,所以 vue 不支持兼容 ie。

如果要兼容低版本,建议使用 jquery 系列技术

react 如何兼容 ie ?加上polyfill可以兼容IE8。

?

Vue项目中如何区分开发环境和生产环境

用webpack定义两个配置文件,分别代表开发环境和生产环境即可

区分环境的问题,就是写两个配置文件运行的时候,用不同的文件就行了

?

如何让 css 只在当前组件起作用? 在style标签中写入scoped即可

vue.js 的两个核心是什么? 数据驱动、组件系统

$set 方法有什么用?有什么特点?添加响应式的属性

?

?

?

暂时到这里,后续有的话在再继续补进去!有问题的话麻烦指出来,好让我修改!

?


文字格式和图片示例

注册有任何问题请添加 微信:MVIP619 拉你进入群

弹窗与图片大小一致 文章转载注明

分享:

扫一扫在手机阅读、分享本文

发表评论
热门文章
  • 以太坊区块链浏览器的搭建

    以太坊区块链浏览器的搭建
    环境;Ubuntu 首先需要下载git 参考链接:?http://www.360bchain.com/article/156.html??Environment; Ubuntu first needs to download git reference link: ˂a rel="noformlow" href="http://www.360bchai.com/article/156.html"? http://www.360bchai.com/article/156.htm...
  • 百度元宇宙希壤app官方下载

    百度元宇宙希壤app官方下载
    希壤元宇宙是一款非常好玩的休闲手游,这款游戏采用了元宇宙的游戏概念,超级自由的游戏玩法,在这里没有什么标准限定,你可以自由的在这里进行着一切你想做的事情,游戏比较的休闲和放松,没有什么操作难度,感兴趣的小伙伴们可以来007游戏网下载这款非常有趣的希壤元宇宙吧!˂a href=http://m.yx007.com/key/xxsy" target="_blank" , a game that uses the concept of meta-cosm, super-free p...
  • 【CoinCentral 合作內容】加密貨幣 Decred 正式推出 2018 發展路段線圖

    【CoinCentral 合作內容】加密貨幣 Decred 正式推出 2018 發展路段線圖
    早些時候,加密貨幣Decred發表了一篇博客文章,概述了他們2018年的正式發展路線圖。Earlier, encrypt currency Decred published a blog article outlining their official road map for development in 2018.在這個路線圖中,團隊在為他們制定營銷宣傳之前,明確地表明他們於建立和發布可交付物品的成果,同時將他們的營銷集中在項目的核心組成部分。Decred團隊正在研究一些...
  • 跨接在两个网络间的语音记录仪设计

    跨接在两个网络间的语音记录仪设计
      摘  要: 设计了语音记录仪。该语音记录仪桥接在通信设备之间,同时提供3种桥接接口:以太网接口,支持在IP通信方式下的各通话组的直通及录音功能;二线接口,支持模拟二线方式下的直通及录音功能;音频接口,支持模拟音频方式下的直通及录音功能。同时话音记录仪提供FTP服务器,可以通过局域网对语音记录仪保存的语音文件进行下载和管理。此外,该设备支持语音回放功能。 extracts & nbsp; to : The voice record...
  • 元宇宙概念股有哪些 元宇宙概念股一览表

    元宇宙概念股有哪些 元宇宙概念股一览表
    元宇宙概念股排行精选 元宇宙概念股一览表(2022/11/08),下文就随小蔡来简单的了解一下吧。The contours of the meta-cosmology unit are in the list of the meta-cosmological concept units (2022/11/08), so let's get to the bottom of this with Little Choi. 元宇宙概念股龙头有:The contou...
标签列表