1、虚拟DOM中key的作用:
key是虚拟DOM对象的标识,当状态中的数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】,随后Vue进行【新虚拟DOM】的差异比较,比较规则如下:
2、key的对比规则:
1、旧虚拟DOM中找到了与新虚拟DOM相同的key:
2、旧虚拟DOM中未找到与新虚拟DOM相同的key
3、用index作为key可能会引发的问题:
1、若对数据进行:逆序添加、逆序删除等破坏顺序操作:会产生没有必要的真实DOM更新 ===> 界面效果没问底,但效率低
2、如果结构中还包含输入类的DOM:会产生错误DOM更新 ===> 界面有问题
4、开发中如何选择key?
1、最好使用每条数据的唯一标识作为key,比如id、手机号、身份证号、学号等唯一值
2、如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,使用index作为key是没有问题的
5、Vue 组件中 data 为什么必须是函数?
保证组件的独立性和可复用性,data是一个函数,组件实例化的时候将会调用这个函数,返回一个对象,计算机会给这个对象分配一个内存地址,你实例化几次,就分配几个内存地址,他们的地址都不一样,所以每个组件中的数据不会相互干扰,改变其中一个组件的状态,其它组件不变。
6、vuex的State特性是?
state属性是Vuex中用于存放组件之间共享的数据;也就是说,我们把一些组件之间共享的状态主要存放在state属性中;它采用的是单一状态树——用一个对象就包含了全部的应用层级状态。这也意味着,每个应用将仅仅包含一个 store 实例。单一状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态的快照。
7、Vue声明组件的state是data法,那为什么data是通过个function来返回个对象,不是直接写个对象呢?
从语法上说,如果不function返回就会出现语法错误导致编译不通过。从原理上的话,概就是组件可以被多次创建,如果不使function就会使所有调该组件的页公同个数据域,这样就失去了组件的概念了
8、介绍一下Vue的响应式系统
1、任何一个 Vue Component 都有一个与之对应的 Watcher 实例
2、Vue 的 data 上的属性会被添加 getter 和 setter 属性
3、当 Vue Component render 函数被执行的时候, data 上会被 触碰(touch), 即被读, getter 方法会被调用, 此时 Vue 会去记录此 Vue component 所依赖的所有 data。(这一过程被称为依赖收集)
4、data 被改动时(主要是用户操作), 即被写, setter 方法会被调用, 此时 Vue 会去通知所有依赖于此 data 的组件去调用他们的 render 函数进行更新
9、computed与watch的区别
10、介绍一下Vue的生命周期
每一个vue实例从创建到销毁的过程,就是这个vue实例的生命周期。在这个过程中,他经历了从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程。
11、vue生命周期的作用是什么
Vue生命周期中有多个事件钩子,让我们在控制整个Vue实例过程时更容易形成好的逻辑。
12、第一次页面加载会触发哪几个钩子
第一次页面加载时会触发 beforeCreate, created, beforeMount, mounted 这几个钩子
13、DOM 渲染在 哪个周期中就已经完成
DOM 渲染在 mounted 中就已经完成了。
14、简单描述每个周期具体适合哪些场景
15、组件之间是怎么通信的
组件之间通信主要分为三种:父子传参,子父传参,兄弟传参。
16、Vue.cli中怎样使用自定义的组件?
17、Vue如何实现按需加载配合webpack设置
18、scss是什么?在Vue.cli中的安装使用步骤是?有哪几大特性?
css
的预编译语言。
使用步骤:
css-loader
、node-loader
、sass-loader
等加载器模块;build
目录找到webpack.base.config.js
,在extends
属性中加一个拓展.scss
;module
属性;style
标签加上lang
属性 ,例如:lang=”scss”
;特性:
可以用变量,例如($变量名称=值
);
可以用混合器;
可以嵌套;
19、如何让 CSS 只在当前组件中起作用?
将当前组件的修改为
。
20、聊聊你对Vue.js的template编译的理解?
简之,就是先转化成AST树,再得到的render函数返回VNode(Vue的虚拟DOM节点)
详情步骤:
先,通过compile编译器把template编译成AST语法树(abstract syntax tree 即 源代码的抽象语法结构的树状表现形式),compile是createCompiler的返回值,createCompiler是以创建编译器的。另外compile还负责合并option。
然后,AST会经过generate(将AST语法树转化成render funtion字符串的过程)得到render函数,render的返回值是VNode,VNode是Vue的虚拟DOM节点,有(标签名、节点、本等等)
21、Vue 路由跳转的几种方式
22、Vue的路由实现:hash模式和history模式
hash 模式 (默认)
history 模式
23、Vue与Angular以及React的区别?
基本概念
三者比较
相同点
不同点
24、vue-router中导航守卫有哪些?
全局前置守卫、路由独享守卫、组件内守卫
25、 为什么使用Vue?
26、说出至少 4 种 vue 指令和它的用法?
27、v-if和v-show的区别
28、为什么避免 v-if 和 v-for 一起用?
当 Vue
处理指令时,v-for
比 v-if
具有更高的优先级,通过v-if
移动到容器元素,不会再重复遍历列表中的每个值。取而代之的是,只检查它一次,且不会在 v-if
为否的时候运算 v-for
。
29、什么是 MVVM ?
MVVM
是Model-View-ViewModel
的缩写。MVVM
是一种设计思想。Model
层代表数据模型,也可以在Model
中定义数据修改和操作的业务逻辑;View
代表UI 组件
,它负责将数据模型转化成UI
展现出来,ViewModel
是一个同步View
和 Model
的对象。MVVM
架构下,View
和 Model
之间并没有直接的联系,而是通过ViewModel
进行交互,Model
和 ViewModel
之间的交互是双向的, 因此View
数据的变化会同步到Model
中,而Model
数据的变化也会立即反应到View
上。ViewModel
通过双向数据绑定把 View
层和 Model
层连接起来,而View
和 Model
之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM
, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM
来统一管理。20、vuex
是什么?怎么使用?哪种功能场景使用它?
vue
框架中状态管理。在main.js
引入store
注入。新建一个目录store
。场景有:单页应用中,组件之间的状态,音乐播放、登录状态、加入购物车等。
21、vuex
有哪几种属性?
有五种,分别是 State
、 Getter
、Mutation
、Action
、 Module
。
22、vuex
的State
特性
Vuex
就是一个仓库,仓库里面放了很多对象。其中state
就是数据源存放地,对应于一般Vue
对象里面的data
。
state
里面存放的数据是响应式的,Vue
组件从store
中读取数据,若是store
中的数据发生改变,依赖这个数据的组件也会发生更新。
通过mapState
把全局 state
和 getters
映射到当前组件的 computed
计算属性中。
23、vuex
的Getter
特性
getters
可以对State
进行计算操作,它就是Store
的计算属性。
虽然在组件内也可以做计算属性,但是getters
可以在多组件之间复用。
如果一个状态只在一个组件内使用,可以不用getters
。
24、vuex
的Mutation
特性
Action
类似于 mutation
,不同在于:Action
提交的是 mutation
,而不是直接变更状态;Action
可以包含任意异步操作。
25、不用Vuex
会带来什么问题?
可维护性会下降,想修改数据要维护三个地方;
可读性会下降,因为一个组件里的数据,根本就看不出来是从哪来的;
增加耦合,大量的上传派发,会让耦合性大大增加,Vue
用Component
本意就是为了减少耦合,现在这么用,和组件化的初衷相背。
26、keep-alive 的作用是什么
包裹动态组件时,会缓存不活动的组件实例,主要用于保留组件状态或避免重新渲染。
27、vue-loader 是什么?用途有哪些?
解析.vue
文件的一个加载器。
用途:js 可以写es6
、style
样式可以scss
或less
、template
可以加jade
等。
28、如何获取dom
在我们的vue项中,难免会因为引第三库需要操作DOM标签,vue为我们提供了ref属性。 ref 被来给元素或组件注册引信息。引信息将会注册在组件的 $refs 对象上。如果在普通的 DOM 元素上使,引指向的就是 DOM 元素;如果在组件上,引就指向组件实例
29、iframe的优缺点?
iframe也称作嵌式框架,嵌式框架和框架页类似,它可以把个页的框架和内容嵌在现有的页中。
优点:
缺点:
30、请说出vue.cli项中src录每个件夹和件的法?
assets件夹是放静态资源;components是放组件;router是定义路由相关的配置;view视图;app.vue是个应主组件;main.js是件
31、vue常的修饰符
32、定义指令(v-check、v-focus)的法有哪些?它有哪些钩函数?还有哪些钩函数参数?
33、vue的两个核点
数据驱动,组件系统
34、delete和Vue.delete删除数组的区别
35、Vue-router跳转和location.href有什么区别
使location.href=/url 来跳转,简单便,但是刷新了页;使history.pushState(/url),刷新页,静态跳转;引进router,然后使router.push(/url)来跳转,使了diff算法,实现了按需加载,减少了dom的消耗。其实使router跳转和使history.pushState()没什么差别,因为vue-router就是了history.pushState(),尤其是在history模式下。
36、RouterLink在IE和Firefox中不起作(路由不跳转)的问题
法
只a标签,不使button标签
法
使button标签和Router.navigate法
37、请说下封装 vue 组件的过程?
先,组件可以提升整个项的开发效率。能够把页抽象成多个相对独的模块,解决了我们传统项开发:效率低、难维护、复性等问题。
然后,使Vue.extend法创建个组件,然后使Vue.component法注册组件。组件需要数据,可以在props中接受定义。组件修改好数据后,想把数据传递给组件。可以采emit法。
38、params和query的区别
法:query要path来引,params要name来引,接收参数都是类似的,分别是this.
r
o
u
t
e
r
.
q
u
e
r
y
.
n
a
m
e
和
t
h
i
s
.
router.query.name 和 this.
router.query.name和this.router.params.name。url地址显:query更加类似于我们ajax中get传参,params则类似于post,说的再简单点,前者在浏览器地址栏中显参数,后者则不显
注意点:query刷新不会丢失query的数据params刷新会丢失params的数据
39、vue mock数据
在项中尝试了mockjs,mock数据,实现前后端分离开发。
关于mockjs,官描述的是
总结:在后端接没有开发完成之前,前端可以已有的接档,在真实的请求上拦截ajax,并根据mockjs的mock数据的规则,模拟真实接返回的数据,并将随机的模拟数据返回参与相应的数据交互处理,这样真正实现了前后台的分离开发。
与以往的模拟的假数据不同,mockjs可以带给我们的是:在后台接未开发完成之前模拟数据,并返回,完成前台的交互;在后台数据完成之后,你所做的只是去掉mockjs:停拦截真实的ajax,仅此已。
40、vue初始化页闪动问题
使vue开发时,在vue初始化之前,由于div是不会vue管的,所以我们写的代码在还没有解析的情况下会容易出现花屏现象,看到类似于{{message}}的字样,虽然般情况下这个时间很短暂,但是我们还是有必要解决这个问题的。
先:在css加上[v-cloak]{display:none;},如果没有彻底解决问题,则在根元素加上style=“display:none;” :style=“{display:block}”
41、vue更新数组时触发视图更新的法
push();pop();shift();unshift();splice();sort();reverse()
42、vue常的UI组件库
Mint UI,element,VUX
43、mint-ui是什么?怎么使?说出少三个组件使法?
基于vue的前端组件库。
npm安装,然后import样式和js,vue.use(mintUi)全局引。在单个组件局部引:import {Toast} from ‘mint-ui’。
44、Vuerouter-link在电脑上有,在安卓上没反应怎么解决?
Vue路由在Android机上有问题,babel问题,安装babel polypill插件解决
45、Vue2中注册在router-link上事件效解决法
使@click.native。原因:router-link会阻click事件,.native指直接监听个原事件。