1,生命周期
从创建到渲染的过程,不仅仅问8个函数
四个阶段
组件创建时:creating:
模板渲染时:mounting
数据更新时:updating
组件卸载时:destroying
1.1 图示
1.2 生命周期钩子函数
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:销毁后,在实例销毁之后调用。调用后,所有的 事件监听器会被移除,所有的子实例也会被销毁。该钩子在 服务器端渲染期间不被调用。
1.3 回答的相关问题
1.什么是vue生命周期?
答: Vue 实例从创建到销毁的过程,就是生命周期。从开始 创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲 染、销毁等一系列过程,称之为 Vue 的生命周期。
2.vue生命周期的作用是什么?
答:它的生命周期中有多个事件钩子,让我们在控制整个Vue 实例的过程时更容易形成好的逻辑。
3.vue生命周期总共有几个阶段?
答:它可以总共分为8个阶段:创建前/后, 载入前/后,更新前/ 后,销毁前/销毁后。
4.第一次页面加载会触发哪几个钩子?
答:会触发 下面这几个beforeCreate, created, beforeMount, mounted 。
5.DOM 渲染在 哪个周期中就已经完成?
答:DOM 渲染在 mounted 中就已经完成了。
-
created阶段的ajax请求与mounted请求的区别: 前者页面视图未出现,如果请求信息过多,页面会长时间处于白屏状态
-
mounted 不会承诺所有的子组件也都一起被挂载。如果 你希望等到整个视图都渲染
2,组件封装
封装组件:主要是为了解耦,具备高性能、低耦合,在通用 组件的时候要留一个插槽
为什么data必须是一个函数:主要是防止组件与组件之前 声 明的变量相互影响
3,axios
3.1 axios是什么?
axios是基于promise的用于浏览器和node.js的http客户 端,主要作用就是向后退发送请求。
-
支持promise
-
提供并发方法:同时请求两个接口
-
提供了拦截器
-
提供支持CSRF(跨站请求伪造)
4,vuex
4.1 vuex是什么?
vuex为vue构建一个状态集管理,主要是为了解决组件 状态共享的问题,强调的是集中式管理,便于便于维护,便 于解耦,适用于大型项目
state
Vuex 使用单一状态树,即每个应用将仅仅包含一个store 实例,但单一状态树和模块化并不冲突。存放的数据状态, 不可以直接修改里面的数据。
mutations
mutations定义的方法动态修改Vuex 的 store 中的状态 或数据。
getters
类似vue的计算属性,主要用来过滤一些数据。 action
actions可以理解为通过将mutations里面处里数据的方 法变成可异步的处理数据的方法,简单的说就是异步操作数 据。view 层通过 store.dispath 来分发 action。
modules
项目特别复杂的时候,可以让每一个模块拥有自己的 state、mutation、action、getters,使得结构非常清晰,方 便管理。
4.2 怎么使用?
vuex包含5个模块:
state:存放数据的位置
mutations:变更状态
getters:动态变更数据
actions:actions从动作层调用mutations去更改状态
modules:拆分仓库
4.3 哪种场景使用它?
大型应用
5 vue指令
4个vue中的指令和它的用法
v-if:条件渲染指令,代表存在消耗
v-bind:用来绑定属性,简写(:)
v-on:监听指令,简写(@)
v-for:循环指令
6 导航钩子
vue-router 提供的导航守卫主要用来通过跳转或取消的 方式守卫导航。
6.1 导航钩子有哪些?
导航钩子就是路由的生命周期函数,主要包括全局和局部。
6.1.1 全局钩子函数
beforeEach:路由切换开始调用,类似路由守卫
对于登录的设置案例:
afterEach:路由切换离开时调用
6.1.2 局部的钩子函数
局部到单个路由:beforeEnter
组件的钩子函数:
- beforeRouterEnter
- beforeRouterUpdate
- beforeRouterLeave
7 v-model是什么?Vue中标签怎么绑定事件?
Vue利用v-model进行表单数据双向绑定,做了两个操作
- v-bind绑定一个value的属性
- v-on帮当前的元素绑定到一个事件上
8 如何使用Vue构建项目
1,使用Vue-cli脚手架构建项目
2,直接引用vue.js进行项目的构建
9 swiper插件
swiper插件从后台获取数据没有问题,css代码也没有问 题,但是图片没有动,怎么解决?
swiper提前初始化,这个时候数据还没有完全出来。 解决方法,主要有两个方向,一个从swiper,一个从 vue方面
9.1 vue方面
vue方面:vue中专门提供了一个nextTick(),用于解决dom 的先后执行问题
当数据加载完毕后,才执行swiper
9.2 swiper方面
10,路由懒加载
延迟加载、当需要的时候再加载,有效的分担首页的加载时 间
11 Vue-loader
vue-loader就是一个加载器,把Vue编译javaScript的模块, 方便浏览器读文件。
11.1 为什么要转译vue组件
- 动态的渲染一些数据
- 对三个标签(template、script、style)都做了优化script中可以直接使用es6 style 也默认使用sass,
- 提供作用域的选择
- 开发阶段提供热加载
12 插槽
vue插槽:slot是一个占位
about.vue
12.1 具名插槽
<div slot="header"></div>
12.2 默认插槽
默认插槽就是匿名插槽
12.3 作用域插槽
<div slot="footer" slot-scope="aaa"> {{aaa}} </div>
13 对vue虚拟DOM的理解(重点)
13.1 什么是虚拟dom?
使用js对象形式去添加dom元素,本质上是优化了diff算 法,先在js上面批量更改,然后批量在真实节点上面修改。采 用了新旧节点的对比,获取差异的dom,一次性更新到真实 的dom上,从而
13.2 缺陷?
一般是同级或者兄弟层级的修改,尽量不要跨层级修改 dom,设置key,可以最大的理由节点
14 MVVM模式
14.1 mvc
- 控制器:Controller
- 视图:View
- 模型:Model
14.2 MVVM(重看)
- Model:代表数据模型,也可以在Model中定义数据修改 和操作的业务逻辑。
- View:代表UI 组件,它负责将数据模型转化成UI 展现出来。
- ViewModel:监听模型数据的改变和控制视图行为、处理用户交互,简单理解就是一个同步View 和 Model的对象,连接Model和View。 【模型】指的是后端传递的数据。【视图】指的是所看到的 页面。【视图模型】mvvm模式的核心,它是连接view和 model的桥梁。它有两个方向:一是将【模型】转化成【视 图】,即将后端传递的数据转化成所看到的页面。实现的方 式是:数据绑定。二是将【视图】转化成【模型】,即将所 看到的页面转化成后端的数据。实现的方式是:DOM 事件监 听。这两个方向都实现的,我们称之为数据的双向绑定。
在MVVM的框架下视图和模型是不能直接通信的。它们 通过ViewModel来通信,ViewModel通常要实现一个 observer观察者,当数据发生变化,ViewModel能够监听到 数据的这种变化,然后通知到对应的视图做自动更新,而当 用户操作视图,ViewModel也能监听到视图的变化,然后通 知数据做改动,这实际上就实现了数据的双向绑定。并且 MVVM中的View 和 ViewModel可以互相通信。
15 keep-alive
15.1 什么是keep-alive
它能让不活动的组件“活着”,从A页面跳转到B页面,一 般从B页面返回A页面,A页面会重新加载,但是keep-alive会 保存到内存里面。
它提供了include与exclude两个属性,允许组件有条件的缓 存
15.2 实现的原理
在created时候,将需要缓存的vnode节点放到cache中,在 render的时候根据name取出
15.3 使用
16 Vue组件间的参数传递
16.1 父组件与子组件传值
- 父组件传给子组件:子组件通过props方法接受数据;
- 子组件传给父组件:$emit方法传递参数
16.2 非父子组件间的数据传递,兄弟组件传值
eventBus,就是创建一个事件中心,相当于中转站,可以用 它来传递事件和接收事件。项目比较小时,用这个比较合 适
17,vue-cli如何新增自定义指令
17.1 创建局部指令
17.2 全局指令
<div id="app"> <div v-dir1></div> <div v-dir2></div> </div>
18 自定义过滤器
html代码:
JS代码:
全局定义过滤器
过滤器接收表达式的值 (msg) 作为第一个参数。capitalize 过
滤器将会收到 msg的值作为第一个参数。
19 css只在当前组件起作用
答:在style标签中写入scoped即可
20 v-if 和 v-show 区别
答:v-if按照条件是否渲染,v-show是display的block或 none;
21 和router的区别
答:是路由信息对象,包括,,,,,,等路由信息参数。 而router是“路由实例”对象包括了路由的跳转方法,钩子函数 等。
22 vue.js的两个核心是什么?
两个核心分别是数据驱动和组件系统
22.1 数据驱动
当数据发生变化的时候,用户界面发生相应的变化,开 发者不需要手动的去修改dom。
22.2 组件系统
vue中的组件分为两种,全局组件和局部组件。
23 vue几种常用的指令
答:v-for 、 v-if 、v-bind、v-on、v-show、v-else
24 vue常用的修饰符?
- .prevent: 提交事件不再重载页面;
- .stop: 阻止单击事件冒泡;
- .self: 当事件发生在该元素本身而不是子元素的时候会触发;
- .capture: 事件侦听,事件发生的时候会调用
25 v-on 可以绑定多个方法吗?
答:可以
26 vue中 key 值的作用?
答:当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它 默认用“就地复用”策略。如果数据项的顺序被改变,Vue 将不 会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处 每个元素,并且确保它在特定索引下显示已被渲染过的每个 元素。key的作用主要是为了高效的更新虚拟DOM。
27 什么是vue的计算属性?
答:在模板中放入太多的逻辑会让模板过重且难以维护,在 需要对数据进行复杂处理,且可能多次使用的情况下,尽量 采取计算属性的方式。好处:①使得数据处理结构清晰;② 依赖于数据,数据更新,处理结果自动更新;③计算属性内 部this指向vm实例;④在template调用时,直接写计算属性 名即可;⑤常用的是getter方法,获取数据,也可以使用set 方法改变数据;⑥相较于methods,不管依赖的数据变不 变,methods都会重新计算,但是依赖数据不变的时候 computed从缓存中获取,不会重新计算
28 vue等单页面应用及其优缺点
答:优点:Vue 的目标是通过尽可能简单的 API 实现响应的 数据绑定和组合的视图组件,核心是一个响应的数据绑定系 统。MVVM、数据驱动、组件化、轻量、简洁、高效、快 速、模块友好。
缺点:不支持低版本的浏览器,最低只支持到IE9;不利于 SEO的优化(如果要支持SEO,建议通过服务端来进行渲染组 件);第一次加载首页耗时相对长一些;不可以使用浏览器 的导航按钮需要自行实现前进、后退。
29 怎么定义 vue-router的动态路由? 怎么获取传过来的值
答:在 router 目录下的 index.js 文件中,对 path 属性加上 /:id,使用 router 对象的 params.id 获取。